Строитель форм



Описывать поля формы может быть нудным и затруднительным занятием, чтобы их легко модифицировать и использовать повторно, используется специальный строитель Orchid\Screen\Builder, задача которого состоит в генерации html-кода.

Основное использование

Для построения необходимо передать набор элементов формы и источник данных:

use Orchid\Screen\Builder;
use Orchid\Screen\Fields\Input;

$builder = new Builder([
    Input::make('name'),
]);

$html = $builder->generateForm();

Привязка данных

Для указания значения элемента, необходимо указать данные в источнике. Данные будут автоматически подставлены, по указанному ключу.

use Orchid\Screen\Builder;
use Orchid\Screen\Fields\Input;
use Orchid\Screen\Repository;

$fields = [
    Input::make('name'),
];

$repository = new Repository([
    'name' => 'Alexandr Chernyaev',
]);

$builder = new Builder($fields, $repository);

$html = $builder->generateForm();

При этом имеет возможность входить вглубь объекта используя dot-нотацию.

$fields = [
    Input::make('name.ru'),
];

$repository = new Repository([
    'name' => [
        'en' => 'Alexandr Chernyaev',
        'ru' => 'Александр Черняев',
    ],
]);

$builder = new Builder($fields, $repository);

$html = $builder->generateForm();

Так же можно указывать требуемый язык и префикс, например:

$fields = [
    Input::make('name'),
];

$repository = new Repository([
    'en' => [
        'name' => 'Alexandr Chernyaev',
    ],
    'ru' => [
        'name' => 'Александр Черняев',
    ]
]);

$builder = new Builder($fields, $repository);
$builder->setLanguage('en');

$html = $builder->generateForm();

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

Любое поле для ввода является только настройкой над представлением, которое передает данные в шаблон.

Создадим новый класс, чтобы посмотреть из чего он состоит:

namespace App\Orchid\Fields;

use Orchid\Screen\Field;

class CustomField extends Field
{
    /**
     * Blade template
     * 
     * @var string
     */
    protected $view = '';

    /**
     * Default attributes value.
     *
     * @var array
     */
    protected $attributes = [];

    /**
     * Attributes available for a particular tag.
     *
     * @var array
     */
    protected $inlineAttributes = [];

    /**
     * @param string|null $name
     *
     * @return self
     */
    public static function make(string $name = null): self
    {
        return (new static())->name($name);
    }
}

Свойство view определяет blade шаблон, которому будут переданы данные, в attributes перечисляются значения по умолчанию, а inlineAttributes определяет ключи необходимые для указания в формате html, например:

First name: <input type="text" name="name"><br>

В этом примере inline-атрибут является type и name указанный непосредственно в теге. А метод make() только для быстрой и удобной инициализации, так как любая форма которая должна добавлять или изменять данные должна ею обладать.

Обновим только что созданный класс и добавим blade шаблон, на примере указанном выше:

{{ $title }}: <input {{ $attributes }}><br>

Для того чтобы попробовать новое поле, необходимо использовать встроенный метод render():

$input = CustomField::make('name');

$html = $input->render(); // html string

В переменной html будет только что указанный шаблон, попробуем добавить некоторые элементы:

$input = CustomField::make('name')
    ->title('How your name?')
    ->placeholder('Sheldon Cooper')
    ->value('Alexandr Chernyaev');

$html = $input->render();

После обновим страницу, на ней отображается новый заголовок, вместо указанного по умолчанию, но ни placeholder, ни значение не были применены. Это потому, что они не были указаны в inlineAttributes, исправим это:

/**
 * Attributes available for a particular tag.
 *
 * @var array
 */
protected $inlineAttributes = [
    'name',
    'type',
    'placeholder',
    'value'
];

После этого каждый атрибут будет отрисован в нашем шаблоне.