From ba1e1ccf869b818f7a7a897264dfea05563a7796 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 07 Jun 2026 20:10:20 +0000
Subject: [PATCH] =Major overhaul of Integrations. Playing around with adding fields to post types through Registrar from an integrations' class file.

---
 inc/blocks/TimelineBlock.php |  126 ++++++++++++++++++++++++++++++------------
 1 files changed, 90 insertions(+), 36 deletions(-)

diff --git a/inc/blocks/TimelineBlock.php b/inc/blocks/TimelineBlock.php
index 4d8e9d1..85b9add 100644
--- a/inc/blocks/TimelineBlock.php
+++ b/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,24 +48,18 @@
     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;
         $cache = $this->cache->get($this->parentID);
-        $cache = false;
         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->children = jvbTimelinePoints($this->parentID,$post->post_type);
 		$this->total = count($this->children);
 
         ob_start();
@@ -77,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>' : '';
@@ -108,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>'; }
@@ -119,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>
@@ -166,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);
+	}
 }

--
Gitblit v1.10.0