| | |
| | | */ |
| | | public function get(string $name): mixed |
| | | { |
| | | // Handle repeater subfield path |
| | | if (str_contains($name, ':')) { |
| | | return $this->getByPath($name); |
| | | } |
| | | |
| | | // Check computed fields first |
| | | if (isset($this->computed[$name])) { |
| | | return ($this->computed[$name])($this); |
| | |
| | | */ |
| | | public function set(string $name, mixed $value): self |
| | | { |
| | | // Handle repeater subfield path (e.g., "services:2:image") |
| | | if (str_contains($name, ':')) { |
| | | return $this->setByPath($name, $value); |
| | | } |
| | | |
| | | $config = $this->item->getFieldConfig($name); |
| | | |
| | | if (!$config) { |
| | |
| | | return new Repeater($this, $name); |
| | | } |
| | | |
| | | protected function setByPath(string $path, mixed $value): self |
| | | { |
| | | $parts = explode(':', $path, 3); |
| | | if (count($parts) !== 3) { |
| | | return $this; |
| | | } |
| | | |
| | | [$repeaterName, $rowIndex, $subField] = $parts; |
| | | $this->repeater($repeaterName)->setField((int) $rowIndex, $subField, $value); |
| | | |
| | | return $this; |
| | | } |
| | | |
| | | protected function getByPath(string $path): mixed |
| | | { |
| | | $parts = explode(':', $path, 3); |
| | | if (count($parts) !== 3) { |
| | | return null; |
| | | } |
| | | |
| | | [$repeaterName, $rowIndex, $subField] = $parts; |
| | | return $this->repeater($repeaterName)->field((int) $rowIndex, $subField); |
| | | } |
| | | |
| | | // ───────────────────────────────────────────────────────────── |
| | | // Utility Methods |
| | | // ───────────────────────────────────────────────────────────── |