<?php
|
namespace JVBase\blocks;
|
|
use JVBase\managers\CacheManager;
|
use JVBase\forms\TaxonomySelector;
|
use JVBase\meta\MetaManager;
|
use JVBase\utility\Features;
|
use WP_Block;
|
use WP_Query;
|
|
if (!defined('ABSPATH')) {
|
exit; // Exit if accessed directly
|
}
|
|
class TimelineBlock
|
{
|
protected CacheManager $cache;
|
protected string $config;
|
protected string $type;
|
protected string $path = JVB_DIR . '/build/timeline';
|
protected string $image;
|
protected string $header;
|
protected int $parentID;
|
protected int $total;
|
protected array $children = [];
|
protected string $content;
|
protected string $headerExtra;
|
protected string $detailsTitle;
|
protected array $details;
|
protected array|false $sections = false;
|
|
public function __construct()
|
{
|
$this->cache = CacheManager::for('timelines', WEEK_IN_SECONDS)->connectTo('post', 'timeline');
|
add_action('init', [ $this, 'registerBlock' ]);
|
add_action('wp_footer', 'jvbRenderGallery');
|
}
|
|
public function registerBlock()
|
{
|
register_block_type($this->path, [
|
'render_callback' => [ $this, 'render' ]
|
]);
|
}
|
|
public function render(array $attributes, string $content, WP_Block $block)
|
{
|
global $post;
|
if (!$post || !Features::forContent(jvbNoBase($post->post_type))->has('is_timeline') ) {
|
return '';
|
}
|
$this->parentID = $post->ID;
|
$cache = $this->cache->get($this->parentID);
|
if ($cache) {
|
return $cache;
|
}
|
$this->content = jvbNoBase($post->post_type);
|
|
$this->children = get_children([
|
'post_parent' => $this->parentID,
|
'post_status' => 'publish',
|
'orderby' => 'date',
|
'order' => 'ASC',
|
'fields' => 'ids'
|
]);
|
$this->total = count($this->children);
|
|
ob_start();
|
$this->renderBlock();
|
$content = ob_get_clean();
|
$this->cache->set($this->parentID, $content);
|
return $content;
|
}
|
|
protected function renderBlock():void
|
{
|
$this->renderHeader();
|
$this->renderTimeline();
|
}
|
|
protected function renderHeader():void
|
{
|
$title = get_the_title();
|
?>
|
<header id="top">
|
<h1><small>Before and After Laser Tattoo Removal:</small><?=$title?></h1>
|
<ul class="timeline terms">
|
<?php
|
$tax = ['goal', 'number', 'body-part', 'style', 'skin-type', 'age'];
|
|
foreach ($tax as $slug) {
|
$config = JVB_TAXONOMY[$slug];
|
$taxSlug = jvbCheckBase($slug);
|
$terms = get_the_terms($this->parentID, $taxSlug);
|
if ($terms && !is_wp_error($terms)) {
|
$many = count($terms) > 1;
|
?>
|
<li class="<?=$slug?>">
|
<?=jvbIcon($config['icon']??jvbDefaultIcon())?>
|
|
<?php
|
if ($many) { echo '<ul>'; }
|
$open = ($many) ? '<li>' : '';
|
$close = ($many) ? '</li>' : '';
|
foreach ($terms as $term) {
|
$link = get_term_link($term->term_id, $taxSlug);
|
?>
|
|
<?= $open ?>
|
<a href="<?=$link?>" rel="tag"><?=$term->name?></a>
|
<?= $close ?>
|
<?php }
|
if ($many) { echo '</ul>'; }
|
?>
|
</li>
|
<?php
|
}
|
}
|
?>
|
</ul>
|
</header>
|
<section id="at-a-glance" class="row nowrap">
|
<div class="before">
|
<h3>Before</h3>
|
<?= jvbFormatImage(get_post_thumbnail_id($this->parentID), 'tiny', 'large', false) ?>
|
</div>
|
<div class="after">
|
<h3>After <?=$this->total?> Treatment<?= $this->total > 1 ? 's' : '' ?></h3>
|
<?= jvbFormatImage(get_post_thumbnail_id($this->children[count($this->children)-1]), 'tiny', 'large', false) ?>
|
</div>
|
</section>
|
<?php
|
}
|
protected function renderTimeline():void
|
{
|
$all = $this->children;
|
array_unshift($all, $this->parentID);
|
$uniqueFields = JVB()->routes('content')->getTimelineUniqueFields($this->content);
|
foreach ($all as $i => $ID) {
|
$meta = new MetaManager($ID, 'post');
|
$fields = $meta->getAll($uniqueFields);
|
|
$plural = ($i>1) ? 's': '';
|
$title = ($i === 0) ? 'Before Laser Tattoo Removal' : 'After '.$i.' Treatment'.$plural;
|
$title = ($i > 0 && !str_contains('Treatment', $fields['post_title'])) ? $fields['post_title'] : $title;
|
?>
|
<section id="<?= $i === 0 ? 'before-treatment' : 'treatment-'.$i ?>" class="timeline-point row a-start nowrap">
|
<?php
|
if (array_key_exists('post_thumbnail', $fields) && is_int($fields['post_thumbnail'])) {
|
echo jvbFormatImage($fields['post_thumbnail']);
|
}
|
?>
|
<div class="info">
|
<header>
|
<h2><?=jvbIcon(jvbLogoIcon())?><?= $title?></h2>
|
<?= array_key_exists('post_date', $fields) && $fields['date'] !== '' ? '<time>'.date('F Y', strtotime($fields['post_date'])).'</time>' : '' ?>
|
<?= array_key_exists('timeline', $fields) && $fields['timeline'] !== '' ? $this->outputTimelineTax($ID) : '' ?>
|
<?= array_key_exists('post_content', $fields) && $fields['post_content'] !== '' ? '<div class="content">'.wptexturize(wp_kses_post( wpautop($fields['post_content']))).'</div>' : '' ?>
|
</header>
|
</div>
|
</section>
|
<?php
|
}
|
}
|
|
protected function outputTimelineTax(int $ID):string
|
{
|
$timeline = get_the_terms($ID, BASE.'timeline');
|
if (!$timeline || is_wp_error($timeline)) {
|
return '';
|
}
|
$out = '<ul class="term-list">';
|
foreach ($timeline as $term) {
|
$link = get_term_link($term->term_id, BASE.'timeline');
|
$out .= '<li><a href="'.$link.'" rel="tag" title="See more progressions at this timeline">'.jvbIcon(JVB_TAXONOMY['timeline']['icon']??'hourglass').$term->name.' Later</a></li>';
|
}
|
$out .='</ul>';
|
return $out;
|
}
|
}
|