registrar = $registrar; switch ($type) { case 'post': $this->addPostFields(); break; case 'term': $this->addTermFields(); break; case 'user': $this->addUserFields(); break; } } public function addField(string $name, array $config):self { $this->fields[$name] = match ($config['type']) { 'upload', 'image', 'gallery' => new UploadField($name, $config), 'checkbox', 'radio', 'select', 'set' => new OptionsField($name, $config), 'group' => new GroupedField($name, $config), 'repeater' => new RepeaterField($name, $config), 'tagList' => new TagListField($name, $config), 'selector', 'taxonomy', 'user', 'post' => new SelectorField($name, $config), default => new Field($name, $config), }; return $this; } public function addPostFields():void { $statuses = [ // 'all' => [ // 'icon' => 'infinity', // 'label' => 'Everything', // ], 'publish' => [ 'icon' => 'eye', 'label' => 'Live', ], 'draft' => [ 'icon' => 'eye-closed', 'label' => 'Hidden', ], 'trash' => [ 'label' => 'Scrapped', 'icon' => 'trash', ], // 'delete' => [ // 'label' => 'Permanently Delete', // 'icon' => 'trash' // ] ]; if ($this->registrar->hasFeature('is_calendar')) { $statuses = [ 'future' => [ 'icon' => '', 'label' => 'Upcoming', ], 'past' => [ 'icon' => '', 'label' => 'Past', ], 'repeat' => [ 'icon' => '', 'label' => 'Repeating', ], 'draft' => [ 'icon' => 'eye-closed', 'label' => 'Hidden', ], 'trash' => [ 'label' => 'Scrapped', 'icon' => 'trash', ], ]; } $fields = [ 'post_thumbnail' => [ 'type' => 'upload', 'subtype' => 'image', 'multiple'=> false, 'label' => 'Main Image', ], 'post_date' => [ 'type' => 'datetime', 'label' => 'Date', ], 'post_content' => [ 'type' => 'textarea', 'quill' => true, 'label' => 'Content' ], 'post_title' => [ 'type' => 'text', 'label' => 'Title', 'required' => true, ], 'post_excerpt' => [ 'type' => 'textarea', 'label' => 'TLDR', 'maxLength' => 158, ], 'post_status' => [ 'type' => 'radio', 'label' => 'Status', 'default' => 'draft', 'options' => $statuses ] ]; foreach ($fields as $name => $config) { $this->addField($name, $config); } } public function addTermFields():void { $fields = [ 'name' => [ 'type' => 'text', 'label' => 'Title', 'required' => true, ], 'description' => [ 'type' => 'textarea', 'quill' => true, 'label' => 'Description', ] ]; if ($this->registrar->args()['hierarchical']??false){ $fields['parent'] = [ 'type' => 'taxonomy', 'isReference' => true, 'autocomplete' => true, 'label' => 'Term Parent' ]; } foreach ($fields as $name => $config) { $this->addField($name, $config); } } public function addUserFields():void { $fields = [ 'first_name' => [ 'type' => 'text', 'label' => 'First Name', ], 'last_name' => [ 'type' => 'text', 'label' => 'Last Name', ], 'display_name' => [ 'type' => 'text', 'label' => 'Display Name', ], 'website' => [ 'type' => 'url', 'label' => 'Website', ], 'description' => [ 'type' => 'textarea', 'quill' => true, 'label' => 'Description', ] ]; foreach ($fields as $name => $config) { $this->addField($name, $config); } } public function modifyField(string $name, string $property, mixed $value):void { $property = 'set'.implode('',array_map('ucfirst',explode('_', $property))); $field = $this->fields[$name]; $field->$property($value); } public function getFields():array { return $this->fields; } public function addCommon(string $name):self { $method = 'add'.implode('',array_map('ucfirst',explode('_', $name))).'Field'; if (method_exists($this, $method)) { $this->$method(); } else { error_log('[Field]addCommon: No configuration found for '.$name.'.'); } return $this; } protected function addWikiField(?string $label = null):void { $this->addField( 'wiki', [ 'type' => 'url', 'label' => $label ?: 'Wikipedia Page', 'description' => 'For the schema', 'quickEdit' => true, ] ); } protected function addLinksField(?string $label = null):void { $this->addField( 'links', [ 'type' => 'repeater', 'quickEdit' => true, 'add_label' => 'title', 'label' => $label ?:'Online Links', 'description' => 'These are listed publicly on the website', 'fields' => [ 'url' => [ 'type' => 'url', 'label' => 'URL', ], 'title' => [ 'type' => 'text', 'label' => 'Label', ], 'tracker' => [ 'type' => 'text', 'label' => 'Tracker', 'description' => 'If you are set up to track link referrals, add what comes after the ? here.', 'default' => 'ref=edmonton_ink' ], ], 'section' => 'contact' ] ); } protected function addContactField():void { $this->addField( 'admin_contact', [ 'type' => 'set', 'label' => 'Admin Contact', 'quickEdit' => true, 'options' => [ 'text' => 'Text', 'call' => 'Call', 'email' => 'Email', 'insta' => 'Instagram', ], 'section' => 'contact' ] ); $this->addField( 'public_contact', [ 'type' => 'set', 'label' => 'Public Contact', 'quickEdit' => true, 'options' => [ 'text' => 'Text', 'call' => 'Call', 'email' => 'Email', 'insta' => 'Instagram', ], 'section' => 'contact' ] ); } protected function addReviewField(?string $label = null):void { $biz = new LocalBusiness(); $biz->setReviewField($this); } protected function addAlternateNameField():void { $thing = new Thing(); $thing->setAlternateNameField($this); } protected function addKeywordsField():void { $thing = new LocalBusiness(); $thing->setKeywordsField($this); } protected function addOutsidePhotoField():void { $business = new LocalBusiness(); $business->setPhotoField($this); } protected function addSloganField():void { $business = new LocalBusiness(); $business->setSloganField($this); } protected function addPaymentField():void { $business = new LocalBusiness(); $business->setPaymentAcceptedField($this); } protected function addAmenitiesField():void { $business = new LocalBusiness(); $business->setAmenityFeatureField($this); } protected function addCredentialsField():void { $this->addField( 'credentials', [ 'type' => 'set', 'label' => __('Credentials', 'jvb'), 'options'=> [ 'WHMIS 2015' => 'WHMIS 2015', 'Tattoo and Piercing Safety Standards' => 'Tattoo and Piercing Safety Standards', 'Bloodborne Pathogens and Infection Control' => 'Bloodborne Pathogens and Infection Control', 'First Aid Training' => 'First Aid Training', ] ] ); } protected function addPermanentlyCloseField():void { $business = new LocalBusiness(); $business->setDissolutionDateField($this); } protected function addHoursField():void { $business = new LocalBusiness(); $business->setOpeningHoursSpecificationField($this); } protected function addRateField():void { $this->addField('rate', [ 'type' => 'text', 'subtype' => 'number', 'label' => __('Hourly Rate', 'jvb') ]); } protected function addAwardsField():void { $business = new LocalBusiness(); $business->setAwardField($this); } protected function addRatingsField():void { $business = new LocalBusiness(); $business->setAggregateRatingField($this); } protected function addServicesField():void { $business = new LocalBusiness(); $business->setHasOfferCatalogField($this); } }