Jake Vanderwerf
2026-05-03 9bbeea742424837fb58207d88e10dbca0b2cae04
inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php
@@ -3,6 +3,12 @@
use JVBase\base\SchemaHelper;
use JVBase\inc\managers\SEO\render\Thing\Intangible\ItemList\OfferCatalog;
use JVBase\managers\SEO\render\Thing\Intangible\Offer;
use JVBase\managers\SEO\render\Thing\Intangible\Service;
use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PriceSpecification;
use JVBase\managers\SEO\render\Thing\Product\Product;
use JVBase\meta\Meta;
use JVBase\registrar\Fields;
use JVBase\registrar\Registrar;
if (!defined('ABSPATH')) {
@@ -97,4 +103,101 @@
         ]
      ];
   }
   public function setHasOfferCatalogField(Fields $fields):void
   {
      $fields->addField(
         'hasOfferCatalog',
         [
            'type'   => 'repeater',
            'label'  => 'Main Products & Services',
            'fields' => [
               'type'   => [
                  'type'   => 'radio',
                  'label'  => __('Select Type', 'jvb'),
                  'options'   => [
                     'product'   => 'Product',
                     'service'   => 'Service'
                  ],
                  'required' => true,
               ],
               'name'   => [
                  'type'   => 'text',
                  'label'  => __('Name of Product or Service', 'jvb'),
                  'required'  => true,
               ],
               'description'  => [
                  'type'   => 'textarea',
                  'label'  => __('Description (optional)', 'jvb'),
               ],
               'price'  => [
                  'type'   => 'text',
                  'subtype'   => 'number',
                  'label'     => __('Price', 'jvb'),
               ],
               'unitText'  => [
                  'type'   => 'radio',
                  'label'  => 'Price per unit',
                  'options'   => [
                     'hour'   => 'Hour',
                     'unit'   => 'Unit',
                  ],
                  'default'   => 'unit',
               ]
            ],
         ]
      );
   }
   public function formatHasOfferCatalogField(Meta $meta):void
   {
      $catalog = $meta->get('hasOfferCatalog');
      if (!empty($catalog)) {
         $offerCatalog = [];
         $name = '';
         $services = array_filter($catalog, function ($item) {
            return $item['type'] === 'service';
         });
         $products =array_filter($catalog, function ($item) {
            return $item['type'] === 'product';
         });
         if (count($products) > 0) {
            $name = 'Products';
            if (count($services) > 0) {
               $name .= ' & ';
            }
         }
         if (count($services) > 0) {
            $name .= 'Services';
         }
         foreach ($catalog as $row) {
            $offer = new Offer();
            $item = match($row['type']) {
               'product'   => new Product(),
               'service'   => new Service(),
            };
            $item->setName($row['name']);
            if (!empty($row['description'])) {
               $item->setDescription($row['description']);
            }
            if (!empty($row['price'])) {
               $price = new PriceSpecification();
               $price->setPrice($row['price']);
               $price->setPriceCurrency('CAD');
               $price->setUnitText($row['unitText']);
               $offer->setPriceSpecification($price);
            }
            $offer->setItemOffered($item);
            $offerCatalog[] =  $offer;
         }
         if (!empty(!$offerCatalog)) {
            $final = new OfferCatalog();
            $final->setName($name);
            $final->setItemListElement($offerCatalog);
            $this->sethasOfferCatalog($final);
         }
      }
   }
}