如何使用Laravel Collective将自定义数据属性设置为选项

时间:2017-01-27 13:47:52

标签: php laravel laravel-5.2 laravelcollective

我有一个表单,里面我有一些选项,我正在使用Laravel Collective Forms来构建它,我有类似的东西:

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

直到这里一切顺利,但现在我需要为每个选项设置data-section属性,我该如何制作呢?

3 个答案:

答案 0 :(得分:4)

我最近不得不做同样的事情。在检查FormBuilder类以编写我自己的marco之后,我发现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',
    ],
];

所以我最后编写了一个基于集合生成此数组的marco,然后使用默认的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') }}

答案 1 :(得分:2)

将其添加到第四个参数,即数组:

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

答案 2 :(得分:1)

您可以像这样将选项属性作为第五个参数(版本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) !!}

我认为这比创建宏要简单和干净