<?php
|
namespace JVBase\registrar;
|
|
use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness;
|
use JVBase\managers\SEO\render\Thing\Thing;
|
use JVBase\registrar\fields\Field;
|
use JVBase\registrar\fields\GroupedField;
|
use JVBase\registrar\fields\OptionsField;
|
use JVBase\registrar\fields\RepeaterField;
|
use JVBase\registrar\fields\TagListField;
|
use JVBase\registrar\fields\SelectorField;
|
use JVBase\registrar\fields\UploadField;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
class Fields {
|
protected array $fields;
|
protected Registrar $registrar;
|
|
public function __construct(?string $type = null, ?Registrar $registrar = null) {
|
$this->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
|
{
|
$fields = [
|
'post_thumbnail' => [
|
'type' => 'upload',
|
'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' => [
|
'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'
|
]
|
]
|
]
|
];
|
|
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);
|
}
|
}
|