values multiple hacer form dinamico dependientes como php forms laravel one-to-many

php - multiple - select list laravel



Laravel-Entrada de formulario-Selección múltiple para una relación de uno a muchos (6)

@SamMonk tu técnica es genial. Pero puedes usar el asistente de formulario de laravel para hacerlo. Tengo una relación de cliente y perros.

En su controlador

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

En la vista de creación de cliente puede utilizar.

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

El tercer parámetro acepta una lista de matriz y pozo. Si define una relación en su modelo, puede hacer esto:

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

Actualización para Laravel 5.1

El método de listas ahora devuelve una Colección. Actualizando a 5.1.0

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

Uno de los requisitos en una aplicación que estoy creando es para un formulario de entrada que toma un número variable de elementos para un solo campo. Por ejemplo, los deportes que juego son (''Fútbol'', ''Tenis'', ''Croquet'').

Hay un número finito de deportes que se pueden jugar (posiblemente), por lo que estos elementos deben seleccionarse de una lista de tipo "desplegable" en la entrada del formulario.

Aguas abajo de este formulario habrá dos tablas que tienen una relación de uno a varios. Por lo tanto, a partir de lo anterior, la tabla "usuario" tendría una sola fila, mientras que la tabla "user_sports" tendría tres filas. Estos serían luego vinculados por el campo id en la tabla de usuario.

No he podido encontrar el tipo de funcionalidad donde esto se puede lograr en la documentación (tal vez no estoy buscando lo correcto). A continuación se encuentra lo más cercano que encontré, pero es solo para seleccionar un solo elemento de una lista desplegable.

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

¿Existe alguna solución alternativa que me permita poner en funcionamiento este elemento del formulario utilizando el marco Laravel?

Alternativamente, ¿hay otras formas en las que se pueda lograr este tipo de funcionalidad sin dañar la experiencia del usuario?


Este podría ser un mejor enfoque que la respuesta principal si necesita comparar 2 matrices de salida entre sí, pero use la primera matriz para completar las opciones.

Esto también es útil cuando tiene un índice (clave) no numérico o de compensación en su matriz.

<select name="roles[]" multiple> @foreach($roles as $key => $value) <option value="{{$key}}" @if(in_array($value, $compare_roles))selected="selected"@endif> {{$value}} </option> @endforeach </select>


Estoy de acuerdo con user3158900, y solo difiero ligeramente en la forma en que lo uso:

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

Sin embargo, en mi experiencia, el tercer parámetro de la selección es solo una cadena, por lo que para volver a llenar los datos de una selección múltiple he tenido que hacer algo como esto:

<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>


Laravel 4.2

@ SamMonk dio la mejor alternativa, seguí su ejemplo y construí el último fragmento de código.

<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>

En mi proyecto voy a tener muchas relaciones de mesa como esta, así que escribí una extensión para mantenerlo limpio. Para cargarlo, póngalo en algún archivo de configuración como "app / start / global.php". He creado un archivo "macros.php" en el directorio "app /" y lo he incluido en el EOF de 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; });

Uso

Lista sin elementos preseleccionados (crear vista)

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

Preselecciones (editar vista)

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

Uso completo

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


Mi solución, se hace con jquery-selected y bootstrap, el id es para jquery elegido, probado y funcionando, tuve problemas para concatenar @foreach pero ahora trabajo con double @foreach y 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>

este es el código elegido por jquery (el código blade.php no necesita este código para funcionar)

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


Una selección múltiple es en realidad una selección con un atributo multiple . Con eso en mente, debería ser tan fácil como ...

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

El primer parámetro es solo el nombre, pero después de corregirlo con [] lo devolverá como una matriz cuando use Input::get(''sports'') .

El segundo parámetro es una matriz de opciones seleccionables.

El tercer parámetro es una matriz de opciones que desea preseleccionar.

El cuarto parámetro es configurar esto como un menú desplegable de selección múltiple agregando la propiedad multiple al elemento de selección real.