armar un form_dropdown() desde una query

2,580 views
Skip to first unread message

cesar barcia

unread,
Aug 24, 2011, 12:40:58 PM8/24/11
to codeignit...@googlegroups.com
hola como estan? necesito una mano por favor.
tengo los datos recuperados de la tabla en el array $items.. de esta forma logro perfectamente armar el select(tag html)

        <select name="categoria" size="1">
            <option value="0">[seleccionar categoria]</option>
            <?php
                foreach($items as $campo){
            ?>
                    <option value="<?php echo $campo['id']; ?>"><?php echo $campo['categoria']; ?></option>
            <?php }     ?>
        </select>

el tema que despues al tratar de validad este campo con:

        $this->form_validation->set_rules('categoria', 'Categoria', 'required');

no lo verifica :( (maldicion venia bien)

entonces quiero hacer el mismo combo pero con form_dropdown()
probe con esto pero claramente no funcionada el foreach ahi dentro

    $options = array(
    '0' => 'Seleccionar Categoria',
        foreach($items as $campo){
            $campo['id'] => $campo['categoria']
        }
    );

        echo form_dropdown('cat',$options, '0')

es un ejemplo de como imagino tendria que ser.. como deberia de quedar ese array $options??? les agradezco desde ya gente.



Hugo Naccarato

unread,
Aug 24, 2011, 1:06:46 PM8/24/11
to codeignit...@googlegroups.com
Hola 
mira creo que podes probar hacer 
que cuando obtenes $items , supongo que estas haciendo algo como $itms=$query->resullt();
esto te entrega un objeto.
Pero si haces $query->result_array(); te entrega un array como el que pide form_dropdown();
Antes podes hace un print_r($items) y ver que te entraga  por que hay veces que entrega algo a si array[0]=array('id'=>''valor','id'=>''valor','id'=>''valor');
si es a si deberías hacer esto

echo form_dropdown('shirts', $items[0], 'large');

Espero poder haberte ayudado 




--
---
Para anular la suscripción a este grupo, envía un mensaje a
codeigniter-spa...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com/group/codeigniter-spanish?hl=es.

cesar barcia

unread,
Aug 25, 2011, 8:43:20 AM8/25/11
to codeignit...@googlegroups.com
hola, te agrdezco el aporte, va queriendo pero no fue la solucion. en el modelo estoy usando result_array() como dijiste y me retorna esto en la vista;

Array ( [0] => Array ( [id] => 1 [categoria] => ASP ) [1] => Array ( [id] => 2 [categoria] => PHP ) [2] => Array ( [id] => 3 [categoria] => javascript ) [3] => Array ( [id] => 5 [categoria] => jQuery ) [4] => Array ( [id] => 6 [categoria] => Otro ) )

pero al hacer esto

echo form_dropdown('cat',$items[0], 'large')

EN PANTALLA ME IMPRIME EL COMBO de esta forma seria lo que me esta mostrando en html

        <option value="">1</option>
        <option value="">ASP</option>

me arma el select pero mostrandome solo la posicion 0 con esos dos option, no se que me estara poniendo como value del option..

alguna otra sugerencia?


Ever Daniel Barreto

unread,
Aug 25, 2011, 9:24:48 AM8/25/11
to codeignit...@googlegroups.com
On Aug 25, 2011, at 8:43 AM, cesar barcia wrote:
> hola, te agrdezco el aporte, va queriendo pero no fue la solucion. en el modelo estoy usando result_array() como dijiste y me retorna esto en la vista;
> Array ( [0] => Array ( [id] => 1 [categoria] => ASP ) [1] => Array ( [id] => 2 [categoria] => PHP ) [2] => Array ( [id] => 3 [categoria] => javascript ) [3] => Array ( [id] => 5 [categoria] => jQuery ) [4] => Array ( [id] => 6 [categoria] => Otro ) )
> pero al hacer esto
> echo form_dropdown('cat',$items[0], 'large')

Creo que debería ser:

echo form_dropdown('cat',$items[0]['id'], 'large')

--
Ever Daniel Barreto
everdaniel at gmail dot com
twitter.com/everdaniel
facebook.com/everdaniel
flickr.com/photos/everdaniel
everdaniel.com

cesar barcia

unread,
Aug 25, 2011, 11:23:36 AM8/25/11
to codeignit...@googlegroups.com
no daniel tambien da error asi.. ademas los indices del array tendria que ser algo dinamico, dentro de algun loop sino como me va mostrar todos los option del select ?? me va mostrar uno solo que va corresponder al indice estatico que le asigne, o estoy equivocado?

mil gracias por las ayudas, sigo probando.

Ever Daniel Barreto

unread,
Aug 25, 2011, 11:37:48 AM8/25/11
to codeignit...@googlegroups.com
On Aug 25, 2011, at 11:23 AM, cesar barcia wrote:
> no daniel tambien da error asi.. ademas los indices del array tendria que ser algo dinamico, dentro de algun loop sino como me va mostrar todos los option del select ?? me va mostrar uno solo que va corresponder al indice estatico que le asigne, o estoy equivocado?
> mil gracias por las ayudas, sigo probando.

Mil disculpas César, recién ahora entiendo lo que querés hacer, vos querés pasarle tu array de resultados directo al helper para que te genere el dropdown, no se porqué asumi que lo que estabas queriendo hacer era definir el valor que debía estar seleccionado por defecto.

De cualquier forma, no creo que te funcione utilizando directo results_array(), vas a tener que generar un array que se parecido a:

array(
id => valor,
id => valor
)

porque creo que éste es el formato que el helper espera.

De nuevo, mil disculpas, entendí mal.

Saludos,

Damian Fernandez

unread,
Aug 25, 2011, 12:35:23 PM8/25/11
to codeignit...@googlegroups.com



Cesar asi lo hago yo
Este es un ejemplo en donde lleno un combo con los profesionales de un hostpital


// Controlador
$data['cmb_profesional'] = $this->profesional_model->get_combo();

//Modelo
function get_combo($order=null){

        $data = array();
        $data['']='Seleccione una opción';

        if ($this->db->field_exists('habilitado', $this->tabla)) $this->dbu->where('habilitado', 'SI');
         $this->db->select("$this->pk as id, apellido, nombre");
        if (is_null($order))$this->db->order_by($this->pk); else $this->db->order_by($order);
        $query = $this->db->get($this->tabla);

        foreach($query->result() as $row){
        $data[$row->id]= ucwords(strtolower($row->apellido.' '.$row->nombre));   
}

// Vista
<!-- Profesional -->
    <div>
        <?=form_label('Profesional:','profesional');?>
        <?=form_dropdown('profesional',$cmb_profesional, set_value('profesional'));?>
        <?=form_error('profesional')?>
    </div>



cesar barcia

unread,
Aug 29, 2011, 7:19:37 AM8/29/11
to codeignit...@googlegroups.com
Damian.. Gracias por el codigo, le di vueltas pero no logre aplicarlo a mi codigo, yo en el modelo lo unico que hago es esto;

        $sql = "select * from categorias";
        $res = $this->db->query($sql);
        if($res->num_rows() > 0){
            return $res->result_array();
        }else{
            return false;
        }

y en el modelo para llevar mi array $items con la categorias rexccuperadas hago esto;

        $this->load->model("marca/get_categorias");
        $data['items'] = $this->get_categorias->getcat();

estoy empezando con CI y no logro entender bien lo que haces en tu modelo. te agradezco de todas formas, sigo luchando con esto.


iMefisto

unread,
Aug 29, 2011, 7:35:54 AM8/29/11
to codeignit...@googlegroups.com
Cesar: hay que diferenciar el formato del listado devuelto por la base de datos y el listado que requiere el form_dropdown.

El arreglo retornado por el model tiene un formato similar a esto:

array(
0 => array('campo1' => 'valor01', 'campo2' => 'valor02', etc),
1 => array('campo1' => 'valor11', 'campo2' => 'valor12', etc),
2 => array('campo1' => 'valor21', 'campo2' => 'valor22', etc),
...
)

Si vos le pasaras este arreglo al drow down, cada opción te quedaría así:

<select>
<option id="0">Array()</option>
<option id="1">Array()</option>
<option id="2">Array()</option>
</select>

por eso necesitás procesar la salida del model como te sugirió Damian para darle el formato apropiado al arreglo que retorna el model.

Resumiendo: te falta un paso más en el model: tenés que reformatear: $res->result_array()

supongo que agregarías algo así:


...
$cat = array();
foreach($res->result_array() as $r)
{
  $cat[$r['id']] = $r['nombre_categoria'];
}
return $cat;
...

(estoy haciendo algunas asumpciones arbitrarias pero la idea es esa)




--

Damian Fernandez

unread,
Aug 29, 2011, 8:02:20 AM8/29/11
to codeignit...@googlegroups.com
Tal cual dice iMefisto
La clave esta en reprocesar la salida para llevarla al formato requerido por el tag <select>
que no es ni mas ni menos que esto:

$cat = array();
foreach($res->result_array() as $r)
{
  $cat[$r['id']] = $r['nombre_categoria'];
}
return $cat;


cesar barcia

unread,
Aug 31, 2011, 7:11:30 AM8/31/11
to codeignit...@googlegroups.com
Hola a todos mil gracias por las respuestas..

tal cual como dijieron resulto formateando el modelo:

        if($res->num_rows() > 0){
            $dat = array();
            foreach($res->result_array() as $r){
                $dat[$r['id']] = $r["categoria"];
            }

y en la vista con esto quedo:

echo form_dropdown('cat',$items, 2) // ese 2 es el id que quiero aparesca como selected.

estoy flojo con el trabajo de array se ve no logro comprender el porque de esto;
$dat[$r['id']] = $r["categoria"];

osea si lo mas o menos pero al verlo, yo solo no hubiera llegado hacer eso ni loco.. me podran explica un poco no mas como llegaron a pensar eso?

imefisto tiene rason a que el modelo sin este formato retorna esto:


array(
0 => array('campo1' => 'valor01', 'campo2' => 'valor02', etc),
1 => array('campo1' => 'valor11', 'campo2' => 'valor12', etc),
2 => array('campo1' => 'valor21', 'campo2' => 'valor22', etc),
...
)

y ahora al hacer esto retorna;

Array ( [1] => ASP [2] => PHP [3] => javascript [5] => jQuery [8] => Codeigniter [11] => CSS )

HAAAA NO LOGRO ENTENDERLO.

saludos gente

Daniela Blanco

unread,
Aug 31, 2011, 9:01:30 AM8/31/11
to codeignit...@googlegroups.com
Te explico:
 
1) Necesitas para la vista un arreglo que tenga como claves los value para los option del select y como valor los textos a mostrar. Por ejemplo
 
Array ( [1] => ASP [2] => PHP [3] => javascript [5] => jQuery [8] => Codeigniter [11] => CSS )
 
Generaria
 
<select>
    <opcion value="1">ASP</option>
    <opcion value="2">PHP</option>
...
</select>
 
2) Con result_array recibis un arreglo de arreglos. Es decir un arreglo que en cada posicion contiene un arrehlo, cuyas claves son los campos que seleccionaste y el valor es el contenido del campo en la base. Por ejemplo:
 
array(
0 => array('campo1' => 'valor01', 'campo2' => 'valor02', etc),
1 => array('campo1' => 'valor11', 'campo2' => 'valor12', etc),
2 => array('campo1' => 'valor21', 'campo2' => 'valor22', etc),
...
)
Aca el arreglo resultado tiene en la posicion 0 un arreglo con clave campo1 = valor01, campo2=valor02....
 
3) Para adaptar el resultado del modelo a lo que necesitas, usas un foreach para recorrerlo. En el for lo que le estas diciendo es que $r tome en cada iteracion un array del contenido de $res.

        if($res->num_rows() > 0){
            $dat = array();
            foreach($res->result_array() as $r){
                $dat[$r['id']] = $r["categoria"];
            }

Por ejemplo en la primer iteracion $r =array('campo1' => 'valor01', 'campo2' => 'valor02', etc), entonces cuando haces $r[campo1] corresponde a valor01.
De esta manera en cada iteracion podes tomar los campos de la base que te interesan pasar al select de la vista. En tu caso id y categoria.
Finalmente para armar el resultado, $dat, vas tomando como clave el id que sera tu value del select, y como valor la categoria, que sera tu texto del select.
 
Espero que este mas claro.
Saludos, Daniela


De: codeignit...@googlegroups.com [mailto:codeignit...@googlegroups.com] En nombre de cesar barcia
Enviado el: miércoles, 31 de agosto de 2011 08:12 a.m.
Para: codeignit...@googlegroups.com
Asunto: Re: [codeigniter-spanish] armar un form_dropdown() desde una query

cesar barcia

unread,
Sep 1, 2011, 7:10:22 AM9/1/11
to codeignit...@googlegroups.com
Hola buen dia,

Daniela te agredesco muchisimo esa explicacion realmente, me quedo muy claro el por que  de esto ahora: $dat[$r['id']] = $r["categoria"]; claro al retornar $data cada valor de id va hacer indice del array y contendria el valor de categoria.

A todos los que me ayudaron muchachos gracias por ese tiempo de ustedes para ayudarme con sus explicaciones.

suerte, saludos.
Reply all
Reply to author
Forward
0 new messages