Primera página con CodeIgniter

Modificaciones en application\config

database.phpautoload.phproutes.phpconfig.php

...
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'aem';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
...

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

...
$route['default_controller'] = "Torneos";
...

...
$config['base_url'] = 'http://localhost/aem3';
...

Páginas del modelo MVC

controllers/torneos.phpviews/home.phpmodels/torneo_model.php

<?php
class Torneos extends CI_Controller {
   function index(){
      //cargo el helper de url, con funciones para trabajo con URL del sitio
      $this->load->helper('url');

      //cargo el modelo de artículos
      $this->load->model('Torneo_model');

      //pido los ultimos torneos al modelo
      $ultimosTorneos = $this->Torneo_model->dame_ultimos_torneos();

      //creo el array con datos de configuración para la vista
      $datos_vista = array('rs_torneos' => $ultimosTorneos);

      //cargo la vista pasando los datos de configuacion
      $this->load->view('home', $datos_vista);
   }
}
?>

<html>
<head>
  <meta charset="UTF-8" />
  <title>Portada de mi sitio</title>
</head>
<body>
<h1>Bienvenido a mi web</h1>
<p>Estos son los &uacute;ltimos torneos publicados.</p>
<?php
while ($fila = mysql_fetch_array($rs_torneos)){
   echo '<p>';
   echo '<a href="' . site_url('/torneos/muestra/' . $fila['cdgo_torneo']) . '">' . $fila['nombre_torneo'] . '</a>';
   echo '</p>';
}
?>

</body>
</html>

<?php
class Torneo_model extends CI_Model {

   function __construct(){
      parent::__construct();
   }

   function dame_ultimos_torneos(){
      $ssql = "select * from tabla_torneos order by cdgo_torneo desc limit 10";
      return mysql_query($ssql);
   }
}
?>

 

controllers/torneos.php

<?php
class Torneos extends CI_Controller {
   function index(){
      //cargo el helper de url, con funciones para trabajo con URL del sitio
      $this->load->helper('url');

      //cargo el modelo de artículos
      $this->load->model('Torneo_model');

      //pido los ultimos torneos al modelo
      $ultimosTorneos = $this->Torneo_model->dame_ultimos_torneos();

      //creo el array con datos de configuración para la vista
      $datos_vista = array('rs_torneos' => $ultimosTorneos);

      //cargo la vista pasando los datos de configuacion
      $this->load->view('home', $datos_vista);
   }
}
?>

Un controlador en CodeIgniter es un archivo que contiene el código de una clase, de programación orientada a objetos, que colocamos en un directorio específico del esquema de carpetas de nuestro sitio. Tiene un nombre cualquiera, que se asociará con una URL de nuestra aplicación web.

Por ejemplo, esta podría ser una URL de nuestra aplicación:

midominio.com/index.php/torneos

En la URL anterior podemos ver que la palabra «torneos» determina la página que queremos ver dentro de nuestra aplicación. Pues bien, para poder atender esta solicitud nosotros vamos a tener que crear un archivo llamado torneos.php (el controlador) dentro del directorio que aloja los controladores de nuestra aplicación.

Por tanto, cuando CodeIgniter detecta una URL como esta, intentará acceder al archivo articulos.php, para cargarlo, procesarlo y de ese modo mostrar la página con los contenidos de esta sección.

Cuando ese controlador no se encuentre entre los archivos de controladores de CodeIgniter, simplemente se mostrará un error 404 de página no encontrada. Si se encontró el controlador, como se decía, se carga y se procesa para mostrar la página.

Los controladores en CodeIgniter se guardan en la carpeta «system/application/controllers/», que se encuentra dentro de los archivos de CodeIgniter.

Analizando el controlador

  • En nombre del archivo de controlador, en este caso torneos.php, va en minúsculas.
  • El nombre de la clase que implementa el controlador se tiene que llamar igual que el nombre del archivo, pero fijaros que tiene obligatoriamente la primera letra en mayúscula. Por eso aparece como class Articulo extends Controller.
  • Todos los controladores tienen que extender la clase «Controller» (que también tiene la primera letra «C» en mayúscula), que está creada dentro de CodeIgniter y en principio no necesitamos modificarla para nada.

Una vez creado el archivo, podemos acceder con el navegador al controlador, con una URL como esta:

http://luismaseda.com/aem3/index.php/torneos

Un momento ¿Qué significa extender una clase?

class Torneos extends CI_Controller

Frecuentemente son necesarias clases con variables y funciones semejantes a los de otra clase ya existente. De hecho, es una buena práctica definir una clase genérica que pueda ser utilizada en todos sus proyectos y adaptar esta clase a las necesidades de cada uno de sus proyectos específicos.

Para facilitar esto, las clases pueden ser extensiones de otras clases. La clase extendida (Torneos) tiene todas las variables y funciones de la clase base (CI_Controller) y aquello que se agregue en la definición extendida (Torneos). No es posible disminuir una clase, es decir, remover la definición de cualquier función o variable existente. Una clase extendida siempre es dependiente de una sóla clase base, es decir, la herencia múltiple no está soportada. Las clases son extendidas utilizando la palabra clave ‘extends’.

En el caso de class Torneos extends CI_Controller se define una clase llamada Torneos que contiene todas las variables y funciones de CI_Controller más una función adicional $index().

Hemos colocado una función index(), que es la que se llamará cuando se acceda a este controlador tal cual. Dentro de index estamos invocando una vista.

Nota:
¡Las clases deben de estar definidas antes de ser utilizadas! Si se desea que la clase Torneos extienda a la clase CI_Controller, se tendrá que definir primero la clase CI_Controller. Si se quiere crear otra clase llamada Calendario basada en la clase Torneos se tiene que definir primero Torneos.

