Sigueme por RSS! RSS

Cargando SELECT con CodeIgniter 2.0

Por el momento me encuentro en un proyecto bastante largo, caso que impide que publique con frecuencia, iré dejando cosas puntuales que de igual manera puedan servir de ayuda.




Recordemos que CodeIgniter trabaja con el estándar MVC:
modelo --> se encarga de la interacción con la base de datos.
vista --> se encarga de toda la parte gráfica del módulo.
controlador --> se encarga de toda la lógica del proyecto, interactúa con el modelo y la vista.

Teniendo una tabla (profesiones) con los siguientes datos:
mysql> select * from profesiones;
+--------------+---------------------------------+
| id_profesion | profesion                       |
+--------------+---------------------------------+
|            1 | Bachiller                       |
|            2 | Técnico Superior Universitario |
|            3 | Licenciado (a)                  |
|            4 | Profesor (a)                    |
|            5 | Ingeniero                       |
|            6 | Doctor (a)                      |
|            7 | Magister                        |
+--------------+---------------------------------+

Hacemos lo siguiente:
- en el modelo (model) creamos una función que se encargue de obtener los datos correspondientes:
function get_profesiones(){

    // armamos la consulta
    $query = $this->db-> query('SELECT id_profesion,profesion FROM profesiones');

    // si hay resultados
    if ($query->num_rows() > 0) {
        // almacenamos en una matriz bidimensional
        foreach($query->result() as $row)
           $arrDatos[htmlspecialchars($row->id_profesion, ENT_QUOTES)] = 
htmlspecialchars($row->profesion, ENT_QUOTES);

        $query->free_result();
        return $arrDatos;
     }
}

- en el controlador (controller):
lo primero es cargar el modelo, para poder acceder a sus funciones:
$this->load->model('nombre_del_modelo');

eso lo hacemos en el método constructor del controlador.

y en el método index, antes de cargar la vista, obtenemos la matriz con los datos devueltos por la función que se encuentra en el modelo.
// obtenemos el array de profesiones y lo preparamos para enviar
$datos['arrProfesiones'] = $this->nombre_del_modelo->get_profesiones();
    
// cargamos  la interfaz y le enviamos los datos
$this->load->view('nombre_de_la_vista', $datos);

- luego en la vista (view) dependerá de como vas a armar el select:

usando las funciones del Form Helper:
echo form_label('Profesión: '),form_dropdown('selProfesiones', $arrProfesiones);
/* imprimirá:
<label>Profesión: </label><select name="selProfesiones">
<option value="1">Bachiller</option>
<option value="2">Técnico superior Universitario</option>
<option value="3">Licenciado (a)</option>
<option value="4">Profesor (a)</option>
<option value="5">Ingeniero</option>
<option value="6">Doctor (a)</option>
<option value="7">Magister</option>
</select>
*/

armándolo a mano:
Profesión: <select name="selProfesiones">
<?php
foreach ($arrProfesiones as $i => $profesion)
   echo '<option value="',$i,'">',$profesion,'</option>';
?>
</select>

23 comentarios: Suscribete a los comentarios por RSS

Anónimo

excelente muy bueno POR FIN UN TUTORIAL QUE EXPLICAN DESDE LO MAS MINIMO, te felicito =)

Unknown

Pregunta - sugerencia: A mi entender ¿no debería incluirse las llaves de apertura y cierre de la instrucción foreach dejando fuera a "return $arrDatos;" ? para que este contenga todos los resultados...ustedes diran.

cass

Hola, cuando dentro de un bloque (if, for, foreach, while) sabes que sólo va a ir una sola instrucción, queda a tu criterio colocar las llaves o no, ya que el bloque siempre leera el siguiente proceso/instrucción/orden como si estuviera dentro de si mismo e ignorara las demás, por ejemplo:

for($i=1; $i<5; $i++)
echo $i;echo ' hola';

imprimira: "1234 hola"

La recomendación es siempre usar las llaves para que no haya confusión, independientemente de si albergara una sola instrcucción, pero como lo digo, queda a criterio de cada quién.

En este caso el "return $arrDatos;" si está fuera del foreach.. y la función si devuelve todos los registros de la tabla.
saludos!

Unknown

Hola, es cierto fue una mala interpretacion mia, interpreté 3 instrucciones en vez de una (vayan las disculpas del caso).
Te comento que estoy un poco enredado queriendo mostrar 2 select independientes con datos provenientes de 2 tablas de una BD,y mostrarlos en una misma vista, Como puedo hacer esto?Desde ya muchas gracias!!
Hector

cass

En ese caso usas 2 funciones, las ejecutas y los arreglos que te devuelven, los envías a la vista para cargar los elementos select, ejemplo:

// obtenemos los arreglos y los enviamos
$datos['arrProfesiones'] = $this->modelo->get_profesiones();
$datos['arrPaises'] = $this->modelo->get_paises();

y en la vista los asocias:
echo form_label('Profesión: '),form_dropdown('selProfesiones', $arrProfesiones);
echo form_label('Paises: '),form_dropdown('selPaises', $arrPaises);

Unknown

Muchas gracias, era simple nomas. Realmente codeigniter me esta atrapando.
Excelente sitio.
saludos!

mao

