Как установить пользовательский атрибут данных в параметр с помощью Laravel Collective

У меня есть форма, внутри у меня есть выбор с некоторыми параметрами, и я использую коллективные формы Laravel для ее создания, у меня есть что-то вроде:

{!! Form::select('size', $data, $selecteds, ['multiple' => true]) !!}

До сих пор все шло хорошо, но теперь мне нужно установить атрибут data-section для каждой опции, как мне это сделать?


person Sredny M Casanova    schedule 27.01.2017    source источник


Ответы (3)


Недавно мне пришлось сделать то же самое. Изучив класс FormBuilder для написания собственной маркировки, я обнаружил, что метод select() на самом деле имеет недокументированный пятый параметр для атрибутов опции:

Form::select('size', $data, $selecteds, ['multiple' => true], $optionAttributes)

Индекс должен соответствовать значению опции, например:

$optionAttributes = [
    'S' => [
        'data-title' => 'Small',
        'data-surcharge' => '0',
    ],
    'M' => [
        'data-title' => 'Medium',
        'data-surcharge' => '5',
    ],
    'L' => [
        'data-title' => 'Large',
        'data-surcharge' => '10',
    ],
];

В итоге я написал марку, которая генерирует этот массив на основе коллекции, а затем использует метод select() по умолчанию. Что-то такое:

\Form::macro('locationSelect', function ($name, $value = null, $attributes = []) {
    // Get all locations from the DB
    $locations = \App\Location::all();

    // Make an id=>title Array for the <option>s
    $list = $locations->pluck('title', 'id')->toArray();

    // Generate all data-attributes per option
    $optionAttributes = [];
    foreach ($locations as $location) {
        $optionAttributes[$location->id] = [
            'data-icon' => $location->icon,
            'data-something' => $location->some_attribute,
        ];
    }

    // Use default select() method of the FormBuilder
    return $this->select($name, $list, $value, $attributes, $optionAttributes);
});

Очень удобно.

{{ Form::locationSelect('location_id') }}

person J-F    schedule 04.09.2017

Вы можете передать атрибуты опции в качестве пятого параметра (версия 5.8), как это

$optionParameters = collect($optionsArray)->mapWithKeys(function ($item) {
            return [$item[id] => ['data-anything' => $item['anything']]];
        })->all();

И выберите будет выглядеть

{!! Form::select('name', $optionsArray, null, ['class' => 'form-control', 'placeholder' => 'Select'], $optionParameters) !!}

Я думаю, что это намного проще и чище, чем создавать макросы

person Qudratxo'ja Musayev    schedule 16.11.2020

Добавьте его к 4-му аргументу, который является массивом:

{!! Form::select('size', $data, $selecteds, ['data-attribute' => 'John Smith', 'multiple' => true]) !!}
person Alexey Mezenin    schedule 27.01.2017
comment
а что, добавит data-атрибут в выборку? У меня есть другое значение атрибута данных для каждой опции, потому что я использую его в javascript. - person Sredny M Casanova; 27.01.2017
comment
Он добавит атрибут к элементу select. Если вы хотите добавить атрибут к каждому option, вы можете создать пользовательский макрос. . Или вы можете добавить такие значения, как value:data, и легко использовать их в JS. Но в этом случае вам нужно будет получить значение вручную после отправки формы или просто использовать обычный HTML для создания списка select. - person Alexey Mezenin; 27.01.2017