Jake Vanderwerf
2 days ago 235ce5716edc2f7cbe80fdccf26eac7269587839
inc/blocks/TimelineBlock.php
@@ -1,12 +1,11 @@
<?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
@@ -14,7 +13,7 @@
class TimelineBlock
{
    protected CacheManager $cache;
    protected Cache $cache;
    protected string $config;
    protected string $type;
    protected string $path = JVB_DIR . '/build/timeline';
@@ -31,9 +30,12 @@
    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');
      add_action('wp_footer', [$this, 'renderGallery']);
    }
    public function registerBlock()
@@ -46,7 +48,8 @@
    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;
@@ -56,13 +59,7 @@
        }
      $this->content = jvbNoBase($post->post_type);
      $this->children = get_children([
         'post_parent'  => $this->parentID,
         'post_status'  => 'publish',
         'orderby'      => 'date',
         'order'     => 'ASC',
         'fields'       => 'ids'
      ]);
      $this->children = jvbTimelinePoints($this->parentID,$post->post_type);
      $this->total = count($this->children);
        ob_start();
@@ -76,28 +73,43 @@
    {
        $this->renderHeader();
        $this->renderTimeline();
      ?>
      <ul class="buttons"><li><a href="<?= get_post_type_archive_link(BASE.$this->content) ?>">See All Before & Afters</a></li></ul>
      <?php
    }
   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']??'triangle')?>
                  <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>' : '';
@@ -107,7 +119,7 @@
                     ?>
                     <?= $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>'; }
@@ -118,44 +130,81 @@
            }
            ?>
         </ul>
         <ul class="buttons"><li><a href="<?= get_post_type_archive_link(BASE.$this->content) ?>">See All Before & Afters</a></li></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': '';
         $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">
         <section id="<?= $i === 0 ? 'before-treatment' : 'treatment-'.$i ?>" class="timeline-point row top 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 str_replace('<img', '<img data-caption=".info header"', jvbFormatImage($img));
            }
            ?>
            <div class="info">
               <header>
                  <h2><?=jvbIcon('logo-triangle')?><?= $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>' : '' ?>
                  <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>
@@ -165,16 +214,22 @@
   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><small><a href="'.$link.'" rel="tag" title="See more progressions at this timeline">'.jvbIcon($registrar->getIcon('hourglass')).html_entity_decode($term->name).'</a> after the treatment</small></li>';
      }
      $out .='</ul>';
      return $out;
   }
   public function renderGallery():void
   {
      jvbRenderGallery(true);
   }
}