Resumiendo: el orden en que las clases se definen es importante.

Controlador por defecto

Hay que hablar sobre el controlador por defecto, que es el que se invoca en CodeIgniter cuando no se especifica ningún nombre de directorio y por tanto ningún controlador, en la siguiente URL:
midomino.com/index.php/

O bien en esta otra:

midominio.com/

Esto, que sería la home de la aplicación CodeIgniter, y eventualmente la home del dominio, si es que hemos instalado el framework en la raíz del directorio de publicación, invoca también un controlador, que es el controlador por defecto.

El nombre del controlador predeterminado (Default Controller) puede ser variable, siendo el desarrollador el encargado de configurarlo en uno de los archivos de configuración de CodeIgniter, que se encuentra en el fichero «application/config/routes.php».

En ese archivo simplemente tenemos que buscar el valor $route[‘default_controller’] y asignarle el nombre de la clase donde está el controlador que queramos que se invoque. Como es el nombre de una clase de un controlador tendremos que escribirlo con la primera letra en mayúscula.

$route[‘default_controller’] = ‘Torneos’;

Si observamos el valor de esta variable de configuración, tal como está en el momento inicial, después de la instalación de CodeIgniter, veremos que el controlador por defecto está en la clase «Welcome», archivo application/controllers/welcome.php

Ahora, si ponemos la siguiente URL en nuestro navegador

http://luismaseda.com/aem3/

tendrá el mismo funcionamiento que poniendo:

http://luismaseda.com/aem3/index.php/torneos

Importante: Estamos diciendo que los controladores tienen funciones, pero en realidad deberíamos llamarles métodos, porque los controladores son clases y las clases tienen métodos y no funciones.


views/home.php

<html>
<head>
  <meta charset="UTF-8" />
  <title>Portada de mi sitio</title>
</head>
<body>
<h1>Bienvenido a mi web</h1>
<p>Estos son los &uacute;ltimos torneos publicados.</p>
<?php
while ($fila = mysql_fetch_array($rs_torneos)){
   echo '<p>';
   echo '<a href="' . site_url('/torneos/muestra/' . $fila['cdgo_torneo']) . '">' . $fila['nombre_torneo'] . '</a>';
   echo '</p>';
}
?>

</body>
</html>

Los controladores deciden qué hacer cuando se recibe una solicitud y las vistas deciden cómo mostrar los resultados. Por decirlo de otra forma, la lógica de nuestra aplicación residirá en el controlador y la vista mantendrá el aspecto de nuestra página, el diseño de la página que se mostrará al usuario.

Una vista se carga en el controlador mediante:

$this->load->view(‘nombreDeLaVista’);

En ‘nombreDeLaVista’ tendremos que indicar el nombre del archivo donde hemos guardado la vista, pero sin el «.php». En nuestro controlador se hizo mediante:

$this->load->view(‘home’, $datos_vista);

en la que también se cargó una variable con datos para ser utilizados por la vista: $datos_vista

Podemos ver cómo hacemos un recorrido a los registros de últimos torneos traídos desde la base de datos con ayuda del modelo y enviados a la vista por medio del controlador. Además, vemos que se está utilizando la función site_url() que pertenece al helper «url» que habíamos cargado en el controlador.

El resultado nos muestra los últimos torneos que se habían cargados en la base de datos, en la tabla_torneos, con un enlace a varias páginas, donde se muestra cada uno de los torneos (no creadas todavía).

models/torneo_model.php

<?php
class Torneo_model extends CI_Model {

   function __construct(){
      parent::__construct();
   }

   function dame_ultimos_torneos(){
      $ssql = "select * from tabla_torneos order by cdgo_torneo desc limit 10";
      return mysql_query($ssql);
   }
}
?>

Los modelos en el MVC son los módulos que tienen como responsabilidad el acceso y control de los datos que hay en bases de datos y mantienen encapsuladas todas las particularidades y complejidades de los accesos a las tablas para realizar cualquier tipo de operación.

En el patrón MVC, los modelos son una de las partes fundamentales, pero en el caso de CodeIgniter, su uso es sólo opcional. El desarrollador es el responsable de decidir si le viene bien el uso de los modelos o si prefiere realizar sus aplicaciones haciendo cualquier tipo de operación sobre la base de datos en los propios controladores.

Los modelos en la práctica son clases, de programación orientada a objetos, que tienen sus métodos o funciones, a los que se puede invocar desde los controladores para hacer operaciones con la base de datos.

Los modelos en CodeIgniter se construyen extendiendo la clase CI_Model y tenemos que nombrarlos con la primera letra en mayúsculas. Dentro del modelo que estamos creando tenemos que definir obligatoriamente un constructor, donde tenemos que hacer una llamada al constructor de la clase de la que hereda (clase parent, llamada __construct).

function __construct(){
parent::__construct();
}

Un modelo se carga en el controlador mediante:

$this->load->model(‘Nombre_model’);

Si queremos cargar varios modelos de una sola vez, podemos hacerlo pasando un array con todos los modelos que deseamos cargar:

$this->load->model(array(‘Torneo_model’,’Noticia_model’));

En nuestro controlador se hizo mediante:

$this->load->model(‘Torneo_model’);

Una vez cargado un modelo, sus métodos para el acceso a los datos estarán disponibles en nuestro controlador, a través del propio objeto controlador, el nombre del modelo que queremos accionar y la función que queremos invocar dentro del modelo.

$this->load->model->funcion_del_modelo();

database.php

...
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'aem';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
...

autoload.php

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

routes.php

...
$route['default_controller'] = "Torneos";
...

config.php

...
$config['base_url'] = 'http://localhost/aem3';
...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *