Перейти до вмісту
en English

Версія v1.6.5 Попередні версії: документація на GitHub

Блоки полів

На цій сторінці

На формах створення й редагування та на сторінці перегляду поля можна згрупувати в панелі з заголовком і вкладки. Блоки впливають лише на вигляд: валідація, збереження, список (index) і порядок колонок працюють так само, як без них.

use Maxcxam\Larsadmin\Layout\Panel;
use Maxcxam\Larsadmin\Layout\Tabs;

public function fields(Request $request): array
{
    return [
        ID::make()->sortable(),
        Text::make('Заголовок', 'title')->rules('required', 'max:255'),

        Panel::make('Публікація', [
            Select::make('Статус', 'status')->options(['draft' => 'Чернетка', 'live' => 'Опубліковано']),
            DateTime::make('Дата публікації', 'published_at')->nullable(),
            Textarea::make('Анонс', 'excerpt')->nullable()->fullWidth(),
        ])->columns(2)->description('Коли й як допис з\'явиться на сайті.'),

        Tabs::make('Додатково', [
            Panel::make('SEO', [
                Text::make('Meta title', 'meta_title')->nullable(),
                Textarea::make('Meta description', 'meta_description')->nullable(),
            ]),
            Panel::make('Статистика', [
                Number::make('Перегляди', 'views')->exceptOnForms(),
            ]),
        ]),

        Panel::make('Службове', [
            Textarea::make('Внутрішня примітка', 'internal_note')->nullable(),
        ])->collapsed(),

        BelongsToMany::make('Теги', 'tags', Tag::class),
    ];
}

fields() повертає суміш полів, Panel і Tabs у потрібному порядку.

Panel

Panel::make(string $name, array $fields) приймає назву й список полів.

Метод За замовчуванням Опис
description(string) текст під заголовком панелі
columns(int) 1 1 або 2 колонки. Інше значення кидає InvalidArgumentException
collapsible(bool $collapsible = true) false панель можна згорнути кнопкою в заголовку; спочатку розгорнута
collapsed(bool $collapsed = true) false панель спочатку згорнута; вмикає й collapsible()

Кнопкою згортання служить заголовок, тому collapsible() і collapsed() на панелі з порожньою назвою кидають InvalidArgumentException.

Стан згортання живе лише на відкритій сторінці й не зберігається між переходами.

Дві колонки й fullWidth()

У панелі з columns(2) поля розташовуються сіткою у дві колонки, а підпис стоїть над полем. На вузьких екранах сітка складається в одну колонку.

Field::fullWidth(bool $full = true) розтягує поле на обидві колонки: зручно для Textarea та довгих текстів. В одноколонковій панелі fullWidth() нічого не змінює.

fullWidth() і width() різні речі: width() задає ширину колонки списку (Поля), fullWidth() стосується лише форм і сторінки перегляду.

Tabs

Tabs::make(?string $name, array $panels) створює набір вкладок: кожна панель стає вкладкою, назва панелі стає підписом вкладки.

  • Потрібна щонайменше одна панель, інакше InvalidArgumentException. Будь-що, крім Panel, кидає LogicException.
  • $name не показується як заголовок; це доступна назва набору вкладок для екранних читачів (aria-label). Можна передати null.
  • description() і columns() панелі діють і всередині вкладки. collapsible()/collapsed() у вкладці ігноруються.
  • Вкладки керуються з клавіатури: стрілки ←/→, Home, End.

Поля поза блоками

Поля, що стоять у fields() поза Panel і Tabs, групуються в панель без заголовка в тому місці, де вони стоять. Тому сутність без блоків виглядає так само, як раніше.

Обмеження

fields() перевіряється під час побудови полів. Помилки кидають LogicException:

Ситуація Чому
HasMany або BelongsToMany усередині Panel панелі зв'язків рендеряться окремо. Залиште їх поза блоками, вони показуються після блоків на сторінці перегляду
панель у панелі, вкладки в панелі вкладення блоків не підтримується
один атрибут двічі (у тому числі в різних блоках) атрибут має бути унікальним у межах fields()
елемент, що не є Field, Panel чи Tabs

BelongsTo можна класти в панель: це звичайне поле форми.

Видимість

Блоки враховують видимість полів (hideFromDetail, onlyOnForms, canSee, умовні замикання тощо, див. Поля) окремо для кожної сторінки й кожного запису. Панель або вкладка, у якій не лишилося жодного видимого поля, не показується. Набір вкладок без жодної вкладки теж зникає.

На список (index) блоки не впливають: колонки таблиці беруться з полів у порядку їх оголошення. Поля панелі чи вкладки стоять серед колонок там, де оголошено сам блок, тож щоб колонка була раніше, оголосіть поле чи блок вище в fields().

Помилки валідації

Після невдалого збереження форма показує, де помилки, навіть якщо поле сховане:

  • згорнута панель з помилкою розгортається;
  • у наборі вкладок відкривається перша вкладка з помилкою;
  • підпис вкладки (і заголовок панелі, яку можна згорнути) показує кількість помилок у ній.

Для екранних читачів лічильник має текст на зразок «2 помилки».

Як це передається у фронтенд

Довідково, для тих, хто читає відповіді Inertia: блоки не змінюють масив полів. Поруч передається окреме дерево layout з атрибутами полів (record.layout на сторінках перегляду й редагування, проп layout на сторінці створення). Рядки списку layout не мають.

Далі: Метрики.

Введіть запит, щоб шукати в усіх посібниках. ↑ ↓ — вибір, Enter — відкрити.