ola pueden ayudarme, quiero cargar un select, con datos de una tabla, de la siguiente forma: tabla paises, al seleccionar un pais debe cargarme en otro selec los departamentos, y al seleccionar un departamento debe cargar en otro selec las ciudades, pueden ayudarme?

Darwin Herrera

como capturar los el datos seleccionado de un select desde mi controlador para usar este dato en una consulta a la bd gracias

Reinaldo Cassiani (cass)

Hola, ese SELECT va detro de un formulario configurado con el atributo method="POST" y en el atributo action debes indicarle a que controlador y que método iran esos datos al hacer submit en el form, algo como action="controlador/tu_metodo"

luego en el método indicado capturas lo recibido por POST,algo así:
$valor_select = $this->input->post('nombre_del_select');

eso lo validas y lo envias a las funciones que tienes en el modelo para que accedan a la base de datos.

Irwin Estrada Torres

Ols, muy bueno tu web site pero cuando trato de hacerlo en mi proyecto no me carga todos los registros solo me carga UNO, y es k tengo 3 registros en la BD (yo trato de cargarlo en un select multiple) pero eso no tendria na k ver ayudame x fas te lo garadeceria mucho...

Reinaldo Cassiani (cass)

Hola, revisa la consulta a la base de datos, luego imprime con print_r el array que se le pasa al form_dropdown para ver que te devuelve.

Irwin Estrada Torres

okey bueno yo probe con las dos formas de imprimer en ambos me sale lo mismo probare dame un tok plz thaks de igual manera

Diego Candia

Consulta! para cargar la opción seleccionada lo hago con esto:

$this->input->post('med_id', TRUE)

Pero solo quiero obtener el VALUE y no el nombre de la opción (el value y la opción son distintos) como puedo hacerlo??

Reinaldo Cassiani (cass)

Te refieres al texto?
<option value="ID">TEXTO</option>

el texto no se envía en el POST, sólo el value del option, si quieres más datos puedes dejarlos en el vale concatenado, por ejemplo:

<option value="ID-TEXTO">TEXTO</option>

- lo obtienes y lo procesas
$med_id = $this->input->post('med_id', TRUE);
$arrData = explode(",",$med_id);
echo "<pre>",print_r($arrData),"</pre>";

Jesus Daniel Parra Urdaneta

Gracias por la explicación compañero..! Me fue de gran ayuda.. Saludos

ronal albines macalupu

podrias enviarme a mi correo el ejemplo (tumpiurano@gmail.com), pues me sale error en el Modelo en el siguiente codigo: "if ($query->num_rows() > 0)"
A PHP Error was encountered

Severity: Error

Message: Call to a member function num_rows() on a non-object

Filename: models/MPortada.php

Line Number: 16

Backtrace:

ronal albines macalupu

el problema anterior se solucionaba: llendo a c:\xampp\htdocs\TU_Proyecto\application\config\autoload.php y agregando 'database' en las librerias

$autoload['libraries'] = array('database');

Reinaldo

Hola, incluye el campo dentro del formulario con método POST y cuando hagas el submit llega al controlador/método que le indicaste en el action, luego lo recibes así:
$select_id = $this->input->post('select_id', TRUE);

laura hernandez

Hola, muy buen código, solo tengo una duda, al hacer todo en el formulario me aparecen las opciones correctamente sin embargo, cuando mando por POST los valores, en lugar de los id me envía el valor y me sale error en la base de datos, ¿cómo podría remediarlo?

INSERT INTO zonatipohabitacion (Zona, TipoHabitacion) VALUES ('A', 'Doble')

Reinaldo

Hola, al enviar el campo seleccionado por POST debería llegarte el value del select, si no es así es que tienes algo mal aplicado en el código, de igual manera siempre puedes filtrar lo que te llegue por post en el controlador y así te aseguras de que lo que vaya a la base de datos sea lo correcto.

Erick Josué Guerrero Rodríguez

hola, quisiera agradecer por el tutorial tan bueno me sirvió bastante, solo que que tengo una cuestión, como puedo hacer para que al momento de seleccionar una opción del dropdown este seleccione el id y que a su vez me mande todos los registros que contenga ese id?

Reinaldo

Hola, gracias!

Cuando dices que "mande todos los registros que contenga ese id", imagino que te refieres a registros de la base de datos, si es así, lo que debes hacer es
recibir el ID del dropdown por POST en el controlador y después llamar a una
función del modelo que te devuelva esos registros filtrando por el ID,
es decir, algo así:

1.- en el controlador:

public function procesar_formulario(){
$id_del_select = $this->input->post('select_id', TRUE);

donde "select_id" es el nombre de tu dropdown en la vista y
"procesar_formulario" es el método que indicaste en el atributo "action" del formulario "mi_controlador/procesar_formulario"

2.- luego llamas a una función que hayas creado en tu modelo y que haga la
consulta de los registros, tal que si:

$arrRegistros = $this->modelo->get_rows_by_id($id_del_select);

3.- en tu modelo tendrías que tener un método con el query, ejemplo:

function get_rows_by_id($id){
$id = (int)$id;
$arrResponse = array();
$sSQL = "SELECT mi_campo FROM mi_tabla WHERE id = ?";
$query = $this->db->query($sSQL);
if($query->num_rows()>0){
foreach($query->result() as $row){
$arrResponse[] = array(
'cat_name' => $row->ame
);
}
return $arrResponse;
}else{
return FALSE;
}
}

espero te sirva, saludos!




Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.