lunes, 26 de noviembre de 2012

Ejemplo de programación con CodeIgniter

El otro día hablábamos de CodeIgniter, un framework PHP muy ligero que he descubierto recientemente. CodeIgniter implementa el modelo-vista-controlador (MVC) y permite el desarrollo de aplicaciones web de forma rápida y eficiente. En este artículo vamos a ver un ejemplo de desarrollo de una aplicación web usando CodeIgniter. Va a ser un ejemplo muy sencillo que utiliza las características básicas de CodeIgniter.

Enunciado.

Vamos a suponer que tenemos una tabla de productos y que queremos una aplicación web que muestre por un lado la lista de productos con su precio y por otro lado todos los detalles de cada producto. A continuación la tabla de productos:

CREATE TABLE `products`
( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, `name` VARCHAR(64) NOT NULL
, `descri` TEXT NOT NULL
, `price` FLOAT NOT NULL
);

Las únicas URLs permitidas para nuestra aplicación web serán las siguientes:

http://www.midominio.com/ Mostrará la lista de productos.
http://www.midominio.com/productos/ Mostrará la lista de productos.
http://www.midominio.com/productos/prod/1 Mostrará los datos del producto con ID=1.


PASO 1: Descargar e instalar CodeIgniter.

Lo primero de todo será descargar CodeIgniter desde la página web del producto. Instalar CodeIgniter es muy sencillo: basta descomprimir el contenido del archivo ZIP descargado en el directorio raíz o en una carpeta del servidor web.

Al acabar la instalación se habrán creado 3 carpetas: "application" contendrá los archivos fuente de nuestra aplicación; "system" contendrá las clases base y librerías necesarias para que todo funcione; "user_guide" es el manual de utilización y puede borrarse. También se habrá creado el archivo "index.php" que será el punto de entrada de nuestra aplicación. Por ahora no debe modificarse.


