Как получить доступ к полям рюкзака на пользовательской (не CRUD) странице?

#laravel-backpack

Вопрос:

Я создал пользовательскую страницу в панели администратора рюкзака. Эта страница не является грубой (не связана ни с какой моделью). На нем есть несколько форм с выбором даты, выбором входных данных и т. Д. Поэтому я пытаюсь найти способ использовать поля рюкзака для создания этих средств выбора дат и выбора входных данных. Потому что кажется неудобным встраивать пользовательские js-элементы управления в проект, так как в Backpack уже есть соответствующие поля.

Единственное решение, которое я придумал, — это создать контроллер crud для случайной модели, отключить все операции, кроме создания, использовать представление «Создать операцию» в качестве пользовательской страницы (таким образом доступны поля рюкзака) и, наконец, переопределить метод store () — чтобы предотвратить создание новой записи модели в БД.

Итак, есть ли правильный способ доступа к полям рюкзака на пользовательской (не CRUD) странице?

Ответ №1:

Поля Backpack 4.x не предназначены для использования за пределами CRUD, но вы можете это сделать.

Вариант А

По своей сути поля рюкзака являются просто видами лезвий, поэтому вы можете загрузить их с помощью помощника по лезвиям @include() . Просто убедитесь, что передали все переменные, необходимые для файла блейда. Я верю в 99% полей, которые будут $field $crud переменными, поэтому это будет работать:

     @php
        // set the CRUD model to something (anything)
        // but ideally it'd be the model of the entity that has the form
        $crud = app()->make('crud');
        $crud->setModel(AppModelsMonster::class);
    @endphp

    @include('crud::fields.number', [
        'crud' => $crud,
        'field' => [
            'name' => 'price',
            'label' => 'Price',
            'prefix' => '

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

Этот способ очень прост, но у него есть большой недостаток, если вы спросите меня. Определение поля должно быть на 100% правильным и полным, вы теряете всю магию и логику предположений, которые обычно делает Рюкзак, чтобы облегчить вашу жизнь, когда вы добавляете поле с помощью  addField()  . Вот почему в большинстве случаев я думаю, что удобнее выбрать вариант B.

Вариант В

Вместо того, чтобы вручную загружать все поля каждого вида , добавьте их с помощью addField() , а затем загрузите их все так же, как это делает Backpack в операции создания или обновления:
     @php
        $crud = app()->make('crud');
        $crud->setModel(AppModelsMonster::class);
        $crud->addField([
            'name' => 'price',
            'label' => 'Price',
            'prefix' => '

Вышеизложенное приведет к такому результату:
введите описание изображения здесь

Преимущество этого второго варианта заключается в том, что вы можете "забыть" упомянуть что-либо в определении поля, и Рюкзак примет это, вы можете использовать свободный синтаксис, вы действительно можете использовать большинство функций рюкзака...


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

Этот способ очень прост, но у него есть большой недостаток, если вы спросите меня. Определение поля должно быть на 100% правильным и полным, вы теряете всю магию и логику предположений, которые обычно делает Рюкзак, чтобы облегчить вашу жизнь, когда вы добавляете поле с помощью addField() . Вот почему в большинстве случаев я думаю, что удобнее выбрать вариант B.

Вариант В

Вместо того, чтобы вручную загружать все поля каждого вида , добавьте их с помощью addField() , а затем загрузите их все так же, как это делает Backpack в операции создания или обновления:


Вышеизложенное приведет к такому результату:
введите описание изображения здесь

Преимущество этого второго варианта заключается в том, что вы можете "забыть" упомянуть что-либо в определении поля, и Рюкзак примет это, вы можете использовать свободный синтаксис, вы действительно можете использовать большинство функций рюкзака...

]);
@endphp

<form method="post">
@include('crud::form_content', [ 'fields' => $crud->fields(), 'action' => 'create' ])
</form>

Вышеизложенное приведет к такому результату:
введите описание изображения здесь

Преимущество этого второго варианта заключается в том, что вы можете «забыть» упомянуть что-либо в определении поля, и Рюкзак примет это, вы можете использовать свободный синтаксис, вы действительно можете использовать большинство функций рюкзака…

]
])

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

Этот способ очень прост, но у него есть большой недостаток, если вы спросите меня. Определение поля должно быть на 100% правильным и полным, вы теряете всю магию и логику предположений, которые обычно делает Рюкзак, чтобы облегчить вашу жизнь, когда вы добавляете поле с помощью addField() . Вот почему в большинстве случаев я думаю, что удобнее выбрать вариант B.

Вариант В

Вместо того, чтобы вручную загружать все поля каждого вида , добавьте их с помощью addField() , а затем загрузите их все так же, как это делает Backpack в операции создания или обновления:


Вышеизложенное приведет к такому результату:
введите описание изображения здесь

Преимущество этого второго варианта заключается в том, что вы можете «забыть» упомянуть что-либо в определении поля, и Рюкзак примет это, вы можете использовать свободный синтаксис, вы действительно можете использовать большинство функций рюкзака…