pasar resultado de una consulta a un form_dropdown

529 views
Skip to first unread message

diego

unread,
May 22, 2011, 10:48:42 PM5/22/11
to codeignit...@googlegroups.com
Hola a todos.
acabo de darme cuena que un form_dropdown no acepta un active record como parametro, solo un array

echo form_dropdown('shirts', $options, 'large');


de que manera, puedo pasarle el resultado de una consulta?

<?php
class State_model extends CI_Model {
   
    function all_states()
    {
       
        $this->db->select('id, name');
        $this->db->from('states');
        $this->db->order_by('name','asc');
        $query = $this->db->get();
       

        return ?????;
       
   
    }
   
}

gracias!!!!

diego

Fásiko

unread,
May 23, 2011, 4:36:07 AM5/23/11
to codeignit...@googlegroups.com
Según la documentación, sólo tendrás que armar el array a tu gusto con los datos que recibas de la consulta


$options = array(
                  'small'  => 'Small Shirt',
                  'med'    => 'Medium Shirt',
                  'large'   => 'Large Shirt',
                  'xlarge' => 'Extra Large Shirt',
                );

$shirts_on_sale = array('small', 'large');


echo form_dropdown('shirts', $options, 'large');

// Would produce:

<select name="shirts">
<option value="small">Small Shirt</option>
<option value="med">Medium Shirt</option>
<option value="large" selected="selected">Large Shirt</option>
<option value="xlarge">Extra Large Shirt</option>
</select>

echo form_dropdown('shirts', $options, $shirts_on_sale);

// Would produce:

<select name="shirts" multiple="multiple">
<option value="small" selected="selected">Small Shirt</option>
<option value="med">Medium Shirt</option>
<option value="large" selected="selected">Large Shirt</option>
<option value="xlarge">Extra Large Shirt</option>
</select>



2011/5/23 diego <dieg...@gmail.com>

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

Carlos Mora

unread,
May 23, 2011, 6:22:28 AM5/23/11
to codeignit...@googlegroups.com
>         return ?????;

$query->result_array()

diego

unread,
May 23, 2011, 9:02:18 AM5/23/11
to codeignit...@googlegroups.com
si.. probe asi mismo pero me genera un <optgroup> por  cada registro!!

2011/5/23 Carlos Mora <carlosan...@gmail.com>
>         return ?????;

$query->result_array()

Carlos Mora

unread,
May 23, 2011, 9:19:04 AM5/23/11
to codeignit...@googlegroups.com
> si.. probe asi mismo pero me genera un <optgroup> por  cada registro!!

Cierto,
$aDatos = array();
foreach( $query->result_array() as $row )
$aDatos[$row['id_o_la_columna_cuyo_valor_debe_retornar']] =
$row['campo_descriptivo_o_lo_que_quieres_que_muestre'];

y usas $aDatos en el form_select

diego

unread,
May 23, 2011, 12:04:33 PM5/23/11
to codeignit...@googlegroups.com
aca dejo la solucion x si a alguien le sirve.


<?php
class State_model extends CI_Model {
   
    function all_states()
    {
       
        $this->db->select('id, name');
        $this->db->from('states');
        $this->db->order_by('name','asc');
        $query = $this->db->get();
       
        foreach ($query->result() as $row)
        {
            $array[$row->id] = $row->name;
        }
       
        return $array;
   
    }
   
}

2011/5/23 Carlos Mora <carlosan...@gmail.com>

--

edherrera

