Saltar al contenido

Laravel – Entrada de formulario – Selección múltiple para una relación de uno a muchos

Solución:

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 repoblar datos para una selección múltiple, tuve 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>

@SamMonk, tu técnica es genial. Pero puedes usar laravel form helper para hacerlo. Tengo una relación con el cliente y los perros.

En tu 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 un 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. Actualización a 5.1.0

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

Laravel 4.2

@SamMonk di la mejor alternativa, seguí su ejemplo y construí la pieza final 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 tablas como esta, así que escribí una extensión para mantenerla limpia. Para cargarlo, póngalo en algún archivo de configuración como “app / start / global.php”. Creé un archivo “macros.php” en el directorio “app /” y lo incluí 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 (vista de edición)

 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']) 
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *