setFields(); if (!empty($this->resetFields)) { add_action('jvbDailyReset', [$this, 'resetOptions']); } } public static function getInstance():Options { if (!isset(self::$instance)) { self::$instance = new self(); do_action('jvb_define_options'); } return self::$instance; } public function setFields():void { $this->fields = new Fields('options'); if (Site::has('limit_hours')) { $this->fields->addField( 'today_hours', [ 'type' => 'group', 'label' => 'Today\'s Hours', 'fields' => [ 'time_start' => [ 'type' => 'time', 'label' => 'Open', ], 'time_end' => [ 'type' => 'time', 'label' => 'Closed', ] ] ] ); $this->fields->addField( 'open_to_public', [ 'type' => 'true_false', 'label' => 'Open to Public?', 'default' => 1, ] ); if (Site::hasAnyIntegration(['facebook','instagram'])) { $this->fields->addField( 'post_to_social', [ 'type' => 'true_false', 'label' => 'Post to Socials?', ] ); } } if (Site::hasIntegration('gmb') || Site::has('hours')) { $this->fields->addCommon('hours'); } } public function fields():Fields { return $this->fields; } public function resetOptions():void { if (empty($this->resetFields)) { return; } foreach ($this->resetFields as $field) { self::delete($field); } Cache::for('options')->flush(); } public static function get(string $fieldName):mixed { if (!array_key_exists($fieldName, self::$values)) { $meta = Meta::forOptions(); self::$values[$fieldName] = $meta->get($fieldName); } return self::$values[$fieldName]; } public static function delete(string $fieldName):void { if (array_key_exists($fieldName, self::$values)) { unset(self::$values[$fieldName]); } $meta = Meta::forOptions(); $meta->delete($fieldName); } public static function set(string $fieldName, mixed $value):void { $meta = Meta::forOptions(); $meta->set($fieldName, $value); self::$values = $value; } public static function render(array $fieldNames, array $options = [], bool $output = false):string { $meta = Meta::forOptions(); $result = Form::renderFormFrom( $meta, 'options', $options, $fieldNames ); if ($output) { echo $result; } return $result; } public function getFields():array { return array_map(function ($field) { return $field->getConfig(); }, $this->fields->getFields() ); } }