unread,
May 23, 2011, 12:35:44 PM5/23/11
to CodeIgniter-spanish
Así es como lo hago, espero te sirva.
Controlador:
function states(){
$datos['estados'] = $this->State_model->all_states();
$this->load->view('estados',$datos);
}
Vista:
<?php
if ($estados != false) {
echo '<select name="estados_select">'."\n";
foreach($estados as $i => $edo)
{
echo '<option value="'.$edo[id'].'">';
echo $edo['name'];
echo '</option>'."\n";
}
echo '</select>'."\n";
}
?>


Modelo:
function all_satates() {
$this->db->select('id,name');
$this->db->from('states');
$this->db->order_by('name','asc');
$q2 = $this->db->get();
if ($q2->num_rows() > 0) {
foreach ($q2->result_array() as $row2){
$data[] = $row2;
}
}
else
$data = false;

return($data);
}

josepzin

unread,
May 23, 2011, 5:09:33 PM5/23/11
to CodeIgniter-spanish
Así lo hago yo

On 23 mayo, 12:04, diego <diegui...@gmail.com> wrote:
> aca dejo la solucion x si a alguien le sirve.
>
> <?php
> class State_model extends CI_Model {
>
>     function all_states()
>     {
>
>         $this->db->select('id, name');
>         $this->db->from('states');
>         $this->db->order_by('name','asc');
>         $query = $this->db->get();
>
>         foreach ($query->result() as $row)
>         {
>             $array[$row->id] = $row->name;
>         }
>
>         return $array;
>
>     }
>
> }
>
> 2011/5/23 Carlos Mora <carlosantoniom...@gmail.com>

Isern Palaus

unread,
May 23, 2011, 5:39:52 PM5/23/11
to codeignit...@googlegroups.com
Hola,

Yo no se si esto que haces es lo m�s correcto. �Te interesa NO mostrar
el <select name="estados_select" /> si el modelo no te ha devuelto datos?

Yo soy de la opini�n de que lo correcto no es devolver false. FALSE se
devuelve cuando una cosa NO ha funcionado. �Qu� significa eso? Que si tu
consulta a la base de datos NO ha fallado no debe devolver FALSE, debe
devolver un valor vac�o.

Yo har�a (y si lo haces con PHP5 recortas mucho):

public function all_states()
{

$return = array();

$query = $this->db->select("id,name")->order_by("name")->get("states");

foreach($query->result() as $row)
$return[$row->id] = $row->name;

return $return;
}

En el view (y usando la sintaxis alternativa ya que ODIO en un view
poner echo "<select ..."):

<select name="estados_select">
<?php foreach($estados as $id => $value): ?>
<option value="<?php echo $id; ?>">
<?php echo $value; ?>
</option>
<?php endforeach; ?>
</select>

De este modo no tienes que comprobar que existan estados. Tengas o no
estados, la consulta es correcta y si no tienes estados en la base de
datos no significa que la consulta haya fallado.


Para aquellos que quieran profundizar un poco m�s, comento varios
cambios que he hecho en el c�digo.

Modelo
------

Primero de todo, como seguramente estaremos usando PHP5, aunque el
framework sea para PHP4/5 podemos usar el "method chaining":
http://codeigniter.com/user_guide/database/active_record.html#chaining

De modo que:

$this->db->select('id,name');
$this->db->from('states');
$this->db->order_by('name','asc');
$q2 = $this->db->get();

Es lo mismo que:

$q2 = $this->db->select("id, name")->from("states")->order_by("name",
"asc")->get();

Aunque lo podemos reducir bastante m�s ya que si en get() pasamos un
parametro, este ser� el de la tabla, es decir:

$this->db->from("states")->get();

Es lo mismo que:

$this->db->get("states");

Por otra parte, el segundo parametro de order_by por defecto es ASC.
Podemos dejarlo para saber como queremos ordenar, pero sabiendo para que es:

$this->db->order_by('name','asc')->get("states");

Es lo mismo que:

$this->db->order_by("name")->get("states");

Finalmente tenemos:

$q2 = $this->db->select("id, name")->order_by("name")->get("states");

Y, aunque he quitado muchos caracteres, para mi el $q2 no entiendo que
es. Yo lo escribir�a como $query para saber de qu� se trata:

$query = $this->db->select("id, name")->order_by("name")->get("states");

View
----

En el view lo primero que he hecho ha sido usar la sintaxis alternativa
de PHP para los views, igual que comentan en el user guide de
CodeIgniter (ojo, SOLO las Control Structures; terminantemente prohibido
usar los short tags de PHP):
http://codeigniter.com/user_guide/general/alternative_php.html

Aqu� ten�is la documentaci�n de PHP (no os olvid�is nunca de esto,
estamos programando en PHP, no en CodeIgniter):
http://php.net/manual/en/control-structures.alternative-syntax.php

El porqu� es sencillo. El view es el output final, donde solemos tener
el HTML. La sintaxis alternativa nos permite ver MUCHO m�s claro el
c�digo HTML (y si usamos alg�n IDE lo va a resaltar como tal).

El view de edherrera era:

<?php
if ($estados != false) {
echo '<select name="estados_select">'."\n";
foreach($estados as $i => $edo)
{
echo '<option value="'.$edo[id'].'">';
echo $edo['name'];
echo '</option>'."\n";
}
echo '</select>'."\n";
}
?>

Esto, podr�a ser reescrito:

<?php if($estados != false): ?>
<select name="estados_select">
<?php foreach($estados as $i => $edo): ?>
<option value="<?php echo $edo['id']; ?>">
<?php echo $edo["name"]; ?>
</option>
<?php endforeach; ?>
</select>
<?php endif; ?>

Bien, sobre esta parte tengo bastante a comentar. Si hab�is le�do la
primera parte, si hacemos un buen uso de los returns de los modelos el
IF no ser� necesario ya que $estados siempre estar� definido. Siempre
ser� un array, vac�o o no, siempre ser� un array. De este modo,
directamente nos cargamos el if:

<select name="estados_select">
<?php foreach($estados as $i => $edo): ?>
<option value="<?php echo $edo['id']; ?>">
<?php echo $edo["name"]; ?>
</option>
<?php endforeach; ?>
</select>

(Por cierto, si os fij�is yo ya ni he puesto los "\n". Como estamos
escribiendo l�neas de HTML, se interpretar�n como saltos autom�ticamente
tambi�n)

Usando el foreach con un array vac�o no fallar�, no nos tenemos que
preocupar por eso. El foreach recorre un array. Lo �nico importante es
que recorra un array: si est� vac�o no escribir� absolutamente nada,
pero ser� correcto y no mostrar� ning�n error.

Despu�s, el foreach esta mal hecho... o digamos que podr�amos hacerlo
mejor. Si cuando definimos el array, el indice del array es el ID y el
valor es el NAME (como he hecho en mi modelo), no hace falta trabajar
con arrays en los valores.

De hecho, esto:

foreach($estados as $i => $edo)

Ser�a lo mismo que:

foreach($estados as $edo)

Ya que el valor $i no lo usamos en ning�n sitio, no nos hace falta para
nada.

Entonces, si nosotros definimos estados con $id = $name (v�ase MI
modelo), podemos hacer lo siguiente:

foreach($estados as $id => $name)

Y usar directamente los valores $id y $name:

<select name="estados_select">
<?php foreach($estados as $id => $name): ?>
<option value="<?php echo $id; ?>">
<?php echo $name; ?>
</option>
<?php endforeach; ?>
</select>

Bien, espero que os haya servido de ayuda y que os sirva para mejorar
vuestros modelos, vistas y modos de ver las aplicaciones.

Un saludo,
Isern


El 23/05/2011 18:35, edherrera escribi�:
> As� es como lo hago, espero te sirva.

edherrera

unread,
May 24, 2011, 4:12:33 PM5/24/11
to CodeIgniter-spanish
Excelente explicación gracias por tomarte el tiempo de aclararnos has
contibuído en demacía a mi aprendizaje.

Por lo que corresponde a cómo escribir el código tal vez sea cuestión
de costumbre; como en el caso de uso el echo en las etiquetas html.
Comentás el por qué de q2, esto lo utilizó de manera reducida en vez
de escribir query to.

Nuevamanete gracias por tu aportación.

edherrera

unread,
May 30, 2011, 11:48:06 AM5/30/11
to CodeIgniter-spanish
Hola, me podrías explicar cuál es la diferencia de escribir o no la
palabra public en el modelo?

josepzin

unread,
May 30, 2011, 9:25:07 PM5/30/11
to CodeIgniter-spanish
Para los select yo uso la función de CI, que lo da "servido"

diego

unread,
May 30, 2011, 10:30:12 PM5/30/11
to codeignit...@googlegroups.com
alguna otra funcion que no sea form_dropdown ?

Reply all
Reply to author
Forward
0 new messages