From ccf5e61a075c35d24befc175994b5cb8957ca322 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Wed, 26 Aug 2026 21:45:53 +0000
Subject: [PATCH] =Extra JVB() calls replaced, minor tweaks

---
 inc/blocks/MenuBlock.php |  253 +++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 205 insertions(+), 48 deletions(-)

diff --git a/inc/blocks/MenuBlock.php b/inc/blocks/MenuBlock.php
index 679f017..a623d7c 100644
--- a/inc/blocks/MenuBlock.php
+++ b/inc/blocks/MenuBlock.php
@@ -1,6 +1,8 @@
 <?php
 namespace JVBase\blocks;
 
+use JVBase\base\Options;
+use JVBase\base\Site;
 use JVBase\managers\Cache;
 use JVBase\forms\TaxonomySelector;
 use JVBase\meta\Form;
@@ -26,14 +28,20 @@
     protected string $detailsTitle;
     protected array $details;
 	protected array|false $sections = false;
+	protected string $base;
 
     public function __construct()
     {
-        $this->cache = Cache::for('menu', WEEK_IN_SECONDS)->connectTo('post', 'menu_item');
+        $this->cache = Cache::for('menu', 'post', WEEK_IN_SECONDS);
+		if (Site::hasIntegration('square')) {
+			$this->base = '_square_';
+		} else if (Site::hasIntegration('helcim')) {
+			$this->base = '_helcim_';
+		}
         add_action('init', [ $this, 'registerBlock' ]);
     }
 
