hasOfferCatalog??null; } public function setHasOfferCatalog(OfferCatalog|array $hasOfferCatalog):void { if (is_array($hasOfferCatalog)){ if (array_key_exists('generate', $hasOfferCatalog) && $hasOfferCatalog['generate']) { $this->generateOfferCatalog($hasOfferCatalog); } else { if (!array_key_exists('type', $hasOfferCatalog)) { $hasOfferCatalog['type'] = 'JVBase\inc\managers\SEO\render\Thing\Intangible\ItemList\OfferCatalog'; } $items = []; if (array_key_exists('items', $hasOfferCatalog)) { $items = $hasOfferCatalog['items']; unset($hasOfferCatalog['items']); } $hasOfferCatalog = SchemaHelper::classFromConfig($hasOfferCatalog); if (!empty($items)) { $hasOfferCatalog->setItemListElement($items); } } } $this->hasOfferCatalog = $hasOfferCatalog; } public function getHasOfferCatalogFieldConfig():array { return [ 'type' => 'group', 'label' => 'Offer Catalog', 'wrap' => 'details', 'fields' => [ 'generate' => [ 'type' => 'true_false', 'label' => 'Generate from Content type?', 'default' => false, ], 'content_type' => [ 'type' => 'checkbox', 'label' => 'Select Type to generate from', 'options' => Registrar::getRegistered(), 'condition' => [ 'field' => 'generate', 'value' => 1, 'operator' => '==' ] ], 'offer_catalog' => [ 'type' => 'repeater', 'label' => 'Manually Enter Offer Catalog', 'condition' => [ 'field' => 'generate', 'value' => 1, 'operator' => '!=' ], 'fields' => [ 'type' => [ 'type' => 'select', 'label' => 'Type', 'options' => [ 'product' => 'Product', 'service' => 'Service' ] ], 'name' => [ 'type' => 'text', 'label' => 'Name', ], 'description' => [ 'type' => 'textarea', 'label' => 'Description' ], 'price' => [ 'type' => 'number', 'label' => 'Price' ] ] ] ] ]; } 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); } } } }