PASO 2: Configurar nuestro proyecto CodeIgniter.

  • Crear un archivo ".htaccess" en la carpeta raíz de nuestro proyecto. Esto sirve para hacer las URLs de CodeIgniter más amigables, eliminando la referencia a "index.php".
  • Options -Indexes +FollowSymLinks
    RewriteEngine on
    RewriteCond $1 !^(index.php|css|js|images|robots.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    
  • Editar el archivo "/application/config/config.php":
  • $config['base_url'] = 'http://www.midominio.com/';
    $config['index_page'] = '';
    
  • Editar el archivo "/application/config/database.php" sustituyendo los valores de "my_username", "my_password" y "my_database" por datos reales de acceso a la base de datos MySQL:
  • $db['default']['hostname'] = 'localhost';
    $db['default']['username'] = 'my_username';
    $db['default']['password'] = 'my_password';
    $db['default']['database'] = 'my_database';
    
  • Editar el archivo "/application/config/routes.php" para especificar que el controlador por defecto del proyecto será "products":
  • $route['default_controller'] = "products";
    

PASO 3: Crear el modelo.

Como sabemos el modelo es la parte del patrón de diseño MVC que permite el acceso a los datos y concretamente nuestros datos estarán en la tabla products de una base de datos MySQL. En CodeIgniter las clases del modelo derivarán de CI_Model y se guardarán en la carpeta "/application/models/".

Creamos el archivo "/application/models/products_model.php"

class Products_Model extends CI_Model {

  public function __construct() {
    parent::__construct();
    $this->load->database();
  }

  public function selectProducts() {

    $sql = "
      SELECT `id`
      , `name`
      , `price`
      FROM `products`
      ORDER BY `id` ASC;
      ";

    $result = $this->db->query($sql);
    if(!$result) {
      return false;
    }

    return $result;
  }

  public function selectProduct($id) {

    $sql = "
      SELECT `id`
      , `name`
      , `descri`
      , `price`
      FROM `products`
      WHERE `id` = ?;
      ";

    $bindings = array(
      $id
    );

    $result = $this->db->query($sql, $bindings);
    if(!$result) {
      return false;
    }

    return $result;
  }
}

Como vemos la clase Products_Model tiene constructor y dos métodos: selectProducts() y selectProduct(). En el constructor se carga la librería de acceso a base de datos. Los métodos realizan las queries y devuelven el resultado.


PASO 4: Crear el controlador.

Nuestra aplicación CodeIgniter sólo tendrá un controlador al que llamaremos Products. La clase derivará de CI_Controller y se guardará en la carpeta "/application/controllers/":

Creamos el archivo "/application/controllers/products.php"

class Products extends CI_Controller {

  public function __construct() {
    parent::__construct();
    $this->load->helper('url');
    $this->load->model('Products_Model');
  }

  public function index() {

  $data = array( );

    $query = $this->Products_Model->selectProducts();
    if(!$query || $query->num_rows() < 1) {
      $data['product_list'] = null;
    }
    else {

      $data['product_list'] = array( );
      foreach ($query->result() as $row) {
        $product = array( );
        $product['id'] = $row->id;
        $product['name'] = $row->name;
        $product['price'] = $row->price;
        $data['product_list'][] = $product;
      }
    }

    $this->load->view('product_list', $data);
  }

  public function prod($prod_id) {

    if(!$prod_id) {
      show_404();
      return;
    }

    $query = $this->Products_Model->selectProduct($prod_id);
    if(!$query || $query->num_rows() < 1) {
      show_404();
      return;
    }

    $row = $query->row();
    if(!$row) {
      show_404();
      return;
    }

    $product = array( );
    $product['id'] = $row->id;
    $product['name'] = $row->name;
    $product['descri'] = $row->descri;
    $product['price'] = $row->price;
    $data['product_data'] = $product;

    $this->load->view('product_data', $data);
  }
}

Nuestro controlador tendrá constructor, el método index() y el método prod(). El constructor cargará el modelo Products_Model, que hemos creado anteriormente, y el helper url. Un helper es como una librería que proporciona CodeIgniter con funciones comunes de ayuda a la programación. En este caso el helper url proporciona funciones para trabajar con las URLs del sitio web: site_url(), base_url(), current_url(), etc.

El método index() llama al modelo para cargar la lista de productos y posteriomente llama a la vista product_list pasándole un array con la lista de productos que tiene que mostrar. El método prod(), que recibe como parámetro el identificador del producto, carga los datos del producto a través del modelo e invoca la vista product_data pasándole esos datos. Si el producto no existe se muestra la página de error 404.


PASO 5: Crear las vistas.

Como hemos visto, nuestra aplicación web tendrá dos vistas: product_list y product_data. Las vistas en CodeIgniter son archivos PHP que se guardan en la carpeta "application/views/".

Creamos el archivo "/application/views/product_list.php"

<!DOCTYPE html>
<html>
<head>
<title>Lista de productos</title>
<meta http-equiv="content-type" content="text/html; charset=utf8">
</head>
<body>
<h1>
  Lista de productos
</h1>
<?php if(!$product_list) : ?>
<p>
  La lista de productos está vacía.
</p>
<?php else : ?>
<ul>
<?php
  reset($product_list);
  foreach ($product_list as $product) {
    echo "<li>";
    echo "<a ";
    echo "href='", site_url('/products/prod/' . $product['id']) . "'>";
    echo $product['name'];
    echo "</a>";
    echo " ";
    echo number_format($product['price'], 2, ',', '.');
    echo "€";
    echo "</li>";
    echo PHP_EOL;
  }
?>
</ul>
<?php endif; ?>
</body>
</html>

Creamos el archivo "/application/views/product_data.php"

<!DOCTYPE html>
<html>
<head>
<title><?php echo $product_data['name']; ?></title>
<meta name="description" content="<?php echo $product_data['descri']; ?>">
<meta http-equiv="content-type" content="text/html; charset=utf8">
</head>
<body>
<h1>
  <?php echo $product_data['name']; ?>
</h1>
<p>
  <?php echo $product_data['descri']; ?>
</p>
<p>
  Precio: <?php echo number_format($product_data['price'], 2, ',', '.'); ?>€
</p>
<p>
  <a href="<?php echo site_url(); ?>">Volver a la lista</a>.
</p>
</body>
</html>

Como vemos detro de las vistas podemos usar los datos pasados desde el controlador a través del segundo parámetro del método $this->load->view() como variables globales.


Y con esto ya tenemos acabada la primera aplicación web hecha con CodeIgniter.

4 comentarios:

  1. OK, todo a la perfeccion. Explicado con gran detalle y la aplicacion corre sin problemas. Que sigue? Digo, le puse un par de productos y tengo las listas de los productos y tambien me manda a los detalles de los mismos. Pero que mas se puede hacer?

    ResponderEliminar
  2. Pues se puede hacer de todo... altas de productos, edición, borrado, etc. Este artículo sólo pretendía ser una introducción a Codeigniter, no una guía exhaustiva. No había pensado escribir una continuación. Además, aunque Codeigniter es un framework MVC perfecto para pequeños proyectos cuando no quieres complicaciones se está quedando anticuado frente otros más modernos como Sylex o Laravel. Y por otra parte hace lo menos 18 meses que no uso Codeigniter (toda una eternidad en programación).

    ResponderEliminar
  3. Porsi, ya salio la version 3 del Codeigniter lo cual lo mantiene vigente a la fecha.

    ResponderEliminar
  4. Cuando voy a un producto me dice que la url no se encuentra en el servidor, la lista se muestra correctamente

    ResponderEliminar