<?php
|
namespace JVBase\meta;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
/**
|
* Single field data container
|
* Holds value, config, and tracks dirty state
|
*/
|
final class Field
|
{
|
public string $name;
|
public mixed $value;
|
public mixed $originalValue;
|
public array $config;
|
public bool $isDirty = false;
|
public bool $isValid = true;
|
public bool $isDefault = false;
|
public array $errors = [];
|
|
public function __construct(string $name, mixed $value, array $config = [])
|
{
|
$this->name = $name;
|
$this->value = $value;
|
$this->originalValue = $value;
|
$this->config = $config;
|
if (array_key_exists('wp', $config) && $config['wp'] === true) {
|
$this->isDefault = true;
|
}
|
}
|
|
/**
|
* Set field value and track dirty state
|
*/
|
public function set(mixed $value): self
|
{
|
error_log('Checking if value is the same as old value: '.print_r($value, true));
|
if ($value !== $this->value) {
|
error_log('Saving new value: '.print_r($value, true));
|
$this->value = $value;
|
$this->isDirty = true;
|
}
|
return $this;
|
}
|
|
/**
|
* Get current value
|
*/
|
public function get(): mixed
|
{
|
return $this->value;
|
}
|
|
/**
|
* Mark field as clean (after save)
|
*/
|
public function markClean(): self
|
{
|
$this->originalValue = $this->value;
|
$this->isDirty = false;
|
return $this;
|
}
|
|
/**
|
* Reset to original value
|
*/
|
public function reset(): self
|
{
|
$this->value = $this->originalValue;
|
$this->isDirty = false;
|
return $this;
|
}
|
|
/**
|
* Add validation error
|
*/
|
public function addError(string $message): self
|
{
|
$this->errors[] = $message;
|
$this->isValid = false;
|
return $this;
|
}
|
|
/**
|
* Clear all errors
|
*/
|
public function clearErrors(): self
|
{
|
$this->errors = [];
|
$this->isValid = true;
|
return $this;
|
}
|
|
/**
|
* Get field type from config
|
*/
|
public function type(): string
|
{
|
return $this->config['type'] ?? 'text';
|
}
|
|
/**
|
* Check if this is a WordPress default field
|
*/
|
public function isWpDefault(): bool
|
{
|
return $this->isDefault ?? false;
|
}
|
|
/**
|
* Check if this is a taxonomy relationship field (not taxonomy_type)
|
*/
|
public function isTaxonomy(): bool
|
{
|
return ($this->type() === 'taxonomy' || ($this->type() === 'selector' && isset($this->config['subtype']) && $this->config['subtype'] === 'taxonomy')) && !isset($this->config['isReference']);
|
}
|
|
/**
|
* Check if field is required
|
*/
|
public function isRequired(): bool
|
{
|
return !empty($this->config['required']);
|
}
|
|
/**
|
* Get field label
|
*/
|
public function label(): string
|
{
|
return $this->config['label'] ?? $this->name;
|
}
|
|
/**
|
* Get field description
|
*/
|
public function description(): string
|
{
|
return $this->config['description'] ?? '';
|
}
|
}
|