<?php
|
namespace JVBase\blocks;
|
|
use JVBase\managers\Cache;
|
use JVBase\meta\Meta;
|
use JVBase\utility\Features;
|
use WP_Block;
|
|
if (!defined('ABSPATH')) {
|
exit; // Exit if accessed directly
|
}
|
|
class TimelineBlock
|
{
|
protected Cache $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 = Cache::for('timelines', WEEK_IN_SECONDS)->connect('post');
|
if (JVB_TESTING){
|
$this->cache->flush();
|
}
|
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 get_field(string $fieldName, array $fields) {
|
if (array_key_exists($fieldName, $fields)) {
|
return $fields[$fieldName];
|
}
|
return '';
|
}
|
protected function renderHeader():void
|
{
|
$meta = Meta::forPost($this->parentID);
|
$sharedFields = JVB()->routes('content')->getTimelineSharedFields($this->content);
|
$fields = $meta->getAll($sharedFields);
|
$extra = $meta->getAll();
|
?>
|
<header id="top">
|
<h1><small>Before and After Laser Tattoo Removal:</small><?=$this->get_field('post_title', $extra)?></h1>
|
<ul class="timeline terms">
|
<?php
|
foreach ($fields as $slug => $value) {
|
if ($value === '' || $slug === 'person') {
|
continue;
|
}
|
$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?>">
|
<span title="<?= $config['singular']?>" class="term tldr" data-short="" data-long="<?= $config['singular']?>">
|
<?=jvbIcon($config['icon']??jvbDefaultIcon())?>
|
<span></span>
|
</span>
|
<?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"><?=html_entity_decode($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">
|
<?php if (!empty($this->children)) :?>
|
<h3>After <?=$this->total?> Treatment<?= $this->total > 1 ? 's' : '' ?></h3>
|
<?= jvbFormatImage(get_post_thumbnail_id($this->children[count($this->children)-1]), 'tiny', 'large', false) ?>
|
<?php endif; ?>
|
</div>
|
</section>
|
<section id="info">
|
<?php
|
$content = $this->get_field('post_content', $extra);
|
if ($content !== '') {
|
echo $this->formatContent($content);
|
}
|
?>
|
</section>
|
<?php
|
}
|
|
protected function formatContent(string $content, bool $wrap = false, string $class = 'content'):string
|
{
|
$out = '';
|
if ($wrap) {
|
$out .= '<div class="'.$class.'">';
|
}
|
$out .= wptexturize(wp_kses_post( wpautop($content)));
|
if ($wrap) {
|
$out .= '</div>';
|
}
|
return $out;
|
}
|
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 = Meta::forPost($ID);
|
$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
|
$img = $this->get_field('post_thumbnail', $fields);
|
if (is_int($img)) {
|
echo jvbFormatImage($img);
|
}
|
?>
|
<div class="info">
|
<header>
|
<h2><?=jvbIcon(jvbLogoIcon())?><?= $title?></h2>
|
<?php
|
$date = $this->get_field('post_date', $fields);
|
if ($date !== '') {
|
echo '<time datetime="'.$date.'">'.date('F Y', strtotime($date)).'</time>';
|
}
|
|
|
echo $this->outputTimelineTax($ID);
|
|
$content = $this->get_field('post_content', $fields);
|
if ($i > 0 && $content !== '') {
|
echo $this->formatContent($this->get_field('post_content', $fields));
|
}
|
?>
|
</header>
|
</div>
|
</section>
|
<?php
|
}
|
}
|
|
protected function outputTimelineTax(int $ID):string
|
{
|
$timeline = wp_get_object_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').html_entity_decode($term->name).'</a><small>after the treatment</small></li>';
|
}
|
$out .='</ul>';
|
return $out;
|
}
|
}
|