Cómo llenar las listas de selección en CakePHP

Siguiendo un poco con la entrada anterior sobre El API de CakePHP: FormHelper::input de CakePHP. En esta oportunidad indico cómo rellenar un campo <select> con datos sacados de la base de datos. Gracias a Paco por su comentario sobre el tema.

Hace poco les hablé sobre FormHelper::input de CakePHP y en los comentarios recibí la pregunta de cómo lograr rellenar con valores de la base de datos la lista de seleccion. El ejemplo que publiqué en esa oportunidad presentaba un conjunto de valores fijos, pero no la manera de obtenerlos de la base de datos. Como cualquiér cosa en CakePHP es bastante sencillo, mira:

Las tablas

  • notas: (id, titulo, texto, tema_id)
  • temas: (id, tema)

Al crear una nota se debe seleccionar 1 tema. Por lo tanto debemos tener un campo de tipo select.

La vista

<?php echo $form->create("Nota");?>
    <fieldset>
        <legend><?php __("Agregar Tema");?></legend>
    <?php
        echo $form->input("titulo");
        echo $form->input("texto");
        echo $form->input("tema_id");
    ?>
    </fieldset>
<?php echo $form->end(__("Enviar", true));?>

Como ven, no hay ningún tipo de vudú, en especial con el tipo y los valores del campo tema_id de eso nos encargamos en el controlador.

El Controlador

En el controlador es en donde debes hacer la búsqueda en la base de datos y enviarlo a la vista, para ellos se hace uso de la función find del modelo que nos interesa (en este caso Tema):

<?php
// Controlador NotasController

function admin_add() {
    if (!empty($this->data)) {
        …
    }
    $temas = $this->Nota->Tema->find("list");
    $this->set("temas", $temas);
}

?>

La función find(‘list’) genera un arreglo con los datos de la manera que los espera el FormHelper, y el nombre de la variable ata (automágicamente) el campo tema_id en la vista a esos datos. Por último, debemos modificar algunas cosas en el Model:

El Modelo

En este caso específico el resultado de la llamada a find(“list”) generará un arreglo parecido a este:

array(
    [1] => 1
    [2] => 2
)

Lo cual hará que en el campo en la vista se listen números en vez de los nombres de los temas. Para solucionar esto debes agregar al modelo lo siguiente:

<?php
class Member extends AppModel {
    var $displayField = "tema";
    …
}
?>

Ahora la función find(“list”) generará un arreglo como el siguiente:

array(
    [1] => "CakePHP"
    [2] => "Desarrollo Web"
)

Si la tabla tema tuviese un campo ‘name’ o ‘title’ CakePHP lo utilizaría en lugar de mostrar el id y no sería necesario definir la variable $displayField en el modelo.

En resumen

  • El form helper de CakePHP conecta las claves foraneas con las variables del mismo nombre (en plural).
  • La función find(‘list’) obtiene la información necesaria para rellenar campos de tipo select en las vistas.
  • Si desde el controlador se pasa a la vista una variable el FormHelper lo asociará al campo de la clave foránea, sólo si el nombre de la variable coincide con el nombre de la tabla foránea (tabla temas y variable $temas para el campo tema_id)

¡Sigan horneando!

Recibe otros artículos como este automáticamente
Suscríbete vía RSS a aikon.com.ve || ¿Qué es RSS?

Twitea este artículo y sígueme en twitter @joaquin_win

Tags: , ,

Comentarios

» 14 Personas han comentado sobre “Cómo llenar las listas de selección en CakePHP”

  1. Hernán:

    Gracias! Me estaba volviendo loco para poder mostrar los nombres… no vi lo de displayfields en el manual de cake… en fin, muchas gracias.

  2. yoxs:

    hola perdon qu moleste de nuevo,,jjee

    Si la lista la lleno de esta manera, como puedo
    echo $form->input(“User.state”,array( “type” => “select”, “options” => array($htm->getStatesArray())));

    hacer que funcione esto:

    ‘default’ => ” ó
    ‘empty’ => ‘(choose one)’

    que me permita poner la primer opcion en blanco o null

  3. Joaquín Windmüller:

    ‘empty’ => true es lo que deberias usar si no me equivoco

  4. yoxs:

    sip , Gracias

    Y perdona que por todo lado salga….jejeje con mis preguntitas

  5. yoxs:

    si funciona , pero solo si no lo lleno con ‘getStatesArrray()’, pero me funciono con otro select mas simple.:-)

  6. raquel:

    GRACIAS, GRACIAS Y MIL GRACIAS POR TU EXPLICACION

  7. Alejandro Rodriguez:

    Ultra Proo Me estaba volviendo enfermo estaba que lloraba xD

    muchas gracias Amigo!!!

  8. Hector Villalobos:

    Gracias, habia estado buscando esto por mucho tiempo

  9. robert:

    Excelente tutorial amigo ya

  10. Angel:

    Muchas gracias me sirvio de mucha ayuda!!

    cuidese hermano

  11. gringo:

    justo lo que necesitaba… muchas gracias!

  12. shente:

    Muchas gracias. Me sirve para mostrar mejor los datos.

  13. guille:

    Genial el explicativo. esperando proximas publicaciones para aprender mas. saludos de argentina!

  14. Samuel:

    Hola amigos, tengo un problema, resulta que quiero mostar en los list el campo de otro Modelo relacionado con el que trabajo, como le hago???. En el manual de cake dice “El atributo displayField (‘visualizarCampo’) especifica qué *** campo de la base de datos *** debería ser usado como etiqueta para el registro”. Con lo anterior entiendo que si se puede, asi de facil como definir una variable, alguien sabe????. O si lo puedo hace de otra forma. Estaba viendo el metodo loadModel().

Deja tu respuesta

requerido

requerido

Nota: mantente dentro del tema y se respetuoso.