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.