diff --git a/formwork/src/Fields/Layout/Layout.php b/formwork/src/Fields/Layout/Layout.php index 7cd868ef2..8c68a7e77 100644 --- a/formwork/src/Fields/Layout/Layout.php +++ b/formwork/src/Fields/Layout/Layout.php @@ -19,10 +19,9 @@ class Layout /** * @param array $data */ - public function __construct(array $data, Translation $translation) + public function __construct(protected array $data, protected Translation $translation) { $this->type = $data['type']; - $this->sections = new SectionCollection($data['sections'] ?? [], $translation); } /** Get layout type @@ -38,6 +37,10 @@ public function type(): string */ public function sections(): SectionCollection { - return $this->sections; + return $this->sections ??= (new SectionCollection( + $this->data['sections'] ?? [], + $this->translation, + )) + ->sort(sortBy: fn(Section $a, Section $b): int => $a->order() <=> $b->order()); } } diff --git a/formwork/src/Fields/Layout/Section.php b/formwork/src/Fields/Layout/Section.php index 811dbd066..0431b13ee 100644 --- a/formwork/src/Fields/Layout/Section.php +++ b/formwork/src/Fields/Layout/Section.php @@ -2,13 +2,16 @@ namespace Formwork\Fields\Layout; +use Formwork\Data\Contracts\Arrayable; +use Formwork\Data\Traits\DataArrayable; use Formwork\Data\Traits\DataGetter; use Formwork\Translations\Translation; use Formwork\Utils\Str; -class Section +class Section implements Arrayable { use DataGetter; + use DataArrayable; /** * @param array $data @@ -35,4 +38,12 @@ public function label(): string { return Str::interpolate($this->get('label', ''), fn($key) => $this->translation->translate($key)); } + + /** + * Get section order + */ + public function order(): int + { + return (int) ($this->get('order') ?? PHP_INT_MAX); + } }