| | |
| | | <?php |
| | | namespace JVBase\blocks; |
| | | |
| | | use JVBase\managers\CacheManager; |
| | | use JVBase\forms\TaxonomySelector; |
| | | use JVBase\meta\MetaManager; |
| | | use JVBase\utility\Features; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\base\Site; |
| | | use WP_Block; |
| | | use WP_Query; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; // Exit if accessed directly |
| | |
| | | |
| | | class TimelineBlock |
| | | { |
| | | protected CacheManager $cache; |
| | | protected Cache $cache; |
| | | protected string $config; |
| | | protected string $type; |
| | | protected string $path = JVB_DIR . '/build/timeline'; |
| | |
| | | |
| | | public function __construct() |
| | | { |
| | | $this->cache = CacheManager::for('timelines', WEEK_IN_SECONDS)->connectTo('post', 'timeline'); |
| | | $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 render(array $attributes, string $content, WP_Block $block) |
| | | { |
| | | global $post; |
| | | if (!$post || !Features::forContent(jvbNoBase($post->post_type))->has('is_timeline') ) { |
| | | $registrar = Registrar::getInstance($post->post_type); |
| | | if (!$post || !$registrar || !$registrar->hasFeature('is_timeline') ) { |
| | | return ''; |
| | | } |
| | | $this->parentID = $post->ID; |
| | |
| | | $this->renderTimeline(); |
| | | } |
| | | |
| | | protected function get_field(string $fieldName, array $fields) { |
| | | if (array_key_exists($fieldName, $fields)) { |
| | | return $fields[$fieldName]; |
| | | } |
| | | return ''; |
| | | } |
| | | protected function renderHeader():void |
| | | { |
| | | $title = get_the_title(); |
| | | $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><?=$title?></h1> |
| | | <h1><small>Before and After Laser Tattoo Removal:</small><?=$this->get_field('post_title', $extra)?></h1> |
| | | <ul class="timeline terms"> |
| | | <?php |
| | | $tax = ['goal', 'number', 'body-part', 'style', 'skin-type', 'age']; |
| | | |
| | | foreach ($tax as $slug) { |
| | | $config = JVB_TAXONOMY[$slug]; |
| | | foreach ($fields as $slug => $value) { |
| | | if ($value === '' || $slug === 'person') { |
| | | continue; |
| | | } |
| | | $registrar = Registrar::getInstance($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())?> |
| | | |
| | | <span title="<?= $registrar->getSingular()?>" class="term tldr" data-short="" data-long="<?= $registrar->getSingular()?>"> |
| | | <?=jvbIcon($registrar->getIcon())?> |
| | | <span></span> |
| | | </span> |
| | | <?php |
| | | if ($many) { echo '<ul>'; } |
| | | $open = ($many) ? '<li>' : ''; |
| | |
| | | ?> |
| | | |
| | | <?= $open ?> |
| | | <a href="<?=$link?>" rel="tag"><?=$term->name?></a> |
| | | <a href="<?=$link?>" rel="tag"><?=html_entity_decode($term->name)?></a> |
| | | <?= $close ?> |
| | | <?php } |
| | | if ($many) { echo '</ul>'; } |
| | |
| | | ?> |
| | | </ul> |
| | | </header> |
| | | <section id="info"> |
| | | <?php |
| | | $content = $this->get_field('post_content', $extra); |
| | | if ($content !== '') { |
| | | echo $this->formatContent($content); |
| | | } |
| | | ?> |
| | | </section> |
| | | <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> |
| | | <?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 = new MetaManager($ID, 'post'); |
| | | $meta = Meta::forPost($ID); |
| | | $fields = $meta->getAll($uniqueFields); |
| | | |
| | | $plural = ($i>1) ? 's': ''; |
| | |
| | | ?> |
| | | <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']); |
| | | $img = $this->get_field('post_thumbnail', $fields); |
| | | if (is_int($img)) { |
| | | echo jvbFormatImage($img); |
| | | } |
| | | ?> |
| | | <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>' : '' ?> |
| | | <?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> |
| | |
| | | |
| | | protected function outputTimelineTax(int $ID):string |
| | | { |
| | | $timeline = get_the_terms($ID, BASE.'timeline'); |
| | | $timeline = wp_get_object_terms($ID, BASE.'timeline'); |
| | | if (!$timeline || is_wp_error($timeline)) { |
| | | return ''; |
| | | } |
| | | $out = '<ul class="term-list">'; |
| | | $registrar = Registrar::getInstance('timeline'); |
| | | 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 .= '<li><a href="'.$link.'" rel="tag" title="See more progressions at this timeline">'.jvbIcon($registrar->getIcon('hourglass')).html_entity_decode($term->name).'</a><small>after the treatment</small></li>'; |
| | | } |
| | | $out .='</ul>'; |
| | | return $out; |