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.






