Jake Vanderwerf
2026-07-09 c68aefb847b09daa0697de7684d3451e2e68ce1e
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)->connect('post');
      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' ]
@@ -45,7 +53,6 @@
      if (is_post_type_archive(BASE.'menu_item')) {
         $this->params = ['all'];
      } elseif (is_tax(BASE.'section')) {
         jvbDump(get_queried_object());
         $this->params = [];
      } else {
         $this->params = [];
@@ -58,7 +65,9 @@
      if (empty($this->params)) {
         return '';
      }
      jvbInlineStyles('forms');
      $key = $this->cache->generateKey($this->params);
      $this->cache->flush();
      return $this->cache->remember(
         $key,
         function() {
@@ -106,8 +115,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 = [];
         }
@@ -156,44 +164,47 @@
   protected function renderMenuItem(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="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>
@@ -201,52 +212,64 @@
         <div class="description">
            <?= Render::renderFrom($meta, 'post_excerpt')?>
         </div>
         <div class="info row right">
         <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>';
               }
            }
            ?>