Форма может быть любым из поддерживаемых способов вывода списка, формой с табами или самой формой. Вы можете комбинировать их по желанию.

..->createAndEdit(function ()
{
    $form = AdminForm::form();
    $form->items([
        // здесь описание элементов формы
    ]);
    return $form;
})

Форма с табами

..->createAndEdit(function ()
{
    $form = AdminForm::tabbed();
    $form->items([
        'Main Tab Label' => [
            // здесь описание элементов формы
        ],
        'Second Tab Label' => [
            // здесь описание элементов формы
        ],
    ]);
    return $form;
})

Элементы формы

Вы можете создавать элементы формы следующим кодом:

FormItem::{type}('{field name}', '{label}')

Поддерживаемые элементы формы

Валидация

FormItem::text('title')->required()->unique()->validationRule('my-custom-rule')

Подробнее смотрите раздел валидация.

Значение по умолчанию

Вы можете указать значение по умолчанию для элемента формы.

FormItem::text('title')->defaultValue('My new item title')

Регистрация собственного элемента формы

Вы можете регистрировать собственные элементы формы в файле bootstrap.php в директории bootstrapDirectory (по умолчанию app/admin/bootstrap.php).

FormItem::register('{type}', 'App\MyFormItem')

Ваш класс должен расширять SleepingOwl\Admin\FormItems\BaseFormItem (если вам не нужно получание значения модели по названия) или SleepingOwl\Admin\FormItems\NamedFormItem (в противном случае).

Добавление скриптов и стилей

Вы можете добавить свои скрипты и стили на страницу, которая использует ваш элемент формы.

public function initialize()
{
    parent::initialize();

    AssetManager::addScript(asset('my.js'));
    AssetManager::addStyle(asset('my.css'));
}

Пример

bootstrap.php

FormItem::register('myItem', 'Acme\MyItem')

Acme/MyItem.php

use SleepingOwl\Admin\FormItems\NamedFormItem;

class MyItem extends NamedFormItem
{

    public function render()
    {
        $params = $this->getParams();
        // $params will contain 'name', 'label', 'value' and 'instance'
        return view('my-form-item-view, $params);
    }

}

Использование в конфигурации модели

FormItem::myItem('field')->label('My Label');

Columns

Позволяет разбивать форму на несколько столбцов. Используйте метод columns() для указания столбцов.

FormItem::columns()->columns([
    [
        FormItem::...
    ],
    [
        ...
    ],
])

Text

Создает текстовое поле.

FormItem::text('title', 'Title')

Textaddon

Создает текстовое поле с вставкой вначале или вконце.

По умолчанию расположение вставки - before.

FormItem::textaddon('url', 'Url')->addon('http://my-site.com/')->placement('before')
FormItem::textaddon('price', 'Price')->addon('$')->placement('after')

Hidden

Создает скрытое поле. Полезно в связке с параметрами вида (подробнее).

FormItem::hidden('field')

Checkbox

Создает checkbox с заголовком.

FormItem::checkbox('active', 'Active')

Date

Создает поле выбора даты.

FormItem::date('date', 'Date')

Формат даты по умолчанию описан в конфигурации в поле dateFormat. Вы можете переопределить его используя метод format($format).

FormItem::date('date', 'Date')->format('d.m.Y')

Time

Создает поле выбора времени.

FormItem::time('time', 'Time')

Формат даты по умолчанию описан в конфигурации в поле timeFormat. Вы можете переопределить его используя метод format($format).

FormItem::time('time', 'Time')->format('H:i')

Отображение секунд

FormItem::time('time', 'Time')->format('H:i:s')->seconds(true)

Timestamp

Создает поле выбора даты и времени.

FormItem::timestamp('timestamp', 'Timestamp')

Формат даты по умолчанию описан в конфигурации в поле datetimeFormat. Вы можете переопределить его используя метод format($format).

FormItem::timestamp('timestamp', 'Timestamp')->format('d.m.Y H:i')

Отображение секунд

FormItem::timestamp('timestamp', 'Timestamp')->format('d.m.Y H:i:s')->seconds(true)

File

Создает поле загрузки файла. Файл будет загружен в директорию imagesUploadDirectory из конфигурации. Если вам необходимо другое расположение файла - перемещайте его вручную в вашей модели.

FormItem::file('file', 'File')

Image

Создает поле загрузки изображения с предпросмотром. Изображение будет загружено в директорию imagesUploadDirectory из конфигурации. Если вам необходимо другое расположение файла - перемещайте его вручную в вашей модели.

FormItem::image('photo', 'Photo')

Images

Создает поле загрузки нескольких изображений с предпросмотром. Изображения будут загружены в директорию imagesUploadDirectory из конфигурации. Если вам необходимо другое расположение файла - перемещайте его вручную в вашей модели.

Ваша модель должна реализовывать field accessors для данного поля и возвращать массив урлов изображений и сохранять массив.

FormItem::images('photos', 'Photos')

Самый простой способ загружать и сохранять изображения - поле типа text с аксессором:

public function getPhotosAttribute($value)
{
    return preg_split('/,/', $value, -1, PREG_SPLIT_NO_EMPTY);
}

public function setPhotosAttribute($photos)
{
    $this->attributes['photos'] = implode(',', $photos);
}

Select

Создает поле выбора.

FormItem::select('category_id', 'Category')

Предоставление данных

Массивом:

->options([1 => 'First', 2 => 'Second', 3 => 'Third])

При помощи enum (значения массива используются в качестве ключей):

->enum(['First', 'Second', 'Third])

При помощи модели:

->model('App\MyModel')->display('title')

Обнуляемое поле

Вы можете пометить элемент как обнуляемый:

…->nullable()

Multiselect

Создает поле выбора нескольких записей.

FormItem::multiselect('categories', 'Categories')

Предоставление данных

Массивом:

->options([1 => 'First', 2 => 'Second', 3 => 'Third])

При помощи enum (значения массива используются в качестве ключей):

->enum(['First', 'Second', 'Third])

При помощи модели:

->model('App\MyModel')->display('title')

Сохранение данных

Создайте новый метод мутатора в вашей модели. Пример:

public function setCategoriesAttribute($categories)
{
    $this->categories()->detach();
    if ( ! $categories) return;
    if ( ! $this->exists) $this->save();

    $this->categories()->attach($categories);
}

Метод categories() определяет связь belongs-to-many в данном случае.


Radio

Создает поле radio.

FormItem::radio('category_id', 'Category')

Предоставление данных

Массивом:

->options([1 => 'First', 2 => 'Second', 3 => 'Third])

При помощи enum (значения массива используются в качестве ключей):

->enum(['First', 'Second', 'Third])

При помощи модели:

->model('App\MyModel')->display('title')

Обнуляемое поле

Вы можете пометить элемент как обнуляемый:

…->nullable()

Textarea

Создает поле textarea.

FormItem::textarea('text', 'Text')

CKEditor

Создает поле ckeditor.

FormItem::ckeditor('text', 'Text')

Custom

Создает произвольный элемент формы. Вы должны указать метод отображения (display()) и метод сохранения (callback()).

FormItem::custom()->display(function ($instance)
{
    return view('my-form-item', ['instance' => $instance]);
})->callback(function ($instance)
{
    $instance->myField = 12;
})

View

Вставляет ваш произвольный view. Вы можете выводить там что вам угодно и вставлять скрипты. В ваш view будет передана переменная $instance.

FormItem::view('admin.article.view')