Laravel – ввод формы – множественный выбор для отношения одного к другому

Одним из требований в приложении, которое я создаю, является ввод формы, который принимает различное количество элементов для одного поля. Например, спорт, в котором я играю («Футбол», «Теннис», «Крокет»).

Есть конечное количество видов спорта, которые можно играть (возможно), поэтому эти элементы должны быть выбраны из списка типов «drop down» в форме ввода.

Внизу этой формы будут две таблицы, которые имеют отношение «один ко многим». Таким образом, из вышеизложенного таблица «user» будет иметь одну строку, а таблица «user_sports» – три строки. Затем они будут связаны полем id в пользовательской таблице.


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

http://laravel.com/docs/html#drop-down-lists


Есть ли обходной путь, который позволит мне получить этот элемент формы и запустить с помощью Laravel framework?

Кроме того, существуют ли другие способы обеспечения такого рода функциональности без ущерба для пользователя?

    Я согласен с user3158900, и я немного отличаюсь только тем, как я его использую:

    {{Form::label('sports', 'Sports')}} {{Form::select('sports',$aSports,null,array('multiple'=>'multiple','name'=>'sports[]'))}} 

    Однако, по моему опыту, третий параметр select – это только строка, поэтому для повторной обработки данных для множественного выбора мне пришлось сделать что-то вроде этого:

     <select multiple="multiple" name="sports[]" id="sports"> @foreach($aSports as $aKey => $aSport) @foreach($aItem->sports as $aItemKey => $aItemSport) <option value="{{$aKey}}" @if($aKey == $aItemKey)selected="selected"@endif>{{$aSport}}</option> @endforeach @endforeach </select> 

    @SamMonk ваша техника великолепна. Но вы можете использовать помощник формы laravel для этого. У меня есть отношения с клиентом и собаками.

    На вашем контроллере

     $dogs = Dog::lists('name', 'id'); 

    В окне просмотра клиента вы можете использовать.

     {{ Form::label('dogs', 'Dogs') }} {{ Form::select('dogs[]', $dogs, null, ['id' => 'dogs', 'multiple' => 'multiple']) }} 

    Третий параметр принимает список массива. Если вы определяете отношения на своей модели, вы можете сделать это:

     {{ Form::label('dogs', 'Dogs') }} {{ Form::select('dogs[]', $dogs, $customer->dogs->lists('id'), ['id' => 'dogs', 'multiple' => 'multiple']) }} 

    Обновление для Laravel 5.1

    Теперь метод list возвращает коллекцию. Обновление до 5.1.0

     {!! Form::label('dogs', 'Dogs') !!} {!! Form::select('dogs[]', $dogs, $customer->dogs->lists('id')->all(), ['id' => 'dogs', 'multiple' => 'multiple']) !!} 

    Laravel 4.2

    @ SamMonk дал лучшую альтернативу, я последовал его примеру и построил последнюю часть кода

     <select class="chosen-select" multiple="multiple" name="places[]" id="places"> @foreach($places as $place) <option value="{{$place->id}}" @foreach($job->places as $p) @if($place->id == $p->id)selected="selected"@endif @endforeach>{{$place->name}}</option> @endforeach </select> 

    В моем проекте у меня будет много табличных отношений, поэтому я написал расширение, чтобы сохранить его в чистоте. Чтобы загрузить его, поместите его в некоторый файл конфигурации, например, «app / start / global.php». Я создал файл «macros.php» в каталоге «app /» и включил его в EOF global.php

     // app/start/global.php require app_path().'/macros.php'; // macros.php Form::macro("chosen", function($name, $defaults = array(), $selected = array(), $options = array()){ // For empty Input::old($name) session, $selected is an empty string if(!$selected) $selected = array(); $opts = array( 'class' => 'chosen-select', 'id' => $name, 'name' => $name . '[]', 'multiple' => true ); $options = array_merge($opts, $options); $attributes = HTML::attributes($options); // need an empty array to send if all values are unselected $ret = '<input type="hidden" name="' . HTML::entities($name) . '[]">'; $ret .= '<select ' . $attributes . '>'; foreach($defaults as $def) { $ret .= '<option value="' . $def->id . '"'; foreach($selected as $p) { // session array or passed stdClass obj $current = @$p->id ? $p->id: $p; if($def->id == $current) { $ret .= ' selected="selected"'; } } $ret .= '>' . HTML::entities($def->name) . '</option>'; } $ret .= '</select>'; return $ret; }); 

    Применение

    Список без предварительно выбранных элементов (создать представление)

     {{ Form::chosen('places', $places, Input::old('places')) }} 

    Предселектора (редактирование)

     {{ Form::chosen('places', $places, $job->places) }} 

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

     {{ Form::chosen('places', $places, $job->places, ['multiple': false, 'title': 'I\'ma selectbox', 'class': 'bootstrap_is_mainstream']) }} 

    Множественный выбор – это просто выбор с multiple атрибутами. Имея это в виду, это должно быть так же просто, как …

     Form::select('sports[]', $sports, null, array('multiple')) 

    Первый параметр – это просто имя, но пост-исправление его с помощью [] вернет его в виде массива, когда вы используете Input::get('sports') .

    Второй параметр – это массив выбираемых параметров.

    Третий параметр – это массив параметров, которые вы хотите предварительно выбрать.

    Четвертый параметр на самом деле устанавливает это как раскрывающееся меню с множественным выбором, добавляя multiple свойство к фактическому элементу выбора.

    Мое решение, это сделать с выбранным jquery и bootstrap, идентификатор для jquery выбран, проверен и работает, у меня были проблемы с конкатенацией @foreach, но теперь мы работаем с двойным @foreach и double @if:

      <div class="form-group"> <label for="tagLabel">Tags: </label> <select multiple class="chosen-tag" id="tagLabel" name="tag_id[]" required> @foreach($tags as $id => $name) @if (is_array(Request::old('tag_id'))) <option value="{{ $id }}" @foreach (Request::old('tag_id') as $idold) @if($idold==$id) selected @endif @endforeach style="padding:5px;">{{ $name }}</option> @else <option value="{{ $id }}" style="padding:5px;">{{ $name }}</option> @endif @endforeach </select> </div> 

    это выбранный код por jquery (код blade.php не нуждается в этом коде для работы)

      $(".chosen-tag").chosen({ placeholder_text_multiple: "Selecciona alguna etiqueta", no_results_text: "No hay resultados para la busqueda", search_contains: true, width: '500px' });