From 3baf3d2545ba6ece6b74a64c0def59bd0774cf54 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Wed, 10 Jun 2026 16:34:12 +0000
Subject: [PATCH] =Laid the groundwork for an improved DashboardManager.php setup. Have to put it aside so I can get the dang Northeh done though.
---
inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 103 insertions(+), 0 deletions(-)
diff --git a/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php b/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php
index 0230b99..e7d32a7 100644
--- a/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php
+++ b/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);
+ }
+ }
+ }
}
--
Gitblit v1.10.0