El problema es que no sé si lo estoy haciendo correctamente. En la mayoría de los tutoriales al hacer una consulta ni siquiera comprueban si la consulta devuelve resultados. Hacen la consulta y envían el resultado directamente a la vista sin ninguna comprobación, como si asumieran que los datos existen sí o sí. En otros casos, antes de hacer la consulta inicializan las variables, si hay resultados reemplazan el contenido de esas variables y si no hay, así las devuelven igual, sin importar que estén vacías. O donde lo único que comprueban es que la variable con los datos existan, si no existen crean nuevas variables vacías.
Eso no me gusta y todavía no estoy encontrando ejemplos de cómo debería hacerse. Lo hice a mi manera, pero yo no sé, tengo muy poca experiencia.
No es sólo una duda que tengo con el Codeigniter, en realidad no sé cuál es la manera adecuada de hacer esto en el patrón MVC.
Esto es lo que yo hice y lo que me pareció más adecuado:
- El controlador recibe como parámetro el id de la entrada que va a traer de la base de datos.
- El modelo hace la consulta, si encuentra un registro devuelve los datos al controlador, de lo contrario devuelve false.
- El controlador comprueba el valor devuelto por el modelo. Primero creo la variable $entrada = null. Luego compruebo de que el valor devuelto por el modelo sea true (if ($resultado)), si es válido entonces pongo los datos en la variable $entrada['datos']. Luego envío los datos a la vista (con la variable $entrada).
En la vista se comprueba de que exista la variable $datos (o sea lo que sería $entrada['datos']), si no existe muestra un mensaje diciendo que no existe y de lo contrario muestra la entrada.
Modelo:
Código PHP:
public function traer_entrada($idEntrada)
{
$this->db->select('entrada_titulo, entrada_contenido, entrada_fecha_publicacion, usuarios.usuario_nick');
$this->db->from('entradas');
$this->db->join('usuarios', 'usuarios.id_usuario = entradas.foranea_autor_id_usuario');
$this->db->where('id_entrada', $idEntrada);
$query = $this->db->get('');
if ($query->num_rows() != 1) {
return false;
}
return $query->row();
}
Código PHP:
public function traer_entrada($id)
{
$this->load->model('entradas_model');
$resultado = $this->entradas->traer_entrada($id);
$entrada = null;
if ($resultado) {
$entrada['datos'] = array(
'titulo' => $resultado->entrada_titulo,
'contenido' => $resultado->entrada_contenido,
'fecha' => $resultado->entrada_fecha_publicacion,
'autor' => $resultado->usuario_nick
);
}
$data['contenido'] = $this->load->view('vistas/entrada', $entrada, true);
$this->load->view('plantillas/principal', $data);
}
entrada.php (vistas/entrada):
Código PHP:
<article id="entry">
<?php if (isset($datos)): ?>
<h1><?php echo $datos['titulo']; ?></h2>
<p class="entry_info">Escrito por: <a href="<?php echo base_url(); ?>/usuarios/<?php echo $datos['autor']; ?>"><?php echo $datos['autor']; ?></a> el <?php echo $datos['fecha']; ?></p>
<p class="entry_content"><?php echo $datos['contenido']; ?></p>
<?php else: echo 'La entrada no existe.'; endif; ?>
</article>
Espero que puedan ayudarme con esto, me confunde porque quiero aprender y sólo encuentro ejemplos así y no me gustan para nada, y creo que estas son cosas que sólo se aprenden viendo y experimentando.