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]
$config['base_url'] = 'http://www.midominio.com/'; $config['index_page'] = '';
$db['default']['hostname'] = 'localhost'; $db['default']['username'] = 'my_username'; $db['default']['password'] = 'my_password'; $db['default']['database'] = 'my_database';
$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.






