<?php
|
namespace JVBase\meta;
|
|
if (!defined('ABSPATH')) {
|
exit;
|
}
|
|
/**
|
* Data container for a single WordPress object (post, term, user, or options)
|
* Holds the WP object reference and a collection of Field instances
|
*/
|
final class Item
|
{
|
public int|string|null $id;
|
public string $objectType; // post, term, user, options
|
public ?string $contentType; // tattoo, artist, style (without BASE prefix)
|
public ?object $wpObject; // WP_Post, WP_Term, WP_User
|
|
/** @var array<string, Field> */
|
public array $fields = [];
|
|
/** @var array<string, array> Raw field configs from registry */
|
public array $fieldConfigs = [];
|
|
public ?string $baseKey = null; // For options
|
|
public const WP_DEFAULTS = [
|
'post' => [
|
'post_title',
|
'post_excerpt',
|
'post_content',
|
'post_date',
|
'post_status',
|
'post_modified',
|
'post_thumbnail',
|
'menu_order'
|
],
|
'user' => [
|
'first_name',
|
'last_name',
|
'display_name',
|
'description',
|
'user_email',
|
],
|
'term' => [
|
'term_name',
|
'description'
|
]
|
];
|
|
public function __construct(
|
int|string|null $id,
|
string $objectType,
|
?string $contentType = null
|
) {
|
$this->id = $id;
|
$this->objectType = $objectType;
|
$this->contentType = $contentType;
|
}
|
|
public function hasField(string $name): bool
|
{
|
return isset($this->fields[$name]) || isset($this->fieldConfigs[$name]);
|
}
|
|
public function getField(string $name): ?Field
|
{
|
return $this->fields[$name] ?? null;
|
}
|
|
public function setField(Field $field): self
|
{
|
$this->fields[$field->name] = $field;
|
return $this;
|
}
|
|
public function getFieldConfig(string $name): ?array
|
{
|
return $this->fieldConfigs[$name] ?? null;
|
}
|
|
public function isWpDefault(string $name): bool
|
{
|
$defaults = self::WP_DEFAULTS[$this->objectType] ?? [];
|
return in_array($name, $defaults, true);
|
}
|
|
public function getDirtyFields(): array
|
{
|
return array_filter($this->fields, fn(Field $f) => $f->isDirty);
|
}
|
|
public function getInvalidFields(): array
|
{
|
return array_filter($this->fields, fn(Field $f) => !$f->isValid);
|
}
|
|
public function markAllClean(): self
|
{
|
foreach ($this->fields as $field) {
|
$field->markClean();
|
}
|
return $this;
|
}
|
|
public function hasDirtyFields(): bool
|
{
|
return !empty($this->getDirtyFields());
|
}
|
|
public function isValid(): bool
|
{
|
return empty($this->getInvalidFields());
|
}
|
}
|