Строки

Suggest edit

Макет строк служит минимальным набором, который чаще всего используется. Его цель – объединять все необходимые элементы форм.

Строки поддерживают короткую запись без создания отдельного класса, например, когда требуется показать одно – два поля.

use Orchid\Support\Facades\Layout;
use Orchid\Screen\Fields\Input;

public function layout(): array
{
    return [
        Layout::rows([
           Input::make('example')
                ->type('text')
                ->title('Example')
        ]),
    ];
}

Для повторного использования, можно создать класс выполнив команду:

php artisan orchid:rows Appointment

В директории app/Orchid/Layouts, будет создан новый класс, в котором можно определить поля:

namespace App\Orchid\Layouts;

use Orchid\Screen\Field;
use Orchid\Screen\Layouts\Rows;
use Orchid\Screen\Fields\DateTimer;
use Orchid\Screen\Fields\TextArea;

class Appointment extends Rows
{

    /**
     * @return Field[]
     */
    protected function fields(): array
    {
        return [
            DateTimer::make()
                ->name('appointment_time')
                ->required()
                ->title('Time'),

            TextArea::make()
                ->name('doctor_notes')
                ->rows(10)
                ->required()
                ->title('Doctor notes')
                ->help('What did the patient complain about?'),
        ];
    }
}

Для использования такого класса в экране необходимо передать его название в метод layouts:

public function layout(): array
{
    return [
        Appointment::class
    ];
}

Доступ к данным экрана

Каждый раз, когда отображается слой, ему передаются данные с экрана, чтобы использовать его данные через свойство query. Например:

namespace App\Orchid\Layouts;

use Orchid\Screen\Field;
use Orchid\Screen\Layouts\Rows;
use Orchid\Screen\Fields\Input;

class Appointment extends Rows
{

    /**
     * @return Field[]
     */
    protected function fields(): array
    {
        return [
            Input::make('appointment_time')
                ->canSee($this->query->has('available'))
                ->required()
                ->title('Time'),
        ];
    }
}

Если метод query экрана возвращает указанный ключ, то поле будет отображаться:

/**
 * Query data
 *
 * @return array
 */
public function query() : array
{
    return [
      'available' => true,
    ];
}

Помимо простой проверки, Вы также можете получить значение:

$this->query->get('available');

Также имеется возможность использовать dot-нотацию:

$this->query->get('user.name');

Повторное использование слоев

Макеты легко использовать повторно, когда поля связаны с отношениями разных моделей. Во время установки у нас есть слой для определения разрешений, который используется сразу на экране редактирования пользователей и ролей. Но иногда необходимо применить один и тот же набор полей с разными значениями. Рассмотрим пример, когда нужно указать адрес.

Такой набор будет и для клиента, и для заказчика, и появится дважды на одной и той же форме (например, в заказе, доставке и накладной). Для решения этой ситуации не нужно создавать и описывать практически одинаковые макеты. Вместо этого давайте добавим логику к одному единственному слою.

namespace App\Orchid\Layouts;

use Illuminate\Support\Str;
use Orchid\Screen\Field;
use Orchid\Screen\Fields\Input;
use Orchid\Screen\Layouts\Rows;

class AddressLayout extends Rows
{
    /**
     * Used to create the title of a group of form elements.
     *
     * @var string|null
     */
    protected $title;

    /**
     * Prefix for a field name
     *
     * @var string
     */
    protected $prefix;

    /**
     * ReusableEditLayout constructor.
     *
     * @param string      $prefix
     * @param string|null $title
     */
    public function __construct(string $prefix, string $title = null)
    {
        $this->prefix = Str::finish($prefix, '.');
        $this->title = $title;
    }

    /**
     * Get the fields elements to be displayed.
     *
     * @return Field[]
     */
    protected function fields(): array
    {
        return $this->addPrefix([
            Input::make('address')
                ->required()
                ->title('Address')
                ->placeholder('177A Bleecker Street'),
        ]);
    }

    /**
     * @param Field[] $fields
     *
     * @return array
     */
    protected function addPrefix(array $fields): array
    {
        return array_map(function (Field $field) {
            return $field->set('name',
                $this->prefix . $field->get('name')
            );
        }, $fields);
    }
}

Теперь при использовании мы будем передавать значения префикса и заголовка:

public function layout(): array
{
    return [
        Layout::columns([
            new AddressLayout('order.shipping_address', 'Shipping Address'),
            new AddressLayout('order.invoice_address', 'Invoice Address'),
        ]),
    ];
}

Our Friends