-    public function registerBlock()
+    public function registerBlock():void
     {
         register_block_type($this->path, [
             'render_callback' => [ $this, 'render' ]
@@ -42,10 +50,12 @@
 
 	protected function buildParams():void
 	{
-		if (is_post_type_archive(BASE.'menu_item')) {
+//		if (is_post_type_archive(BASE.'menu_item') ||
+		if (is_post_type_archive('product') ||
+			(function_exists('is_shop') && is_shop())) {
 			$this->params = ['all'];
-		} elseif (is_tax(BASE.'section')) {
-			jvbDump(get_queried_object());
+//		} elseif (is_tax(BASE.'section')) {
+		} elseif (is_tax('product_cat')) {
 			$this->params = [];
 		} else {
 			$this->params = [];
@@ -58,9 +68,10 @@
 		if (empty($this->params)) {
 			return '';
 		}
-		$key = $this->cache->generateKey($this->params);
+		jvbInlineStyles('forms');
+		$this->cache->flush();
 		return $this->cache->remember(
-			$key,
+			$this->params,
 			function() {
 				ob_start();
 				$this->renderBlock();
@@ -90,7 +101,8 @@
 				<?php
 				$sections = $this->getSections();
 				foreach ($sections as $section) {
-					if (!jvbTermHasPosts($section['id'], BASE.'section')) {
+//					if (!jvbTermHasPosts($section['id'], BASE.'section')) {
+					if (!jvbTermHasPosts($section['id'], 'product_cat')) {
 						continue;
 					}
 					?>
@@ -106,8 +118,7 @@
 	protected function getSections():array
 	{
 		if (!$this->sections) {
-			$options = Meta::forOptions('options');
-			$sections = $options->get('menu_section_order');
+			$sections = Options::get('menu_section_order');
 			if (!is_array($sections)) {
 				$sections = [];
 			}
@@ -121,13 +132,18 @@
     {
 		$sections = $this->getSections();
 		foreach ($sections as $section) {
+			if($section['name'] === 'Uncategorized') {
+				continue;
+			}
 			$items = new WP_Query([
-				'post_type' => BASE.'menu_item',
+				'post_type' => 'product',
+//				'post_type' => BASE.'menu_item',
 				'order' => 'ASC',
 				'posts_per_page' => -1,
 				'tax_query' => [
 					[
-						'taxonomy' => BASE.'section',
+						'taxonomy' => 'product_cat',
+//						'taxonomy' => BASE.'section',
 						'terms' => (int) $section['id'],
 					]
 				],
@@ -154,99 +170,239 @@
 		}
     }
 
-	protected function renderMenuItem(int $ID, string $slug, string $postType = 'menu_item') {
+	/**
+	 * Renders from WooCommerce product
+	 * @param int $ID
+	 * @param string $slug
+	 * @param string $postType
+	 * @return void
+	 */
+	protected function renderMenuItem(int $ID, string $slug, string $postType = 'product'):void {
 		$meta = Meta::forPost($ID);
+
+		$fields = $meta->getAll();
+
+//		jvbDump($fields, 'Fields');
+
+		$excerpt = get_the_excerpt($ID);
+		$isVariable = !empty($fields['variations']??[]);
+		$variations = $isVariable ? array_map('floatval', array_column($fields['variations'], 'price')) : [];
+		$priceRange = $isVariable ?
+			(min($variations).' - '.max($variations)) :
+			$fields['_price']??'';
+
+		$out = sprintf(
+	'<div class="menu-item%s" data-section="%s" data-label="%s" data-id="%s">
+				<div class="header row x-btw">
+					<h3>%s</h3>
+					<p class="price">$%s</p>
+				</div>
+				<div class="description">%s</div>
+				<div class="info col right">',
+			$isVariable ? ' variable' : '',
+			$slug,
+			$fields['post_title'],
+			$ID,
+			$fields['post_title'],
+			$priceRange,
+			$excerpt
+		);
+
+		if (!empty($fields['variations']??[])) {
+			foreach ($fields['variations'] as $index => $row) {
+				$out .= sprintf(
+				'<div class="row right nowrap">
+						<div>
+							<h4>%s — %s</h4>
+							%s
+						</div><a href="?add-to-cart=%d&variation_id=%d"
+   data-quantity="1"
+   data-product_id="%d"
+   data-variation_id="%d"
+   class="add_to_cart_button ajax_add_to_cart add-to-cart">
+   %s
+   <span>Add to Cart</span>
+</a>', //Note: we had 3 %s%s%s before the last </div> last time. This was to add optional ingredients or preparation time duration, not default in WooCommerce
+						$row['title'],
+						jvbCurrency($row['price']),
+						empty($row['description']) ? '' : wpautop($row['description']),
+						$ID,
+						$row['id'],
+						$ID,
+						$row['id'],
+						jvbIcon('plus-square')
+				);
+
+//				$out .= Form::render(
+//					$row['id'],
+//					'',
+//					[
+//						'type'	=> 'quantity',
+//						'label'	=> $row['title'],
+//						'min'	=> 0,
+//						'max'	=> 30,
+//						'data'	=> [
+//							'price'	=> $row['price'],
+//							'id'	=> $row['id'],
+//							'sku'	=> $row['sku'],
+//							'name'	=> $row['title'],
+//							'add-to-cart'	=> ''
+//						],
+//						'add'	=> 'Add 1 '.$row['title'].' to cart',
+//						'remove'	=> 'Remove 1 '.$row['title']. ' from cart',
+//					]
+//				);
+				$out .= '</div>';
+			}
+		} else {
+			$out .= sprintf(
+				'<a href="?add-to-cart=%d"
+				   data-quantity="1"
+				   data-product_id="%d"
+				   class="add_to_cart_button ajax_add_to_cart add-to-cart">
+				   %s
+   					<span>Add to Cart</span>
+				</a>',
+				$ID,
+				$ID,
+				jvbIcon('plus-square')
+			);
+//			$out .= Form::render(
+//				$ID,
+//				'',
+//				[
+//					'type'	=> 'quantity',
+//					'label'	=> 'Add to Order',
+//					'min'	=> 0,
+//					'max'	=> 30,
+//					'step'	=> 1,
+//					'data'	=> [
+//						'price'	=> $fields['_price'],
+//						'id'	=> $ID,
+//						'name'	=> $fields['post_title'],
+//						'step'	=> 1,
+//						'add-to-cart'	=> '',
+//					],
+//					'add'	=> 'Add 1 '.$fields['post_title'].' to cart',
+//					'remove'	=> 'Remove 1 '.$fields['title']. ' from cart',
+//				]
+//			);
+		}
+
+		$out .= '</div></div>';
+
+		echo $out;
+
+	}
+	/**
+	protected function renderMenuItemOLD(int $ID, string $slug, string $postType = 'menu_item') {
+		$meta = Meta::forPost($ID);
+		$fields = $meta->getAll();
 		$values = $meta->getAll([
 			'post_title',
-			'_square_catalog_id',
-			'price',
-			'product_variations',
+			$this->base.'item_id',
+			$this->base.'price',
+			$this->base.'product_variations',
 			'max_order',
 			'min_order',
 			'step'
 		]);
-		$priceRange = jvbCurrency($values['price']);
-		$variations = $values['product_variations'];
+		$priceRange = jvbCurrency($values[$this->base.'price']);
+		$variations = $values[$this->base.'product_variations'];
 
-		if(!empty($variations) && $variations[0]['name'] === '') {
+		if(!empty($variations) && $variations[0][$this->base.'name'] === '') {
 			$variations = [];
 		}
 
 		if (!empty($variations)) {
 			$prices = [];
 			foreach ($variations as $row) {
-				if (isset($row['price']) && is_numeric($row['price'])) {
-					$prices[] = (float) $row['price'];
+				if (isset($row[$this->base.'price']) && is_numeric($row[$this->base.'price'])) {
+					$prices[] = (float) $row[$this->base.'price'];
 				}
 			}
-			if (!empty($prices)) {
+			if (!empty($prices) && (min($prices) !== max($prices))) {
 				$priceRange = jvbCurrency(min($prices)).' - '.jvbCurrency(max($prices));
+			} elseif (!empty($prices)) {
+				$priceRange = jvbCurrency(max($prices));
 			}
 		}
 
-		$max = $values['max_order'];
-		$min = $values['min_order'];
-		$step = $values['step'];
+		$max = $values['max_order']??'';
+		$min = $values['min_order']??'';
+		$step = $values['step']??'';
 		$max = ($max === '') ? 50 : $max;
 		$min = ($min === '') ? 0 : $min;
 		$step = ($step === '') ? 1 : $step;
 
 
 		?>
-		<div class="menu-item<?= !empty($variations) ? ' variable' : '' ?>" data-section="<?=$slug?>">
-			<div class="header row btw">
+		<div class="menu-item<?= !empty($variations) ? ' variable' : '' ?>" data-section="<?=$slug?>" data-label="<?=$values['post_title']?>" data-id="<?=$ID?>">
+			<div class="header row x-btw">
 				<h3><?= $values['post_title']?></h3>
 				<p class="price"><?= $priceRange ?></p>
 			</div>
 			<div class="description">
 				<?= Render::renderFrom($meta, 'post_excerpt')?>
 			</div>
-			<div class="info row end">
+			<div class="info col right">
 				<?php
 				if (empty($variations)) {
-					Form::renderFrom($meta,
+					echo Form::render(
 						$ID.'|cart_quantity',
+						'',
 						[
-							'type'	=> 'number',
+							'type'	=> 'quantity',
 							'label'	=> 'Add to Order',
 							'min'	=> $min,
 							'max'	=> $max,
 							'step'	=> $step,
 							'data'	=> [
-								'price' => $values['price'],
+								'price' => $values[$this->base.'price'],
 								'id'	=> $ID,
-								'square-catalog-id'	=> $values['_square_catalog_id'],
+								'catalog-id'	=> $values[$this->base.'item_id'],
 								'name'	=> $values['post_title'],
 								'step'	=> $step,
 								'add-to-cart' => ''
 							],
 							'add'	=> 'Add 1 '.$values['post_title'].' to cart',
 							'remove'	=> 'Remove 1 '.$values['post_title'].' from cart',
-						],
-						true);
+						]);
 				} else {
 					foreach ($variations as $index =>$row) {
-						jvbDump($index, 'index');
-						jvbDump($row, 'row');
-						Form::renderFrom($meta,
+						echo sprintf(
+							'<div class="row right nowrap">
+							<div>
+								<h4>%s — %s</h4>
+								%s%s%s
+							</div>',
+							$row[$this->base.'name'],
+							jvbCurrency($row[$this->base.'price']),
+							empty($row[$this->base.'description']) ? '' : wpautop($row[$this->base.'description']),
+							empty($row[$this->base.'ingredients']) ? '' : wpautop('<b>Ingredients:</b>'.$row[$this->base.'ingredients']),
+							empty($row[$this->base.'preparation_time_duration']) ? '' : wpautop('Ready in <b>'.$row[$this->base.'preparation_time_duration'].'</b>'),
+						);
+						echo Form::render(
 							'quantity-'.$index,
+							'',
 							[
-								'type'	=> 'number',
-								'label'	=> $row['label'],
+								'type'	=> 'quantity',
+								'label'	=> $row[$this->base.'name'],
 								'min'	=> $min,
 								'max'	=> $max,
 								'step'	=> $step,
 								'data'	=> [
-									'price' => $row['price'],
-									'id'	=> $ID,
-									'square-catalog-id'	=> $row['_square_catalog_id'],
-									'name'	=> $row['label'],
+									'price' => $row[$this->base.'price'],
+									'id'	=> $ID.'-'.$row[$this->base.'sku'],
+									'catalog-id'	=> $row[$this->base.'item_id'],
+									'name'	=> $row[$this->base.'name'],
 									'add-to-cart' => ''
 								],
-								'add'	=> 'Add 1 '.$row['label'].' to cart.',
-								'remove'	=> 'Remove 1 '.$row['label'].' from cart.',
-							],
-							true);
+								'add'	=> 'Add 1 '.$row[$this->base.'name'].' to cart.',
+								'remove'	=> 'Remove 1 '.$row[$this->base.'name'].' from cart.',
+							]
+						);
+						echo '</div>';
 					}
 				}
 				?>
@@ -255,7 +411,8 @@
 
 		</div>
 		<?php
-	}
+	} **/
+
 
 
     protected function renderOnThisPage():void

--
Gitblit v1.10.0