*/ public array $fields = []; /** @var 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()); } }