Как реализовать custom_checklist_from_array? Как контрольный список, но данные вводятся в CrudController

Я хочу использовать поле контрольного списка в рюкзаке laravel, но он говорит, что нам нужна связь с другой таблицей. Но я хотел бы поместить параметры в свой CrudController, например, select_from_array.

Я понятия не имею, как настроить это поле.

Я хочу использовать контрольный список вместо select_from_array


person Andrew Wijaya    schedule 06.05.2019    source источник


Ответы (2)


Создайте файл в resources/views/vendor/backpack/crud/fields/checklist_direct.blade.php со следующим содержимым (checklist_direct может быть любым именем по вашему выбору):

<!-- checklist with directly provided options -->
<!-- checklist_filtered -->
@php
    $options = isset($field['options']) ? $field['options'] : [];
@endphp

<div @include('crud::inc.field_wrapper_attributes') >
    <label>{!! $field['label'] !!}</label>
    @include('crud::inc.field_translatable_icon')
    <?php $entity_model = $crud->getModel(); ?>

    <div class="row">
        @foreach ($options as $option)
            <div class="col-sm-4">
                <div class="checkbox">
                    <label>
                        <input type="checkbox"
                               name="{{ $field['name'] }}[]"
                               value="{{ $option }}"
                               @if( ( old( $field["name"] ) && in_array($option , old( $field["name"])) ) )
                                  checked = "checked"
                               @endif > {!! $option !!}
                    </label>
                </div>
            </div>
        @endforeach
    </div>

    {{-- HINT --}}
    @if (isset($field['hint']))
        <p class="help-block">{!! $field['hint'] !!}</p>
    @endif
</div>

Затем обновите свой вызов addField в вашем контроллере, чтобы он выглядел примерно так:

   $this->crud->addField([
        'label'     => 'Printers',
        'type'      => 'checklist_direct',
        'name'      => 'printer',
        'attribute' => 'printer_name',
        'options'   => ['HP', 'Cannon', 'Dell'],
    ]);

ПРИМЕЧАНИЕ. Вы также можете рассмотреть возможность использования столбца перечисления в своей таблице и использования шаблона поля enum.blade.php или, возможно, создания пользовательского поля перечисления, в котором используются флажки вместо поля выбора.

person Wesley Smith    schedule 08.05.2019
comment
Я получаю сообщение об ошибке при добавлении элемента, преобразование массива в строку (SQL: вставить в... как это исправить? - person Andrew Wijaya; 09.05.2019
comment
ошибка показывает, что значение поля является массивом. И не может быть преобразован в строку. - person Andrew Wijaya; 09.05.2019
comment
Извини, я виноват. Я забыл поставить protected $casts в свою модель. Теперь все работает отлично. Спасибо - person Andrew Wijaya; 09.05.2019

Мне нужно было сделать некоторые обновления кода. Я создаю файл в resources/views/vendor/backpack/crud/fields/checklist_array.blade.php со следующим содержимым (checklist_array может быть любым именем, которое вы выберете):

Я обновил код для приведенного ниже. Одно из обновлений, которое я сделал, заключалось в том, что при редактировании он не приносил выбранные значения. Теперь вы выполняете скрипт в javascript

<!-- checklist with directly provided options -->
<!-- checklist_filtered -->
@php
$options = isset($field['options']) ? $field['options'] : [];

// calculate the value of the hidden input
$field['value'] = old(square_brackets_to_dots($field['name'])) ?? ($field['value'] ?? ($field['default'] ?? []));

if (is_string($field['value'])) {
    $field['value'] = json_decode($field['value']);
} 

// define the init-function on the wrapper
$field['wrapper']['data-init-function'] = $field['wrapper']['data-init-function'] ?? 'bpFieldInitChecklist';
@endphp

@include('crud::fields.inc.wrapper_start')
<label>{!! $field['label'] !!}</label>
@include('crud::fields.inc.translatable_icon')

<input type="hidden" value='@json($field['value'])' name="{{ $field['name'] }}">

<div class="row">
    @foreach ($options as $option)
    <div class="col-sm-4">
        <div class="checkbox">
            <label>
                <input type="checkbox" name="{{ $field['name'] }}[]" value="{{ $option }}" @if( ( old( $field["name"] )
                    && in_array($option , old( $field["name"])) ) ) checked="checked" @endif> {!! $option !!}
            </label>
        </div>
    </div>
    @endforeach
</div>

{{-- HINT --}}
@if (isset($field['hint']))
<p class="help-block">{!! $field['hint'] !!}</p>
@endif
@include('crud::fields.inc.wrapper_end')

{{-- ########################################## --}}
{{-- Extra CSS and JS for this particular field --}}
{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}}
@if ($crud->fieldTypeNotLoaded($field))
@php
$crud->markFieldTypeAsLoaded($field);
@endphp
{{-- FIELD JS - will be loaded in the after_scripts section --}}
@push('crud_fields_scripts')
<script>
    function bpFieldInitChecklist(element) {
                //console.log(element);
                var hidden_input = element.find('input[type=hidden]');
                var selected_options = JSON.parse(hidden_input.val() || '[]');
                var checkboxes = element.find('input[type=checkbox]');
                var container = element.find('.row');

                // set the default checked/unchecked states on checklist options
                checkboxes.each(function(key, option) {
                    var id = $(this).val();
                    if (selected_options.map(String).includes(id)) {
                        $(this).prop('checked', 'checked');
                    } else {
                        $(this).prop('checked', false);
                    }
                });

                // when a checkbox is clicked
                // set the correct value on the hidden input
                checkboxes.click(function() {
                    var newValue = [];

                    checkboxes.each(function() {
                        if ($(this).is(':checked')) {
                            var id = $(this).val();
                            newValue.push(id);
                        }
                    });

                    hidden_input.val(JSON.stringify(newValue));

                });
            }

</script>
@endpush

@endif
{{-- End of Extra CSS and JS --}}
{{-- ########################################## --}}
   //form
   $this->crud->addField([
        'label'     => 'Printers',
        'type'      => 'checklist_direct',
        'name'      => 'printer',
        'attribute' => 'printer_name',
        'options'   => ['HP', 'Cannon', 'Dell'],
    ]);
 
//model
protected $casts = [
        ...
        'printer' => 'array',
    ];
person Jackson Meires    schedule 19.06.2021