From d7e7d248cbe41cd7a9ef9c2fb022b6c4831f99a3 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 31 May 2026 15:22:56 +0000
Subject: [PATCH] =jakevan complete
---
inc/blocks/TimelineBlock.php | 105 +++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 78 insertions(+), 27 deletions(-)
diff --git a/inc/blocks/TimelineBlock.php b/inc/blocks/TimelineBlock.php
index 4d8e9d1..c79392e 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,7 +30,10 @@
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');
}
@@ -46,12 +48,12 @@
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;
}
@@ -79,26 +81,38 @@
$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']??'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 +122,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>'; }
@@ -120,25 +134,49 @@
?>
</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': '';
@@ -147,16 +185,28 @@
?>
<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('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,14 +216,15 @@
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;
--
Gitblit v1.10.0