Anda di halaman 1dari 81

CodeIgniter

1.- CodeIgniter 2.- Instalacin y configuracin de CodeIgniter 3.- Entender el flujo de aplicacin de CodeIgniter 4.- Modelo - Vista - Controlador en CodeIgniter 5.- URLs en CodeIgniter 6.- Eliminar el index.php de las direcciones de CodeIgniter 7.- Controllers en CodeIgniter 8.- Funciones en los controladores 9.- Vistas en CodeIgniter 10.- Ms sobre las vistas 11.- Modelos en CodeIgniter 12.- Utilizar los modelos desde los controladores en CodeIgniter 13.- Repaso: tutorial para hacer una aplicacin de prueba en CodeIgniter 14.- Repaso 2: Creamos la base de datos y conectamos desde una pgina 15.- Repaso 3: Creamos pginas para mostrar artculos 16.- Helpers en CodeIgniter 17.- Ejemplo de Helper en CodeIgniter 18.- Trabajar con plantillas en CodeIgniter 19.- Repaso 4: Mejorar el sitio por medio de una vista utilizada como plantilla 20.- Libreras de CodeIgniter 21.- Ejemplo de librera en CodeIgniter: Calendar Library 22.- Crear tus propias libreras en CodeIgniter 23.- Ejemplo de creacin y uso de una librera en CodeIgniter 24.- Acceder a recursos de CodeIgniter desde tus propias libreras 25.- Reemplazar y extender libreras de CodeIgniter 26.- Reemplazar y extender clases del Core de CodeIgniter 27.- Carga automtica de recursos en CodeIgniter 28.- Funciones comunes en CodeIgniter 29.- Desarrollo de un login de usuarios en CodeIgniter 30.- Enrutado personalizado de URLs en CodeIgniter

1.- CodeIgniter
Probablemente ya sepamos que un framework es un programa para desarrollar otros programas, CodeIgniter, por tanto, es un programa o aplicacin web desarrollada en PHP para la creacin de cualquier tipo de aplicacin web bajo PHP. Es un producto de cdigo libre, libre de uso para cualquier aplicacin. Como cualquier otro framework, Codeigniter contiene una serie de libreras que sirven para el desarrollo de aplicaciones web y adems propone una manera de desarrollarlas que debemos seguir para obtener provecho de la aplicacin. Esto es, marca una manera especfica de codificar las pginas web y clasificar sus diferentes scripts, que sirve para que el cdigo est organizado y sea ms fcil de crear y mantener. CodeIgniter implementa el proceso de desarrollo llamado Model View Controller (MVC), que es un estndar de programacin de aplicaciones, utilizado tanto para hacer sitios web como programas tradicionales. Este sistema tiene sus caractersticas, que veremos en artculos siguientes. CodeIgniter no es magia, pero contiene muchas ayudas para la creacin de aplicaciones PHP avanzadas, que hacen que el proceso de desarrollo ms rpido. A la vez, define una arquitectura de desarrollo que har que programemos de una manera ms ordenada y contiene diversas herramientas que ayudan a hacer aplicaciones ms verstiles y seguras. CodeIgniter y otros frameworks PHP pueden ayudarte a dar el salto definitivo como desarrollador PHP, creando aplicaciones web ms profesionales y con cdigo ms reutilizable, con la diferencia que Code Igniter est creado para que sea fcil de instalar en cualquier servidor y de empezar a usar que cualquier otro framework. Adems muchas de sus utilidades y modos de funcionamiento son opcionales, lo que hace que goces de mayor libertad a la hora de desarrollar sitios web.

Caractersticas generales de CodeIgniter


Algunos de los puntos ms interesantes sobre este framework, sobre todo en comparacin con otros productos similares, son los siguientes: Versatilidad: Quizs la caracterstica principal de CodeIgniter, en comparacin con otros frameworks PHP. CodeIgniter es capaz de trabajar la mayora de los entornos o servidores, incluso en sistemas de alojamiento compartido, donde slo tenemos un acceso por FTP para enviar los archivos al servidor y donde no tenemos acceso a su configuracin. Compatibilidad: CodeIgniter, al menos en el momento de escribir este artculo de desarrolloweb.com, es compatible con la versin PHP 4, lo que hace que se pueda utilizar en cualquier servidor, incluso en algunos antiguos. Por supuesto, funciona correctamente tambin en PHP 5. Actualizado: Desde la versin 2 de CodeIgniter ya solo es compatible con la versin 5 de PHP. Para los que todava usen PHP 4 pueden descargar una versin antigua del framework, como CodeIgniter V 1.7.3, que todava era compatible. Estas versiones estn en la pgina de descargas de CodeIgniter. Facilidad de instalacin: No es necesario ms que una cuenta de FTP para subir CodeIgniter al servidor y su configuracin se realiza con apenas la edicin de un archivo, donde debemos

escribir cosas como el acceso a la base de datos. Durante la configuracin no necesitaremos acceso a herramientas como la lnea de comandos, que no suelen estar disponibles en todos los alojamientos. Flexibilidad: CodeIgniter es bastante menos rgido que otros frameworks. Define una manera de trabajar especfica, pero en muchos de los casos podemos seguirla o no y sus reglas de codificacin muchas veces nos las podemos saltar para trabajar como ms a gusto encontremos. Algunos mdulos como el uso de plantillas son totalmente opcionales. Esto ayuda muchas veces tambin a que la curva de aprendizaje sea ms sencilla al principio. Ligereza: El ncleo de CodeIgniter es bastante ligero, lo que permite que el servidor no se sobrecargue interpretando o ejecutando grandes porciones de cdigo. La mayora de los mdulos o clases que ofrece se pueden cargar de manera opcional, slo cuando se van a utilizar realmente. Documentacin tutorializada: La documentacin de CodeIgniter es fcil de seguir y de asimilar, porque est escrita en modo de tutorial. Esto no facilita mucho la referencia rpida, cuando ya sabemos acerca del framework y queremos consultar sobre una funcin o un mtodo en concreto, pero para iniciarnos sin duda se agradece mucho. Sin duda, lo ms destacable de CodeIgniter es su accesibilidad, ya que podemos utilizarlo en la mayor gama de entornos. Esta es la razn por la que en DesarrolloWeb.com hemos elegido este framework PHP para comenzar un manual que explicar cmo utilizarlo para desarrollar nuestras propias aplicaciones web. En siguientes artculos iremos contando diferentes aspectos de este framework y lo utilizaremos para crear una primera aplicacin web. Para continuar puedes leer el artculo Instalacin y configuracin de CodeIgniter. Tambin puedes ir al Manual de Codeigniter que estamos publicando.

2.- Instalacin y configuracin de CodeIgniter


Como apuntbamos en el artculo anterior, en el que presentamos las caractersticas principales de CodeIgniter, una de las ventajas de este framework PHP es que su instalacin es muy sencilla. Veremos a continuacin algunos detalles sobre el proceso de instalacin y configuracin. Afortunadamente para las personas con menos experiencia, los pasos son bien simples. Como podrs comprobar, se trata bsicamente de descargar el framework (un .zip), descomprimirlo y luego subir los ficheros al servidor.

Requisitos de servidor
Necesitamos disponer de un servidor PHP 4 PHP 5. Ambos funcionan perfectamente y en el caso de PHP 4, la versin mnima que debemos tener es la PHP 4.3.2. Actualizado: La versin 2 de CodeIgniter es nicamente compatible con PHP 5. En concreto necesitars PHP 5.1.6 o superior. Las versiones del framework un poco ms antiguas, que soportan PHP 4, son hasta CodeIgniter V 1.7.3. Este manual en sus primeros captulos est basado en esta versin compatible con PHP 4.

Por lo que respecta a las bases de datos, CodeIgniter es compatible con unas cuantas, las ms habituales en e desarrollo de webs: MySQL (4.1 o posterior), MySQLi, MS SQL, Postgres, Oracle, SQLite, y acceso a cualquier base de datos en entornos Windows por ODBC.

Descarga de CodeIgniter
Podemos descargar la versin ms actualizada de CodeIgniter directamente desde su pgina web, en la seccin de descargas: http://codeigniter.com/downloads/ En el momento de escribir este artculo la versin ms actual es la 1.7.2, pero probablemente cuando leas este texto ya la hayan actualizado, as que entra al sitio de descargas para estar seguro sobre la versin ms nueva que exista.

Instalacin de CodeIgniter en 4 sencillos pasos


1.- Descomprimir el paquete Descomprime el archivo de descarga que has descargado 2.- Sube codeIgniter a tu servidor Ahora tienes que subir todos los archivos descomprimidos a tu servidor web. Opcin A: Si ests programando en tu ordenador local, para pruebas y desarrollo, debers tener un servidor instalado en tu ordenador que soporte PHP, para lo que te recomendamos los paquetes Wamp o Xampp. En este caso tendrs que copiar simplemente los archivos de codeIgniter en el directorio de publicacin de tu servidor. Puedes colocar los archivos en la raz del directorio de publicacin o bien en un subdirectorio cualquiera. Opcin B: Si ests subiendo CodeIgniter a un servidor web de Internet, en un espacio que tengas contratado de hosting, debers subir por FTP todos los archivos. Lo general es que copies CodeIgniter en la raz de tu dominio, para que todas las pginas del dominio se sirvan a travs del framework PHP, pero nada te impide copiar CodeIgniter en un subdirectorio particular, para que tu dominio web slo funcione bajo CodeIgniter en la carpeta donde lo has subido. 3.- Configura la URL base de tu aplicacin web Necesitas decirle a CodeIgniter la URL base de tu aplicacin, es decir, la URL para acceder a la raz de CodeIgniter, segn en el servidor y directorio donde lo has colocado, es decir, donde has subido el cdigo del framework. Para ello tienes que abrir el archivo de configuracin, que se encuentra en system/application/config/config.php, con cualquier editor de texto y cambiar la variable de configuracin llamada que se guarda en $config['base_url']. Si hemos instalado en local CodeIgniter pondremos http://localhost/ y si adems lo colocamos en un directorio especfico podra ser algo como http://localhost/directorio_codeigniter Si hemos instalado el framework en un dominio de Internet podremos indicar algo como http://eldominiodeinstalacion.com/ y si hicimos una carpeta para subir CodeIgniter en ella pondremos el nombre del dominio y luego el nombre de la carpeta o carpetas, separadas por barras y acabando siempre en una barra: http://eldominioquesea.com/carpeta/otracarpeta/

Segn nos indican en el manual de instalacin, aparte de este dato podemos opcionalmente escribir una llave de encriptacin en la variable $config['encryption_key'], que servir si deseamos usar la clase de encriptado que proporciona CodeIgniter o queremos que nuestras variables de sesin estn encriptadas, algo que hace el framework de manera transparente para nosotros. 4. Configurar la base de datos En este ltimo paso tendrs que indicar los datos de acceso a la base de datos que piensas utilizar con CodeIgniter, ya que prcticamente todas las aplicaciones web que podrs crear con el framework van a tener que utilizar la base de datos para algo. Para ello tenemos que editar el archivo system/application/config/database.php e indicar los parmetros de conexin al servidor de base de datos, como el nombre del servidor y nombre de la base de datos, el usuario y la contrasea. Con esto ya tenemos todo listo para comenzar a crear nuestras aplicaciones web PHP. Podemos testar CodeIgniter accediendo a la URL donde lo hemos instalado. Debemos ver el mensaje de bienvenida de CodeIgniter que nos confirma que est funcionando. Para continuar la lectura puedes acceder al Manual de CodeIgniter que estamos publicando en DesarrolloWeb.com

3.- Entender el flujo de aplicacin de CodeIgniter.


Explicamos el flujo de la aplicacin de CodeIgniter, que ser recomendable conocer antes de empezar tu aplicacin web PHP con este framework. En DesarrolloWeb.com hemos empezado a publicar una lnea de artculos sobre el framework PHP CodeIgniter, que es uno de los ms sencillos, verstiles y apropiados para la mayora de desarrolladores y proyectos. En este artculo vamos a comentar algunas de las cosas, ms bien tericas sobre el proceso de desarrollo y produccin de aplicaciones con CodeIgniter. Recordemos que ya se presentaron unas caractersticas generales de CodeIgniter y que estuvimos ofreciendo una gua para la instalacin del framework PHP, que resulta bastante sencilla, como podris ver dado que CodeIgniter es apropiado para la mayora de los entornos donde necesitemos ejecutar aplicaciones con programacin en PHP. Como cualquier herramienta o librera para el desarrollo, CodeIgniter define una serie de pautas de trabajo que necesitaramos conocer antes de ponernos a escribir lneas de cdigo. Si queremos utilizar este framework hay muchas cosas no podremos hacer tal como, quizs, estemos acostumbrados en el pasado con PHP. As pues es muy importante saber unas cuantas cosas antes de empezar a ver ejemplos simples o explicar el proceso de desarrollo de una aplicacin web ms compleja. De hecho, la mayor complejidad de empezar a usar CodeIgniter es justamente la necesidad de cambiar nuestros esquemas y costumbres de desarrollo, pero esto tambin posibilitar que empecemos a pensar "a lo grande" y que los objetivos de aplicaciones avanzadas sean ms fcilmente alcanzables.

Flujo de aplicacin de CodeIgniter


En CodeIgniter existe un procedimiento para atender una solicitud de pgina del cliente. Este proceso se realiza internamente por el propio CodeIgniter y de manera transparente para nosotros. Durante el proceso participan varios mdulos como el enrutamiento de la solicitud, la cach interna, etc. Est bien conocerlo de antemano, aunque algunas de las cosas aun no las entendamos con lo que hemos visto hasta el momento en este manual. Conviene prestar atencin sobre la siguiente imagen, tomada de la documentacin de CodeIgniter, donde hemos traducido simplemente algunos nombres de los mdulos que participan.

En resumen, para que se pueda entender el flujo de aplicacin que implementa CodeIgniter, puedes seguir los siguientes puntos: 1. Toda solicitud de una pgina a partir de CodeIgniter comienza en un index.php que hay en la raz del framework. 2. Luego se realiza un filtrado de la URL para saber cul es elemento que tiene que procesar esta pgina. 3. Si la pgina se haba generado antes y est en la cach de CodeIgniter, se devuelve el archivo de la cach ya generado, con lo que se ahorra procesamientos repetidos. La cach se puede configurar y si lo deseamos, incluso deshabilitar. 4. Antes de continuar con el proceso se realiza un tratamiento de seguridad sobre la entrada que tengamos, tanto de la informacin que haya en la URL como de la informacin que haya en un posible POST, si lo hemos configurado as. 5. El controlador adecuado realiza el procesamiento de la solicitud. CodeIgniter decide el controlador que debe procesar la solicitud en funcin de la URL solicitada. 6. El controlador comunica con una serie de mdulos, los que necesite, para producir la pgina. 7. A travs de las vistas adecuadas, el controlador genera la pgina, tal cual se tiene que enviar al navegador. 8. Si la pgina no estaba en la cach, se introduce, para que las futuras solicitudes de esta pgina sean ms rpidas. Algunos de estos mdulos, como la cach o el enrutamiento, funcionan de manera transparente para nosotros. Algunos otros, como los controladores, modelos y vistas, los tenemos que programar por nuestra cuenta y localizan cada una de las partes de nuestro programa que, al estar sepadadas nos ayudan a organizar tambin nuestro cdigo. Tambin tenemos a nuestra disposicin diversas libreras, ayudantes (helpers) y plugins ya escritos en

CodeIgniter con numerosas clases y funciones muy tiles para el desarrollo de aplicaciones web. Uno de los puntos ms bsicos, pero no por ello menos tiles, de CodeIgniter que explicaremos dentro de poco, es el mdulo de entutamiento (routing) que permite que cualquier URL que se solicite al servidor se ejecute en el controlador adecuado. La URL se analiza y los datos se procesan y aseguran antes de enviarlos al controlador adecuado, en el que simplemente tendremos que codificar sus diversos mtodos. En el siguiente artculo estudiaremos el Modelo - Vista - Controlador, que implementa CodeIgniter como arquitectura para el desarrollo.

4.- Modelo - Vista - Controlador en CodeIgniter


Explicamos la arquitectura de desarrollo llamada Modelo - Vista - Controlador, que utiliza CodeIgniter y otros frameworks PHP. Seguimos ofreciendo captulos introductorios en el Manual de CodeIgniter de DesarrolloWeb.com, en esta ocasin vamos a explicar estilo de programacin que tenemos que seguir cuando desarrollemos nuestras aplicaciones web en CodeIgniter. El Modelo, Vista, Controlador es tpicamente utilizado para la creacin de aplicaciones web y no slo CodeIgniter lo implementa, sino tambin otra serie de frameworks de desarrollo web, en PHP u otros lenguajes. Es interesante porque separa en varios grupos las complejidades de las distintas partes que componen una pgina web, como la vista y la lgica, as como el acceso a la base de datos. Quizs lo que ms nos fuerce a cambiar nuestros hbitos de programacin en PHP es el hecho de tener que basar nuestros scripts en este modelo de programacin, que seguramente resultar novedoso para la mayora de los lectores de este manual, porque fija un nuevo estilo de desarrollo de aplicaciones, que nos obliga a separar cdigo fuente segn su mbito. Sin embargo, como decamos anteriormente, estas nuevas costumbres de codificacin tambin nos ayudarn a que nuestros programas sean mejores y disfruten de varias ventajas como ser ms organizados, extendibles y entendibles por otros desarrolladores, reutilizables, con ms fcil mantenimiento, etc. Para los que no lo conocen, el Modelo - Vista - Controlador (en ingls Model - View Controller) es un patrn de desarrollo o un estilo de arquitectura de software que separa el cdigo fuente de las aplicaciones en tres grupos: Modelo: Todo el cdigo que tiene que ver con el acceso a base de datos. En el modelo mantendremos encapsulada la complejidad de nuestra base de datos y simplemente crearemos funciones para recibir, insertar, actualizar o borrar informacin de nuestras tablas. Al mantenerse todas las llamadas a la base de datos en un mismo cdigo, desde otras partes del programa podremos invocar las funciones que necesitemos del modelo y ste se encargar de procesarlas. En el modelo nos podrn preocupar cosas como el tipo de base de datos con la que trabajamos, o las tablas y sus relaciones, pero desde las otras partes del programa simplemente llamaremos a las funciones del modelo sin importarnos qu tiene que hace ste para conseguir realizar las acciones invocadas.

Vista: La vista codifica y mantiene la presentacin final de nuestra aplicacin de cara al usuario. Es decir, en la vista colocaremos todo el cdigo HTML, CSS, Javascript, etc. que se tiene que generar para producir la pgina tal cual queremos que la vea el usuario. En la prctica la vista no slo sirve para producir pginas web, sino tambin cualquier otra salida que queramos enviar al usuario, en formatos o lenguajes distintos, como pueden ser feeds RSS, archivos JSON, XML, etc. Controlador: El controlador podramos decir que es la parte ms importante, porque hace de enlace entre el modelo, la vista y cualquier otro recurso que se tenga que procesar en el servidor para generar la pgina web. En resumen, en el controlador guardamos la lgica de nuestras pginas y realizamos todas las acciones que sean necesarias para generarlas, ayudados del modelo o la vista. Nota: Esto quiere decir, en la prctica para el caso de CodeIgniter, que segn sea el mbito donde estemos codificando, tendremos que escribir las lneas de cdigo de cualquier pgina web en tres grupos de archivos distintos. En una aplicacin estndar podremos tener varios modelos (por ejemplo, para cada una de las entidades distintas de la base de datos), varias vistas (una o varias para cada pgina o seccin) y varios controladores (para cada pgina o seccin de la web). Luego veremos dnde tenemos que guardar los archivos de cada uno de estos tres grupos. Durante el desarrollo con CodeIgniter ser muy recomendable seguir las normas del diseo Modelo - Vista - Controlador (MVC), pero realmente el framework es bastante flexible y permite que, si lo deseamos, no sigamos el desarrollo atendiendo a dicha arquitectura. En este caso, podramos tener simplemente controladores y dentro de ellos realizar todas las acciones de acceso a la base de datos directamente, sin hacer llamadas al modelo, o escribir texto en la salida sin utilizar las vistas. Obviamente, esta opcin no aprovechar las ventajas de separacin de cdigo entre presentacin, lgica y modelo de base de datos, pero si vemos que nos resulta muy complejo el MVC, podemos dejarlo de lado. En el caso que no utilizemos los modelos, no ocurrir ningn efecto negativo en el desempeo del framework, pero en el caso de las vistas, si no las utilizamos y escribimos salida directamente desde el controlador, como por ejemplo con sentencias echo de PHP en en cdigo de los controladores, perderemos algunas de las ventajas que CodeIgniter realiza por nosotros para procesar la salida antes de enviarla al usuario. Esto lo detallaremos ms adelante. Nota: Como sabemos, o podremos imaginar, separar la vista o presentacin de la lgica de los programas es una ventaja importante, ya que ayuda a mantener un cdigo ms sencillo, reducido y con mayor facilidad de mantenimiento. En principio puede parecer un tanto complejo el hecho de manejar varios archivos con cdigos distintos, pero a medio plazo nos vendr muy bien separar el cdigo de cada parte de nuestra aplicacin. Nos evitar muchos de los problemas que a veces tenemos en desarrollos PHP, donde en un mismo archivo tenemos mezclado cdigo en varios lenguajes como HTML, CSS, SQL, con el propio cdigo PHP para generar la lgica de nuestro negocio.

5.- URLs en CodeIgniter


Detalles sobre las URLs que genera CodeIgniter para las pginas de las aplicaciones, que siempre son amigables a buscadores.

Uno de los puntos que debemos conocer antes de empezar a trabajar con CodeIgniter es sobre cmo son las direcciones URL que utiliza este popular framework PHP para cada una de las pginas de las aplicaciones PHP que creemos utilizndolo. La verdad es que es un punto que realmente resulta transparente para nosotros, puesto que las URL se generan automticamente a medida que vamos programando el sitio web, pero est bien comentar algunas cosas importantes. ste es un artculo del Manual de CodeIgniter que estamos publicando en DesarrolloWeb.com, por lo que para entenderlo habr que leer alguno de los artculos previos a ste.

URLs amigables a buscadores


Uno de los puntos fuertes de este framework PHP es que las URL se presentan siempre en un formato amigable a los buscadores. Esto quiere decir que cualquier motor de bsqueda puntuar positivamente, a priori, las direcciones de las pginas. Del mismo modo, las direcciones tendrn una forma fcil de entender y recordar por los seres humanos. En DesarrolloWeb.com, en los manuales de posicionamiento y promocin en buscadores hemos hablado repetidas veces acerca de las URL amigables, pero para el que no lo sepa, estas son URL que no suelen ser puntuadas bien por los buscadores: www.midominio.com/articulos.php?id=32 www.midominio.com/articulos.php?nombre=miarticulo Si lo vemos, tenemos una pgina, articulos.php, que se le pasan distintos parmetros. Pero los buscadores muchas veces interpretan que es la misma pgina. Bueno, en realidad no tiene ms importancia, porque con CodeIgniter las URL tienen mucha mejor arquitectura, con formas como estas: www.midominio.com/articulos/muestra/32 www.midominio.com/controlador/funcion/parametro Las diferencias saltan a la vista, tanto para nosotros humanos como para motores de bsqueda como Google. Y lo bueno es que nosotros no tenemos que hacer nada para conseguir este tipo de direcciones. Nota: Hay un pequeo matiz que comentaremos ms tarde en este artculo y es que en principio todas las URL en CodeIgniter tienen el nombre de una pgina llamada index.php, pero esto es algo que podemos hacer desaparecer si sabemos configurar el framework.

Query String desactivado


En CodeIgniter en principio est desactivada la posibilidad de envo de variables a travs de la URL, lo que se conoce en ingls como Query String. Es decir, que direcciones en las que se envan variables a travs de las URL, que decamos que eran poco amigables a buscadores, no funcionarn.

Si se desea, se puede hacer que CodeIgniter reconozca las variables enviadas por la URL, pero como en principio el sistema de URLs amigables a buscadores que implementa el framework est pensado para poder evitar el problemtico Query String, su uso est desactivado.

Segmentos de la URL y el modelo - vista - controlador


Cada una de las partes de la URL de las aplicaciones creadas con el framework sirve para identificar qu controlador, del ya explicado Modelo - Vista - Controlador de CodeIgniter, se va a hacer cargo del procesamiento de la pgina, as como de la funcin que se invocar y los parmetros que se le enviarn a la misma. Por ejemplo: aplicacioncodeiginter.com/facturacion/editarempresa/5610

aplicacioncodeiginter.com es el nombre del supuesto dominio donde tenemos CodeIgniter instalado. facturacion es el nombre del controlador que se encargar de procesar la solicitud. editarempresa es el nombre de la funcin que habr dentro del controlador y donde estar el cdigo que ejecute y genere la pgina. Aunque para ser correctos, como el controlador est en programacin orientada a objetos, en vez de funcin, deberamos llamarle mtodo. Por ltimo, 5610, es el parmetro que se le pasa a la funcin editarempresa, que servir en este caso para que editarempresa sepa cul es la empresa que se desea editar. Si queremos o necesitamos enviar varios parmetros a esta funcin, y no slo el identificador de la empresa a editar, podremos colocarlos a continuacin, separados por barras.

Nota: Esto quizs resulte ahora un poco complicado, porque todava no tenemos una idea definida sobre cmo son los controladores, pero dentro de poco lo veris todo ms claro. CodeIgniter pone a nuestra disposicin una clase para trabajar con URLs llamada URI Class y una librera llamada URL Helper que contienen funciones para trabajar fcilmente con URLs y datos enviados en las mismas. En estas libreras hay funciones tan interesantes como site_url() que sirve para que el propio CodeIgniter cree una URL dentro del sitio a partir de un parmetro que le pasemos. Otro ejemplo es base_url(), que simplemente devuelve la URL raz donde est nuestra aplicacin CodeIgniter.

Todo pasa por index.php


En CodeIgniter existe un index.php que est en la raz del framework que se encarga de las funciones de enrutamiento hacia el controlador que se debe encargar de procesar la solicitud. Por ello, de manera predeterminada en CodeIgniter veremos que las URLs incluyen el nombre del archivo index.php. Este comportamiento se puede configurar. En el prximo artculo explicaremos cmo eliminar este index.php en las URLs de CodeIgniter, algo que simplificar las direcciones.

Aadir un sufijo a las URL


Otro de los detalles que podemos hacer con CodeIgniter, que pueden personalizar aun ms nuestras direcciones URL, es aadir un sufijo, que nosotros deseemos, al final de todas las URL que formen parte del framework. Por ejemplo, podramos desear que todas las URL acaben en .html o en .php, o como queramos. Esto se puede hacer a travs de los archivos de configuracin del framework. La idea es que una URL como esta: http://dom.com/index.php/blog/post/cualquier-articulo Pase a ser una direccin como esta otra: http://dom.com/index.php/blog/post/cualquier-articulo.html Para esto editamos el archivo de configuraciones generales: system/application/config/config.php y tenemos que buscar la variable url_suffix y colocar el valor que deseemos, por ejemplo: $config['url_suffix'] = ".html";

6.- Eliminar el index.php de las direcciones de CodeIgniter


Todas las URLs de CodeIgniter tienen un index.php que si lo deseamos podemos eliminar usando un archivo htaccess. Lo cierto es que las direcciones de CodeIgniter son bastante amigables a buscadores, pero todava pueden serlo ms. Esto es algo que vamos a ver en este artculo de DesarrolloWeb.com. En el artculo anterior, sobre las caractersticas de las URL de CodeIgniter, ya explicamos varias cosas que conviene saber acerca de componer direcciones para las pginas de nuestras aplicaciones PHP. Como se deca en ese artculo, todas las solicitudes a pginas de una aplicacin web en CodeIgniter pasan por un archivo index.php que est en la raz del framework. Este index.php se encarga de redirigir, o enrutar, la solicitud a travs del controlador que se est invocando (que se indica en el primer segmento despus del nombre del dominio). As pues, por defecto las URL de CodeIgniter tienen un formato como el que sigue: http://pruebas.com/index.php/empresas/editar/1 Pues bien, si deseamos eliminar el index.php de esta URL, para simplificar la direccin, hacerla todava ms amigable a buscadores y tambin ms entendible por los seres humanos, podemos utilizar un archivo .htaccess. Nota: En DesarrolloWeb.com hemos hablado en repetidas ocasiones acerca de los archivos .htaccess, explicando lo que son y cmo podemos utilizarlos para crear automticamente

URLs amigables a buscadores, sin que tengan que existir fsicamente los archivos en el servidor. Recomendamos la lectura del manual Editar htaccess para crear direcciones URL amigables http://www.desarrolloweb.com/manuales/htaccess-para-urls-amigables.html para obtener una informacin de referencia. As pues, podramos conseguir que nuestras direcciones no tuvieran siempre el mencionado index.php y quedasen con una forma similar a esta: http://pruebas.com/empresas/editar/1 Para ello existiran diversos mtodos y segn nuestro dominio de los archivos .htaccess y de las expresiones regulares, as como de la configuracin de Apache, podremos implementar una u otra. Nosotros en este artculo vamos a explicar un modo que est disponible en la propia gua de uso de CodeIgniter, que hemos probado y resulta sencillo y efectivo. Se trata de utilizar un mtodo de trabajo con .htaccess que llaman "negativo", donde todas las URLs son redirigidas a travs del archivo index.php, a no ser que tengan una forma determinada que no queramos que se redireccione. Por ejemplo, una URL como esta: www.loquesea.com/empresas Se redirigira a una URL como esta otra: www.loquesea.com/index.php/empresas Pero esa redireccin se hara de manera transparente al usuario y al navegador que nos visita. Es decir, el procesamiento de la pgina se hace a travs del index.php, pero nosotros no llegamos a percibir que en el servidor se ha llevado a cabo esa redireccin, quedando la URL en la barra de direcciones siempre sin el index.php. Ahora bien, hay determinadas direcciones que no vamos a desear que se redirijan, como puede ser una hoja de estilos CSS. Es decir, podemos tener en nuestro servidor un archivo como este: www.loquesea.com/css/estilos.css Y en ningn caso queremos que se procese a travs del index.php, sino que directamente se devuelva el archivo CSS que hay en esa ruta. Este es el caso en el que se utiliza el mtodo "negativo" del htaccess, a travs del comando "RewriteCond" (condicin de redireccin). Este caso obvio tambin lo tendramos, por ejemplo, en archivos como el robots.txt o aquellos donde podamos tener libreras de cdigo Javascript.

Cdigo htaccess para eliminar el index.php de CodeIgniter


As pues, podramos tener un archivo .htaccess en la raz de la instalacin del framework, que suele ser tambin la raz del dominio donde estamos trabajando, con un cdigo como el que sigue:

RewriteEngine RewriteCond $1 RewriteRule ^(.*)$ /index.php/$1 [L]

on !^(index.php|css|js|images|robots.txt)

Esto dira que se redirijan todos los archivos que se soliciten a este dominio, menos los que contengan el propio index.php, css, js, images o robots.txt. La redireccin se har a travs de la misma URL, pero agregando "index.php/" despus del nombre del dominio y antes de lo que haya justo despus de ese nombre de dominio. Nota: si tuviramos CodeIgniter instalado en un subdirectorio de nuestro dominio, por ejemplo, en el subdirectorio "carpeta", la regla de redireccin "RewriteRule" cambiara un poco: RewriteRule ^(.*)$ /carpeta/index.php/$1 [L] Ahora, slo nos faltara decirle a CodeIgniter que, al componer URLs para los enlaces entre las distintas pginas de nuestra aplicacin web PHP, no coloque el index.php, pues no lo necesitamos. Esto lo podemos hacer desde el archivo de configuracin principal, que estn en: system/application/config/config.php Simplemente tendramos que editar la variable de configuracin "index_page", ponindola a la cadena vaca. $config['index_page'] = ""; Este no sera necesariamente el nico mtodo. Por ejemplo, en la Wiki oficial de Codeigniter explican un modo distinto de conseguirlo, aunque bastante ms complejo: http://codeigniter.com/wiki/mod_rewrite/

7.- Controllers en CodeIgniter


Qu son los controladores -controllers en ingls- en el modelo MVC y en concreto en el framework PHP CodeIgniter, cmo crearlos y utilizarlos para generar las pginas de un sitio. Los controladores son uno de los componentes que forman parte del modelo de programacin MVC (Modelo - Vista - Controlador o Model - View - Controller en ingls) que sirven como engranaje principal a la hora de crear aplicaciones web. Dado que CodeIgniter utiliza la arquitectura MVC, tendremos que aprender a manejar y dominar los controladores como un primer paso para comenzar a trabajar con este framework PHP. Para los que no sepan qu es el MVC cabe decir que ya fue explicado en este manual de CodeIgniter, concretamente en el captulo Modelo - Vista - Controlador en CodeIgniter. As que podemos pasar directamente a explicar las particularidades de los controladores en este entorno de programacin. Para explicar los controladores voy a basarme en la propia documentacin del framework PHP, que est tutorializada, como ya dijimos en la introduccin a CodeIgniter. Por lo que resulta una manera excelente para aprender a dar los primeros pasos en el desarrollo de aplicaciones.

Qu es un controlador
Un controlador en CodeIgniter es un archivo que contiene el cdigo de una clase, de programacin orientada a objetos, que colocamos en un directorio especfico del esquema de carpetas de nuestro sitio. Tiene un nombre cualquiera, que se asociar con una URL de nuestra aplicacin web. Por ejemplo, esta podra ser una URL de nuestra aplicacin: midominio.com/index.php/articulos En la URL anterior podemos ver que la palabra "artculos" determina la pgina que queremos ver dentro de nuestra aplicacin. Pues bien, para poder atender esta solicitud nosotros vamos a tener que crear un archivo llamado articulos.php (el controlador) dentro del directorio que aloja los controladores de nuestra aplicacin. Por tanto, cuando CodeIgniter detecta una URL como esta, intentar acceder al archivo articulos.php, para cargarlo, procesarlo y de ese modo mostrar la pgina con los contenidos de esta seccin. Cuando ese controlador no se encuentre entre los archivos de controladores de CodeIgniter, simplemente se mostrar un error 404 de pgina no encontrada. Si se encontr el controlador, como se deca, se carga y se procesa para mostrar la pgina. Los controladores en CodeIgniter se guardan en la carpeta "system/application/controllers/", que se encuentra dentro de los archivos de CodeIgniter. Nota: Todos los archivos que vamos a tener que crear o editar para desarrollar nuestra aplicacin PHP con CodeIgniter estn dentro de la carpeta "system/application" y existe una carpeta dentro para cada tipo de cosa que deseemos crear o modificar, como archivos de configuracin, modelos, vistas, etc.

Creando un primer controlador en CodeIgniter


Para empezar a programar en CodeIgniter vamos a crear un primer controlador, llamado artculos, que simplemente mostrar un mensaje de bienvenida para saber que todo est funcionando correctamente. El cdigo de este primer controlador ser el siguiente: <?php class Articulos extends Controller { function index() { echo 'Bienvenido a mi primer controlador en CodeIgniter'; } } ?>

Este archivo lo tenemos que guardar como "articulos.php" en la carpeta "system/application/controllers/". Caben sealar unos detalles importantes:

En nombre del archivo de controlador, en este caso articulos.php, va en minsculas. 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 mayscula. Por eso aparece como class Articulo extends Controller. Todos los controladores tienen que extender la clase "Controller" (que tambin tiene la primera letra "C" en mayscula), 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://localhost/index.php/articulos Nota: Esta URL supone que has instalado CodeIgniter en la raz de tu servidor web, pero podras haber instalado CodeIgniter en otro directorio, en tal caso la URL tendra una forma como http://localhost/directorio_de_codeigniter/index.php/articulos En caso que est funcionando todo correctamente, tendrs que visualizar una pgina con el mensaje que habas colocado en el echo que hay dentro de la funcin index() del controlador. Si no funciona, comprueba tu URL, que tiene acceder al directorio correcto donde hayas instalado CodeIgniter y que tiene que acabar con el nombre del controlador en minsculas. Comprueba tambin que la clase que has creado en el cdigo del controlador tiene la primera letra en mayscula. No debe haber mucho problema ni dificultad. En el siguiente artculo veremos cmo podemos crear funciones en los controladores, para dar lugar pginas distintas que dependan del mismo controlador.

Controlador por defecto


Pero, antes de acabar el presente artculo, quiero hablar sobre el controlador por defecto, que es el que se invoca en CodeIgniter cuando no se especifica ningn nombre de directorio y por tanto ningn controlador, en la siguiente URL: midomino.com/index.php/ O bien en esta otra: midominio.com/ Esto, que sera la home de la aplicacin CodeIgniter, y eventualmente la home del dominio, si es que hemos instalado el framework en la raz del directorio de publicacin, invoca tambin 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 configuracin 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 mayscula. $route['default_controller'] = 'Articulos'; Si observamos el valor de esta variable de configuracin, tal como est en el momento inicial, despus de la instalacin de CodeIgniter, veremos que el controlador por defecto est en la clase "Welcome", archivo application/controllers/welcome.php

8.- Funciones en los controladores


En CodeIgniter podemos crear controladores con distintos nombres de funciones, para dar lugar a diversas pginas que dependen del mismo controlador. En el captulo anterior del Manual de CodeIgniter, que venimos publicando en DesarrolloWeb.com, estuvimos explicando lo que son los controladores, la parte fundamental de las aplicaciones basadas en la arquitectura de desarrollo denominada MVC. Conocer los controladores es bsico y nos permitir hacer nuestras primeras pruebas con este framework PHP. A continuacin explicaremos para qu sirven las distintas funciones o mtodos que podemos incluir en los controladores. CodeIgniter dispone de un mecanismo sencillo para dar pie a URLs distintas que dependen del mismo controlador. Es decir, podemos asociar a un controlador muchas pginas, con URL distintas, que se ejecutan llamando siempre a un mismo controlador. Por ejemplo, pensemos que tenemos una tienda online de venta de productos informticos. Entonces podramos tener una URL donde se muestran los productos, pero a su vez tendremos muchas clasificaciones de productos y cada cliente podra ver una ficha completa con cada uno de ellos. Todas las fichas de productos se podran meter dentro de un mismo controlador, dando lugar a distintas URL, como pueden ser las siguientes: dominio.com/index.php/productos dominio.com/index.php/productos/ordenadores dominio.com/index.php/productos/monitores dominio.com/index.php/productos/perifericos/raton_genius dominio.com/index.php/productos/ordenadores/mac_mini/2gigas dominio.com/index.php/productos/ordenadores/mac_mini/4gigas ... Todas estas URL dependen del mismo controlador, que sera el controlador de productos (tal como se dijo en el anterior artculo sera la clase "Productos" que extiende la clase "Controller" y debemos colocar en el archivo "productos.php" dentro del directorio donde se colocan los controladores (application/controllers). Como se puede ver, el primer nombre del directorio despus del dominio y el index.php es el nombre del controlador, en este caso siempre "productos". Por eso todas las URL que tenamos antes dependen del mismo controlador. Sin embargo, las URL que he colocado aqu son un puro ejemplo, para que se pueda ver cmo se pueden generar URLs que dependen de un mismo controlador. Pero dependiendo de cmo deseemos organizar nuestro sitio web

podramos decidir hacer uso de otras URL para mostrar ms o menos lo mismo. Lo bueno, como tambin se puede comprobar viendo esas URL, es que en CodeIgniter siempre se generan URLs sin paso de parmetros, es decir, siempre totalmente amistosas a motores de bsqueda.

El segundo directorio corresponde a los nombres de las funciones


Ahora que ya sabemos que el primer directorio despus del index.php corresponde con el nombre del controlador, podemos observar el segundo directorio de las URL generadas con CodeIgniter. ste se refiere al nombre de la funcin o mtodo que atender esa solicitud dentro del controlador. Si no se indica ningn nombre de funcin CodeIgniter siempre invoca a la funcin llamada index(), as pues, la URL: dominio.com/index.php/productos Ser procesada por la funcin index() que coloquemos en el controlador. Este es un caso especial, porque no se ha indicado nombre de funcin, pero dadas URLs como estas: dominio.com/index.php/productos/ordenadores dominio.com/index.php/productos/monitores Tendremos que generar dichas funciones en el controlador, como se puede ver en el siguiente cdigo: <?php class Productos extends Controller { function index(){ echo 'Esto es la portada de productos'; } function ordenadores(){ echo 'Aqu se muestran los productos de ordenadores'; } function monitores(){ echo 'Aqu se muestran los productos de monitores'; } } ?> Como se puede ver, hemos creado dos nuevas funciones dentro de un controlador para productos, para poder mostrar dos tipos de productos distintos. Aclaracin: Estamos refirindonos siempre como funciones de los controladores, pero realmente deberamos llamarles mtodos, porque los controladores son clases y las clases tienen mtodos y no funciones.

Tercer directorio y los siguientes son los parmetros que se envan a las funciones Ahora vamos a observar otras URL que dependen del controlador de productos, pero que tienen ms de un directorio adicional al nombre del controlador. Vimos que el primer directorio es el controlador, el segundo el mtodo que se invocar dentro del controlador y ahora veamos que pasa con el tercer parmetro y los siguientes, en caso que haya. dominio.com/index.php/productos/perifericos/raton_genius dominio.com/index.php/productos/ordenadores/mac_mini/2gigas dominio.com/index.php/productos/ordenadores/mac_mini/4gigas Estos directorios adicionales son simples parmetros en los mtodos del controlador. As, por ejemplo, la primera de las URL que acabamos de ver se corresponde con el mtodo "perifericos", pasndole el nombre del perifrico que se desea ver "raton_genius". Este dato adicional se puede recibir en el mtodo con un cdigo como este: function perifericos($modelo){ echo 'Ests viendo el perifrico ' . $modelo; } As tenemos el mtodo "perifericos" que recibe el parmetro modelo. Este parmetro tomar el valor del tercer directorio. Entonces en la URL: dominio.com/index.php/productos/perifericos/raton_genius Estaremos invocando el mtodo perifericos() y pasando como valor en el parmetro $modelo la cadena "raton_genius". Esto se puede complicar un poco ms en URL como estas: dominio.com/index.php/productos/ordenadores/mac_mini/2gigas Como se puede comprobar, aqu estamos pasando dos parmetros al mtodo ordenadores() del controlador "Productos", que podramos procesar de una manera similar a esta: function ordenadores($marca=null, $modelo=null){ if (is_null($marca) && is_null($modelo)){ echo 'Aqu se muestran los productos de ordenadores'; }elseif(is_null($modelo)){ echo 'Mostrando ordenadores de marca ' . $marca; }else{ echo 'Mostrando ordenadores de marca ' . $marca . ' y modelo ' . $modelo; } } En la anterior funcin se comprueba qu parmetros se recibe en el mtodo antes de dar por sentado que estamos recibiendo alguno de ellos. Procesar correctamente URLs como estas:

http://localhost/index.php/productos/ordenadores http://localhost/index.php/productos/ordenadores/toshiba http://localhost/index.php/productos/ordenadores/hp/pavillon590 Con todo lo que hemos visto hasta ahora de controladores, tenemos este cdigo en el archivo "productos.php" del directorio "controllers". <?php class Productos extends Controller { function index(){ echo 'Esto es la portada de productos'; } function ordenadores($marca=null, $modelo=null){ if (is_null($marca) && is_null($modelo)){ echo 'Aqu se muestran los productos de ordenadores'; }elseif(is_null($modelo)){ echo 'Mostrando ordenadores de marca ' . $marca; }else{ echo 'Mostrando ordenadores de marca ' . $marca . ' y modelo ' . $modelo; } } function monitores(){ echo 'Aqu se muestran los productos de monitores'; } function perifericos($modelo){ echo 'Ests viendo el perifrico ' . $modelo; } } ?> Esperamos que con lo que se sabe hasta el momento se puedan hacer las primeras pruebas con controladores en CodeIgniter. Sin embargo, hay que decir que aun no lo hemos visto todo con relacin a los controladores, aunque lo dejaremos para el prximo artculo.

9.- Vistas en CodeIgniter


Qu son las vistas y como debemos utilizarlas en CodeIgniter para maximizar las ventajas del modelo - vista - controlador. Vamos a pasar a un nuevo tema en el Manual de CodeIgniter en el que comenzaremos las explicaciones de las vistas, parte fundamental en este framework PHP y en el patrn de desarrollo de aplicaciones que utiliza, llamado modelo - vista - controlador. En artculos anteriores de DesarrolloWeb.com ofrecimos una buena introduccin a los controladores, y aunque realmente no hemos visto todo lo que los controladores nos ofrecen, estamos en condiciones de aprender otras cosas jugosas en CodeIgniter, que seguro nos motivarn durante nuestro aprendizaje, al ver que todo es bastante sencillo de asimilar.

Qu son las vistas


Una vista es una pgina web o un fragmento que se guarda en un archivo aparte. En una vista podramos guardar, por tanto, toda la estructura de una pgina, o si preferimos una organizacin ms minuciosa y por mdulos, podremos guardar simplemente una seccin, como puede ser la cabecera, pie, barra de navegacin, etc. El grado de complejidad en el trabajo con vistas podremos marcarlo nosotros, segn nuestras preferencias, costumbres de desarrollo o necesidades especficas, dado que podremos anidar unas vistas dentro de otras en cualquier nivel de jerarqua. Las vistas no se acceden ni se invocan directamente con la solicitud de una URL en nuestra aplicacin web, como ya podremos suponer. En realidad son mdulos que se invocan desde los controladores, ya que en el modelo - vista - controlador que implementa CodeIgniter, la lgica de nuestra aplicacin se almacena en el controlador y es ste el que debe llamar a las vistas que necesite para mostrar los resultados al visitante. As pues, los controladores decidirn qu hacer cuando se reciba una solicitud y las vistas decidirn cmo mostrar los resultados. Por decirlo de otra forma, la lgica de nuestra aplicacin residir en el controlador y la vista mantendr el aspecto de nuestra pgina, el diseo de la pgina que se mostrar al usuario.

Crear una vista


Crear una primera vista en nuestra aplicacin web es muy sencillo. Simplemente creemos un archivo con un poco de cdigo HTML. <html lang="es"> <head> <title>Mi pgina web</title> </head> <body> <h1>Bienvenido a mi web</h1> </body> </html> Ahora podemos guardar esa vista con el nombre que deseemos y extensin ,php, por ejemplo mivista.php, en el directorio de las vistas que es "system/application/views".

Cargar una vista


Como decamos, podemos invocar una vista desde un controlador. De hecho, cada vez que deseemos mostrar en la pgina cualquier texto, debemos invocar a la vista que necesitemos, o al menos sera la manera de proceder, en vez de hacer sentencias "echo" o similares directamente en el controlador. Para cargar una vista hacemos lo siguiente: $this->load->view('nombreDeLaVista');

En 'nombreDeLaVista' tendremos que indicar el nombre del archivo donde hemos guardado la vista, pero sin el ".php". Veamos entonces cmo quedara un controlador que llama a la vista que hemos hecho antes en este artculo. <?php class MiControlador extends Controller { function index(){ $this->load->view('mivista'); } } ?> Este controlador lo guardamos en la carpeta de controllers con el nombre "micontrolador.php". Y ahora podremos acceder a l por medio de una URL como esta: http://localhost/index.php/micontrolador O si tenemos CodeIgniter instalado en nuestro dominio, con una URL como esta otra: http://www.midominio.com/index.php/micontrolador Deberamos ver simplemente el contenido de esa vista creada anteriormente. Es as de simple.

Almacenar vistas en subdirectorios


Debemos colocar todas las vistas en el directorio "views" (system/application/views), pero si lo deseamos podemos organizarlas por subdirectorios, lo que puede servir de utilidad si vamos a manejar gran nmero de vistas distintas, que dependen de secciones variadas de la pgina. Para ello simplemente creamos un subdirectorio con el nombre que queramos, dentro de "views" y guardamos all las vistas. Por ejemplo pensemos que tenemos varias vistas que pertenecen todas a la zona de registro de usuarios y queremos organizarlas en la carpeta "registro" (ruta completa "system/application/views/registro"). Entonces, las vistas colocadas all se invocaran indicando el subdirectorio donde se encuentran, de la siguiente manera: $this->load->view('registro/formulario_registro');

Llamar a varias vistas desde un controlador


Nada impide que organicemos nuestro contenido por partes, en vistas distintas, de hecho es una buena prctica que nos ayudar a mantener nuestro cdigo de una manera ms sencilla. Llamar a las distintas vistas ir concatenando todo el cdigo HTML creado por cada vista y luego se enviarn al navegador todas juntas como el resultado de procesar una pgina.

Podremos invocar varias vistas en una funcin de un controlador, de una manera similar a esta: function cargarVistas(){ //cargo una vista cabecera.php que est en el directorio plantillas $this->load->view('plantillas/cabecera'); //cargo una vista llamada formulario_busqueda.php $this->load->view('formulario_busqueda'); //creo un array de datos para enviarlo a una vista $datos['page_title'] = 'Mi Ttulo'; //cargo una vista llamada cuerpo.php a la que le mando un array de datos para configurarla $this->load->view('cuerpo', $datos); //cargo una vista que est en el directorio plantillas $this->load->view('plantillas/pie'); } En este ejemplo hemos cargado varias vistas y en una de ellas le hemos enviado datos para configurar cmo se mostrar al visitante, en concreto la vista cuerpo.php. Esta utilidad es fundamental para que las vistas muestren cualquier informacin que se enve desde los controladores y no solamente un texto siempre igual. En el prximo artculo sobre vistas aprenderemos a realizar esta accin.

10.- Ms sobre las vistas


Veremos puntos adicionales sobre las vistas en CodeIgniter, como el paso de parmetros de configuracin, codificacin PHP especfica de las vistas y cmo pueden devolver un texto en vez de escribirlo en pantalla. Como hemos dicho anteriormente, las vistas sern parte fundamental de nuestras aplicaciones web en CodeIgniter. En el artculo anterior del Manual de CodeIgniter ya comenzamos a explicar qu eran las vistas y los detalles generales sobre su uso. No obstante, aun tenemos algunas cosas en el tintero que debes saber sobre las vistas. En el presente artculo vamos a conocer varias cosas importantes sobre las vistas en CodeIgniter. Comenzaremos explicando cmo podemos pasar valores a las vistas para personalizarlas, de manera que muestren una informacin dada y no siempre el mismo texto fijo. Luego veremos que en las vistas podemos colocar cualquier cdigo PHP, adems del cdigo HTML necesario para mostrar la informacin y que existen diversos esquemas de codificacin alternativos en CodeIgniter, que podemos utilizar para ahorrar cdigo fuente. Acabaremos mostrando cmo una vista puede devolver el texto resultado de procesarse a una variable, en vez volcarlo en la salida por defecto, es decir, en vez de enviarlo al cliente como cdigo de la pgina.

Aadiendo datos dinmicos a las vistas


Una de las cosas ms bsicas que querremos hacer con las vistas es personalizar las informaciones que muestren a travs de unas variables de configuracin. As, las vistas podrn mostrar diferentes datos con un mismo cdigo. Por ejemplo, pensemos que tenemos una vista con el cdigo de una pgina completa, con el diseo propio de nuestro sitio. Esa vista podramos estar usndola para todas las pginas del sitio web, pero en ese caso enviaremos distintas variables de configuracin con los datos propios de cada pgina, como pueden ser el ttulo de la pgina, el cuerpo, etc. Todos esos datos se envan a travs de un array asociativo que se pasa a la vista, y dentro de ella podremos acceder a cada uno de los elementos de ese array a partir del ndice de ese elemento. Lo podremos ver fcilmente con un ejemplo. Comenzamos por construir un array asociativo con los datos de la vista. En el cdigo siguiente podemos ver el controlador que hicimos en el artculo anterior para mostrar el trabajo con vistas, en el que hemos aadido el cdigo para generar el array asociativo y enviarlo a la vista. <?php class MiControlador extends Controller { function index(){ $datos = array( 'titulo' => 'Pgina de prueba', 'descripcion' => 'Esta es la descripcin de esta pgina, un poco ms larga.', 'cuerpo' => 'El cuerpo de la pgina probablemente ser un texto muy largo...<p>Con varios prrafos</p>' ); $this->load->view('mivista', $datos); } } ?> Ahora, en la vista, podemos acceder a todos los datos de ese array asociativo, como si fueran variables normales, a travs de los nombre de los ndices del array. Veamos el cdigo de mivista.php que consume los datos que se le envan para configurar su contenido. <html> <head> <title><?php echo $titulo?></title> </head> <body> <h1><?php echo $titulo?></h1> <blockquote> <p><b><?php echo $descripcion?></b></p>

</blockquote> <p><?php echo $cuerpo?></p> </body> </html> Como estamos viendo, podemos mostrar los contenidos de las variables de configuracin enviadas a la vista a travs de simples instrucciones echo de PHP. Los datos que se reciben en la vista estn disponibles por medio de variables normales, con nombres iguales a los ndices del array asociativo que se envi al cargar la vista.

Cdigo PHP dentro de las vistas


Las vistas en CodeIgniter son bastante flexibles y permiten ejecutar cualquier tipo de cdigo PHP que necesitemos. En principio las acciones que necesitaremos codificar dentro de una vista sern bastante simples, como mostrar el contenido de variables, o realizar algn bucle por alguna estructura de datos. Sin embargo, nada impide escribir cdigo PHP, lo complejo que queramos, con accesos a recursos del servidor, bases de datos, etc. Sin embargo, insisto que si utilizamos correctamente las vistas, segn como se debera a en el modelo - vista - controlador, no deberamos hacer operaciones muy complicadas. CodeIgniter dispone adems de algunas estructuras de cdigo, adicionales a las que existen en el propio PHP, que podemos utilizar dentro de las vistas y que nos pueden ayudar a reducir nuestro cdigo o a esquematizarlo un poco ms. El primero de los cdigos alternativos es muy til, pues se trata de un resumen de la sentencia echo. Por ejemplo, el cdigo siguiente: <?php echo $variable?> Se puede resumir por este otro: <?=$variable?> Del mismo cdigo CodeIgniter dispone de estructuras de control if, for, foreach y while que se pueden escribir de una manera resumida, en comparacin con las estructuras de control habituales en PHP. Ahora no vamos a explicar la sintaxis de estos elementos, por lo que recomendamos leer la documentacin del framework para encontrar ms referencias. Nota: Estas maneras nuevas de hacer bucles y condicionales, en mi opinin, pueden ser tiles para usuarios que no conocen PHP, pero no merece mucho la pena aprenderlas si ya dominamos PHP, como probablemente ocurra si estamos leyendo este manual. Sin embargo, si la responsabilidad de crear las vistas cae sobre un diseador que no conoce PHP, puede que le sea ms sencillo utilizar, por ejemplo, el IF de CodeIgniter en vez del IF tpico de PHP. Todo depende de con qu se sienta ms cmodo. La ventaja puede ser la sencillez y que en las estructuras de CodeIgniter no hace falta utilizar las llaves en los bucles o estructuras IF. Sin embargo, existe una desventaja y es que CodeIgniter necesitar preprocesar la vista para convertir las estructuras de cdigo de CodeIgniter en las estndares de PHP y esto llevar un

tiempo. Adems, cuando tengamos un error de sintaxis en el cdigo de una vista, si estamos utilizando las estructuras de control de CodeIgniter, es muy probable que la lnea de cdigo donde PHP informe del error no corresponda con la lnea de cdigo en la vista donde hemos hecho algo mal, lo que puede dar algn que otro dolor de cabeza en la etapa de depuracin.

Revolver vistas como un dato de tipo string


Cuando cargamos una vista en CodeIgniter la salida producida por ella se enva al usuario visitante una vez hayan sido procesada la funcin del controlador que invoca las vistas. Este comportamiento es el estndar dentro del framework, pero tambin podramos conseguir que el cdigo HTML resultante de cargar una vista se devuelva al controlador para poder almacenarlo en una variable y hacer con l lo que podamos necesitar. Esto lo conseguimos enviando un tercer parmetro al mtodo que carga una vista, con un valor true, que indica justamente eso, que deseamos que el mtodo devuelva el cdigo procesado por la vista. $cadena = $this->load->view('mivista', '', true); La lnea de cdigo anterior provocara que la carga de la vista se almacene en la variable $cadena. Como se puede ver, al llamar a la vista tenemos que indicar el nombre de la vista, seguido con el nombre del array que contiene los datos para configurar la vista (o comillas comillas si no estamos pasando datos a la vista), y finalmente el valor true como tercer parmetro. En un esquema como este, el contenido de la vista no se enviara al navegador, a no ser que luego hagamos un echo de la variable $cadena o algo parecido.

11.- Modelos en CodeIgniter


Veamos qu son los modelos en CodeIgniter, que se pueden utilizar de manera opcional para encapsular los accesos a la base de datos. En este artculo, que forma parte del Manual de CodeIgniter, vamos a comenzar con los modelos en CodeIgniter, el tercero y ltimo de los integrantes del patrn de desarrollo utilizado en este framework PHP. En artculos anteriores ya vimos de manera general qu eran los modelos, cuando explicamos el Modelo - Vista - Controlador (MVC), as que en este caso vamos a ver cmo CodeIgniter los gestiona. No obstante cabe decir que los modelos en el MVC son los mdulos 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 operacin. Al centralizarse todas las acciones sobre la base de datos por medio de los modelos, en los controladores podemos olvidarnos de lo compleja o simple que sea nuestra base de datos, incluso de qu tipo de base de datos tiene el servidor con el que estamos trabajando. En el patrn MVC, los modelos son una de las partes fundamentales, pero en el caso de CodeIgniter, su uso es slo 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 operacin sobre la base de datos en los propios controladores.

Nota: La posibilidad de usar o no modelos depende de nosotros. Esta libertad en cuanto a la eleccin de nuestras propias costumbres de codificacin es muy propia de CodeIgniter, que se vende a si mismo como un framework flexible, que se puede adaptar a la mayora de los entornos. Nosotros, no obstante, queremosrecomendar su utilizacin, por lo menos para probar las ventajas de uso y ver si en el futuro nos interesa o no basarnos en ellos para realizar los accesos a la base de datos. Sin duda, si queremos programar "a lo grande", debemos utilizarlos. De hecho ofrecen muchas ventajas para proyectos grandes, como la abstraccin de base de datos.

Cmo es un modelo en CodeIgniter


Los modelos en la prctica son clases, de programacin orientada a objetos, que tienen sus mtodos o funciones, a los que se puede invocar desde los controladores para hacer operaciones con la base de datos. Los modelos, como decamos, contendrn una serie de funciones o mtodos para realizar las operaciones tpicas. Por ejemplo, pensemos en una aplicacin que tiene que trabajar con usuarios. Entonces tendremos un modelo de usuarios que tendr una serie de funciones, como la seleccin de usuarios, insercin, actualizacin y borrado. Nuestra aplicacin generalmente tendr varios modelos, para trabajar con cada una de las entidades de nuestra base de datos. Aqu podemos ver un ejemplo de modelo en CodeIgniter, aunque incompleto, que puede darnos alguna idea. Puede merecer la pena echar un vistazo, a pesar que no lo entendamos del todo. No hay que preocuparse, pues en breve explicaremos cada una de sus partes con detalle. class Usuario_model extends Model { function __construct(){ parent::Model(); } function existe_email($email){ $this->db->select('email_usuario'); $this->db->where('email_usuario', $email); $query = $this->db->get('usuario'); if ($query->num_rows() > 0){ return 1; } return 0; } function usuario_login($email){ $this->db->where('email_usuario', $email); //$this->db->where('clave', md5($clave)); $query = $this->db->get('usuario'); if ($query->num_rows() > 0){ return $query->row(); } return 0; }

function inserta_usuario($datos = array()){ if(!$this->_required(array("email_usuario","clave"), $datos)){ return FALSE; } //clave, encripto $datos['clave']=md5($datos['clave']); $this->db->insert('usuario', $datos); return $this->db->insert_id(); } }

Bases de la construccin de modelos en CodeIgniter


Los modelos se construyen extendiendo la clase Model y tenemos que nombrarlos con la primera letra en maysculas. 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 Model). Este sera el modelo ms bsico, que est vaco, ya que no tiene ninguna funcin para operar con la base de datos. Mostramos primero el cdigo bsico de un modelo en PHP 5, donde los constructores tienen el nombre __construct(). class Nombre_model extends Model { function __construct(){ parent::Model(); } } Ahora veamos cmo sera el modelo bsico en PHP 4, donde los modelos tendran una pequea diferencia, dado que los constructores en la versin 4 de PHP tienen siempre el mismo nombre que la propia clase. class Nombre_model extends Model { function Nombre_model(){ parent::Model(); } } Los modelos se han de guardar en la carpeta "system/application/models/". El nombre de archivo del cdigo del modelo debe tener extensin .php y se ha de escribir con todas las letras en minsculas. Por ejemplo nuestro modelo, cuya clase que se llama "Nombre_model", deberamos guardarlo en la ruta: system/application/models/nombre_model.php Si lo deseamos, podemos organizar nuestros modelos por subdirectorios, siempre dentro de la carpeta "system/application/models/". Simplemente cuando los carguemos tendremos que indicar en qu carpeta estn localizados.

En el siguiente artculo ampliaremos esta informacin y mostraremos cmo utilizar los modelos en una aplicacin web, cargndolos desde los controladores e invocando sus mtodos para el acceso a las tablas. Luego veremos cmo configurar CodeIgniter para decirle cul es nuestro servidor de base de datos, el nombre de la base de datos a utilizar y otros datos de acceso, para que el propio Framework pueda hacer conexiones desde los modelos.

12.- Utilizar los modelos desde los controladores en CodeIgniter


Cmo utilizar los modelos desde un controlador de CodeIgniter, cargar el modelo, solicitar datos al modelo por medio de sus mtodos y mostrarlos por pantalla con una vista. En el artculo anterior del Manual de CodeIgniter comenzamos a explicar los modelos y cmo gestionar las conexiones a base de datos con ellos. Vimos cmo se construyen los modelos, por lo que ahora pasaremos mostrar cmo utilizarlos desde los controladores.

Cargar un modelo
La carga de un modelo se realiza desde el controlador que lo va a utilizar, por medio del mtodo de carga de modelos, con un cdigo como este: $this->load->model('Nombre_model'); Esto supone que el modelo est en el directorio general de los modelos (system/application/models). Ahora, si pretendisemos cargar un modelo que est en un subdirectorio, tendramos que indicar la ruta en la funcin de carga del modelo. $this->load->model('carpeta_del_modelo/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('Cliente_model','Factura_model')); Una vez cargado un modelo, sus mtodos para el acceso a los datos estarn disponibles en nuestro controlador, a travs del propio objeto controlador, el nombre del modelo que queremos accionar y la funcin que queremos invocar dentro del modelo. $this->Nombre_model->funcion_del_modelo();

Carga automtica de modelos


Si deseamos cargar automticamente uno o varios modelos cada vez que se inicia cualquier solicitud de pgina en nuestra aplicacin web, es decir, sin que tengamos que cargarlos explcitamente desde los controladores, podemos especificar en el archivo de configuracin "autoload.php" cules son los modelos que vamos a requerir siempre.

Este archivo de configuracin se encuentra en la ruta "system/application/config/autoload.php". Tenemos que modificar la lista de modelos a cargar en la variable de configuracin "model", con un cdigo como este: $autoload['model'] = array('Usuario_model', 'Empresa_model'); Esto cargara el modelo de usuarios y el modelo de empresas en todas las pginas de nuestra aplicacin web con CodeIgniter.

Ejemplo de controlador que utiliza modelos


Para que se pueda ver mejor cmo utilizar un modelo desde un controlador, veamos un ejemplo. A continuacin tenemos un esquema de un controlador que utiliza los modelos para extraer datos de la base de datos y enviarlos a una vista para mostrarlos en la pgina. class Factura extends Controller { function mostrar_factura($id_factura){ $this->load->model('Factura_model'); $factura = $this->Factura_model->dame_factura_id($id_factura); $this->load->view('mostrar_factura', $factura); } } Este controlador llamado Factura tiene una funcin para mostrar una factura, que recibe el identificador de la factura que se desea ver. En dicha funcin se carga el modelo adecuado para el trabajo con facturas "Factura_model". Luego llamamos a la funcin dame_factura_id() del modelo cargado, a la que le pasamos el identificador de la factura que desebamos ver. La funcin dame_factura_id() del modelo devuelve un array con los datos de la factura. Luego mostramos los datos de la factura con la vista "mostrar_factura" y con los datos de configuracin, que es el array que obtuvimos al invocar la funcin del modelo. Con esto hemos podido ver un controlador simplificado, que utiliza tanto un modelo como una vista para mostrar el contenido de una factura que se ha trado de la base datos. Por fin hemos visto todos los componentes del MVC trabajando por separado y coordinados desde el controlador. Espero que hasta este punto haya quedado claro al menos el modo en el que trabajaremos con CodeIgniter, aunque todava hay muchas cosas en el aire que trataremos de explicar en el futuro.

Conectar con una base de datos


Pero antes de terminar este tema, por si alguien desea hacer sus primeras pruebas para construir un modelo, conviene explicar cmo conectar con la base de datos en CodeIgniter. En realidad existen diversos modos de conexin, automtica y manual, pero no los vamos a ver todos ahora. Veremos simplemente el mtodo ms sencillo para hacer la conexin con la base de datos, que es la conexin automtica. sta la realiza CodeIgniter por nosotros en cada pgina que se

solicite al servidor y tenemos que configurarla en el archivo de configuracin autoload.php (system/application/config/autoload.php). En ese archivo veremos un array de libreras que se tienen que incluir en todos los controladores, array "libraries". En ese array tenemos que colocar la librera 'database', de una forma como esta: $autoload['libraries'] = array('database', 'otras_librerias..."); Adems, tendremos que modificar otro archivo de configuracin llamado database.php (system/application/config/database.php), colocando todos los datos de la base de datos que queremos usar: el servidor, usuario, contrasea, base de datos, etc. Por ejemplo, esto sera un ejemplo de configuracin de una base de datos que tenemos en local. $db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "facturacion"; $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";

13.- Repaso: tutorial para hacer una aplicacin de prueba en CodeIgniter


Realizamos una pequea aplicacin de prueba con CodeIgniter, que nos servir de repaso al MVC y a todo lo que hemos visto hasta ahora en el manual. Vamos a dar un primer repaso a lo todo lo que conocemos sobre CodeIgniter, que ser suficiente para poder hacer una primera aplicacin, sencilla, pero til para ver en marcha todo lo que hemos ido aprendiendo en el Manual de CodeIgniter. La idea es que podamos hacer nuestra primera aproximacin al trabajo de desarrollo en este framework, basado en el Modelo - Vista - Controlador (MVC). Haremos un ejemplo de aplicacin que mostrar artculos de una base de datos. Lo cierto es que ser mucho llamarlo aplicacin, porque slo es una pequea parte de lo que podramos necesitar en una aplicacin completa, pero esperamos que el ejemplo sea suficientemente didctico. No obstante, recordar que para entender todos los cdigos tendrs que buscar las explicaciones de cada uno de los artculos que hemos visto en este manual de desarrollo web .com.

1.- Crear un controlador


Vamos a crear un controlador para empezar, con un cdigo inicial bsico.

<?php class Articulos extends Controller { function index(){ $this->load->view('home'); } } ?> Simplemente hemos colocado una funcin index(), que es la que se llamar cuando se acceda a este controlador tal cual. Dentro de index estamos invocando una vista. Este controlador lo tenemos que guardar en un archivo llamado articulos.php que meteremos en el directorio de los controladores: system/application/controllers.

2.- Creamos la vista "home"


Ahora vamos a crear la vista "home", que llamamos desde el anterior controlador, con un cdigo como este: <html> <head> <title>Portada de mi sitio</title> </head> <body> <h1>Bienvenido a mi web</h1> <p>Esta es la portada de pgina web, basada en la publicacin de artculos interesantes.</p> </body> </html> Guardamos esta vista como "home.php" en el directorio de las vistas: system/application/views.

3.- Configuramos este controlador como controlador por defecto


Ahora podramos acceder a este controlador por medio de una URL como esta: http://localhost/index.php/articulos Deberamos ver el contenido de nuestra vista, con la bienvenida al sitio. No obstante, yo quiero que este controlador sea el controlador por defecto, para que cuando accedamos a la raz de la aplicacin se muestre ese contenido de bienvenida. Para ello, voy a editar el archivo de configuracin routes.php (application/config/routes.php). Busco la variable de configuracin "default_controller" para colocar el nombre de este controlador: $route['default_controller'] = "Articulos"; Ahora podremos acceder a la URL raz de CodeIgniter y ver el mismo mensaje de bienvenida, en una url como esta:

http://localhost/ En el siguiente artculo continuaremos con la creacin de esta aplicacin web de prueba en CodeIgniter. Veremos cmo crear nuestra base de datos y hacer la primera pgina que muestre los datos de la tabla de artculos.

14.- Repaso 2: Creamos la base de datos y conectamos desde una pgina


Continuamos con la creacin de la primera aplicacin web de prueba en CodeIgniter. Ahora haremos los pasos necesarios para crear y conectar la base de datos. En el artculo anterior del Manual de CodeIgniter comenzamos un repaso de todo lo que hemos aprendido hasta el momento. As pues, si no lo hemos hecho, conviene leer las explicaciones de la primera parte de esta aplicacin de prueba en CodeIgniter. Anteriormente vimos cmo crear nuestro primero controlador y nuestra primera vista. Ahora comenzaremos a trabajar con los mdulos y las bases de datos.

4.- Creo una tabla "articulos" en la base de datos


Como en mi aplicacin voy a tener artculos, voy a crear una tabla donde almacenarlos. Utilizar una base de datos MySQL que tengo en local. Crearla con el mtodo que prefiris, pero yo utilizo PhpMyAdmin que tengo instalado por defecto con mi paquete Wamp. Tendr que crear una base de datos que voy a llamar, por ejemplo, "aplicacionarticulos" y luego una tabla llamada "articulo", que tendr los siguientes campos:

id (int, auto incremental y clave primaria) titulo (varchar 100) descripcion (varchar 200) cuerpo (text)

Por si sirve de algo, coloco aqu el cdigo SQL del create table. CREATE TABLE `articulo` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `titulo` VARCHAR( 100 ) NOT NULL , `descripcion` VARCHAR( 200 ) NOT NULL , `cuerpo` TEXT NOT NULL ) Antes de salir de PhpMyAdmin, o cualquier otro gestor de base de datos, vamos a insertar manualmente unos cuantos registros en la tabla de "articulo" con datos de prueba.

5.- Configuro CodeIgniter para la conexin con esta base de datos


Ahora voy a decirle a CodeIgniter que realice una conexin automtica con la base de datos que acabo de crear, que se active en todas las pginas de dentro de mi sitio web. Para ello comienzo editando el archivo de configuracin database.php

(system/application/config/database.php) donde deben figurarlos datos de la base de datos que deseo utilizar. Tenemos que editar al menos los siguientes datos: $db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "aplicacionarticulos"; Ahora debo decirle a CodeIgniter que conecte automticamente, incluyendo siempre las libreras de conexin con base de datos. Para esto tenemos que editar el archivo de configuracin autoload.php (system/application/config/autoload.php), en el lugar donde se indica qu libreras queremos cargar siempre. $autoload['libraries'] = array('database');

6.- Creo un primer modelo de artculos


Ahora voy a crear una primera aproximacin al modelo de artculos. Por el momento slo voy a colocar una funcin para traer los ltimos 5 artculos. Nota: El cdigo que veremos a continuacin es PHP 5. PHP 4 tendra alguna diferencia por los nombres de los constructores, como ya se explic. <?php class Articulo_model extends Model { function __construct(){ parent::Model(); } function dame_ultimos_articulos(){ $ssql = "select * from articulo order by id desc limit 5"; return mysql_query($ssql); } } ?> Nota: En este modelo estamos utilizando las propias funciones de acceso a base de datos de MySQL. Simplemente comentar que en CodeIgniter existe un mecanismo de abstraccin de base de datos que se podra utilizar para escribir cdigo con funciones que sirvan para cualquier tipo de base de datos que podamos utilizar, y no slo MySQL. Este modelo lo guardamos en el archivo "articulo_model.php" dentro de la carpeta de los modelos (system/application/models).

7.- Actualizo el controlador

Ahora vamos a cambiar un poco el cdigo de nuestro controlador inicial, para colocar algunas otras cosas que nos servirn para dos cosas:

Decirle que voy a trabajar con el modelo de artculos Enviarle a la vista de la portada ("home") los datos de los ltimos artculos publicados Adems, de paso voy a cargar un helper de URL, que tiene una funcin que me servir de utilidad dentro de la vista para construir las URL para ver los artculos.

<?php class Articulos extends Controller { function index(){ //cargo el helper de url, con funciones para trabajo con URL del sitio $this->load->helper('url'); //cargo el modelo de artculos $this->load->model('Articulo_model'); //pido los ultimos artculos al modelo $ultimosArticulos = $this->Articulo_model->dame_ultimos_articulos(); //creo el array con datos de configuracin para la vista $datos_vista = array('rs_articulos' => $ultimosArticulos); //cargo la vista pasando los datos de configuacion $this->load->view('home', $datos_vista); } } ?> Nota: El cdigo est comentado y si se encuentran dudas recomendamos releer este Manual de CodeIgniter. No obstante, en el cdigo anterior hay una cosa que son los "helpers" que no hemos explicado todava. Son simplemente libreras de cdigo con funciones que resultarn tiles a la hora de hacer aplicaciones web con CodeIgniter, que estn clasificadas por temtica. Nosotros estamos cargando el helper "url", que contiene unas serie de funciones para trabajar con URLs. En concreto utilizaremos la funcin site_url() del helper "url", un poco ms adelante.

8.- Actualizo la vista "home"


Ahora vamos a cambiar el cdigo de nuestra vista de portada, puesto que queremos que nos muestre tambin los ltimos artculos publicados en el sitio, cada uno con un enlace a la URL donde se muestre cada artculo. <html> <head> <title>Portada de mi sitio</title> </head> <body> <h1>Bienvenido a mi web</h1> <p>Estos son los ltimos artculos publicados.</p> <?php

while ($fila = mysql_fetch_array($rs_articulos)){ echo '<p>'; echo '<a href="' . site_url('/articulos/muestra/' . $fila['id']) . '">' . $fila['titulo'] . '</a>'; echo '</p>'; } ?> </body> </html> Podemos ver cmo hacemos un recorrido a los registros de ltimos artculos trados desde la base de datos con ayuda del modelo y enviados a la vista por medio del controlador. Adems, vemos que se est utilizando la funcin site_url() que pertenece al helper "url" que habamos cargado en el controlador. Nota: Aqu tambin estamos utilizando directamente funciones de MySQL. Sin embargo, CodeIgniter tiene algunas libreras que nos ayudaran a hacer esto de otra manera. No obstante, por ahora queremos limitarlos a lo que conocemos del framework. Una vez actualizada la vista, podemos acceder a la pgina raz de nuestra aplicacin, que debera mostrar los ltimos artculos que haban cargados en la base de datos, en la tabla articulo, con un enlace a varias pginas, donde se muestra cada uno de los artculos (no creadas todava). Por supuesto, tenis que haber insertado algn artculo en la tabla para que lo muestre. Tenemos la primera parte de nuestra aplicacin con acceso a base de datos, creada en pocos minutos con CodeIgniter. Pero todava tenemos que complicarlo un poco ms. En el prximo artculo haremos un poco ms grande esta aplicacin web.

15.- Repaso 3: Creamos pginas para mostrar artculos


Ampliamos las posibilidades de esta primera aplicacin web de prueba. Hacemos las modificaciones en el modelo, vistas y controlador para mostrar las pginas de artculos. Cabe sealar antes que nada que este artculo es la continuacin de una serie de entregas del Manual de CodeIgniter, en el que estamos haciendo un repaso de lo que llevamos aprendido para hacer una aplicacin web. Si te interesa y no has ledo los repasos anteriores, debes comenzar por el artculo En las prximas modificaciones o mejoras en el cdigo de nuestra aplicacin de artculos pretendo hacer la parte en la que se muestran los artculos completos, es decir, las pginas que mostrarn cada uno de los artculos que tenemos en nuestra base de datos, con su texto completo. En principio, los enlaces para acceder a estas pginas estn en la portada de nuestra aplicacin y los hemos hecho en la vista "home", creada anteriormente. Podemos observar que los enlaces de la portada, que nos mostraban los ltimos 5 artculos publicados, van a URLs como estas:

http://localhost/index.php/articulos/muestra/1 http://localhost/index.php/articulos/muestra/4 Como se puede ver, tenemos una URL que pasa por el directorio artculos (el controlador de artculos), el directorio muestra (que es la funcin que tenemos que realizar en el controlador para atender esta URL) y el nmero del identificador del artculo que deseamos ver (que es el parmetro que se enviar a la funcin muestra() del controlador). As pues, tenemos que hacer varias cosas para que esas URL funcionen y muestren el contenido de los artculos.

9.- Ampliacin del modelo


Ahora vamos a hacer el modelo para que tenga una funcin que devuelva los datos de un artculo cuyo identificador pasaremos por parmetro. La nueva funcin devolver un array con los datos del artculo encontrado, o false en caso que no encuentre el artculo. <?php class Articulo_model extends Model { function __construct(){ parent::Model(); } function dame_ultimos_articulos(){ $ssql = "select * from articulo order by id desc limit 5"; return mysql_query($ssql); } function dame_articulo($id){ $ssql = "select * from articulo where id=" . $id; $rs = mysql_query($ssql); if (mysql_numrows($rs)==0){ return false; }else{ return mysql_fetch_array($rs); } } } ?> Como se puede ver, es exactamente el modelo anterior, en el que hemos creado la funcin dame_articulo().

10.- Ampliacin del controlador


En este momento queremos que el controlador de artculos tambin muestre las pginas con los artculos, que tendrn URL como estas:

http://localhost/index.php/articulos/muestra/3 As pues, tenemos que crear la funcin muestra() en el controlador, que recibe un parmetro que es el id del artculo que se desea ver. Esta funcin tendr que solicitar al controlador los datos del artculo en cuestin y enviarlos a una vista para que lo muestre. Adems, en caso que se intente acceder a artculos que no existen en la base de datos, tenemos que mostrar un error 404 de pgina no encontrada. Pongo el cdigo del controlador, tal como quedara despus de incorporar esta nueva funcin. <?php class Articulos extends Controller { function index(){ //cargo el helper de url, con funciones para trabajo con URL del sitio $this->load->helper('url'); //cargo el modelo de artculos $this->load->model('Articulo_model'); //pido los ultimos artculos al modelo $ultimosArticulos = $this->Articulo_model->dame_ultimos_articulos(); //creo el array con datos de configuracin para la vista $datos_vista = array('rs_articulos' => $ultimosArticulos); //cargo la vista pasando los datos de configuacion $this->load->view('home', $datos_vista); } function muestra($id){ //cargo el helper de url, con funciones para trabajo con URL del sitio $this->load->helper('url'); //cargo el modelo de artculos $this->load->model('Articulo_model'); //pido al modelo el artculo que se desea ver $arrayArticulo = $this->Articulo_model->dame_articulo($id); //compruebo si he recibido un artculo if (!$arrayArticulo){ //no he recibido ningn artculo //voy a lanzar un error 404 de pgina no encontrada show_404(); }else{ //he encontrado el artculo //muestro la vista de la pgina de mostrar un artculo pasando los datos del array del artculo $this->load->view('muestra_articulo', $arrayArticulo); }

} } ?> Nos tenemos que fijar en la nueva funcin creada: muestra(). En esta funcin cargamos el helper de URL (aun no hemos hablado de los helpers, pero lo veremos pronto). Luego cargamos el modelo de artculos y solicitamos el artculo al modelo. Luego comprobamos si existe el artculo. Si no existe, lanzamos un error 404, con la funcin show_404() (tampoco hemos visto aun la gestin de errores). Si existe, llamamos a la vista que debe mostrar el contenido completo del artculo, enviando el array con los datos del artculo encontrado. Nos fijamos que la vista que solicitamos "muestra_articulo" no ha sido creada todava.

11.- Creo la vista que muestra el artculo


Para acabar esta etapa de la construccin de nuestra web, vamos a crear la vista "muestra_articulo", que tiene que mostrar el contenido del artculo al usuario. Tiene un cdigo muy sencillo. <html> <head> <title><?=$titulo?></title> </head> <body> <h1><?=$titulo?></h1> <blockquote><b><?=$titulo?></b></blockquote> <?=nl2br($cuerpo)?> <p><a href="<?=site_url()?>">Volver</a></p> </body> </html> Como se puede ver, se muestran todos los datos del artculo, con su ttulo, descripcin y cuerpo completo. Luego tenemos un enlace de volver que nos llevar a la portada del sitio, cuya URL obtenemos con la funcin site_url() que tenemos disponible al haber cargado el helper "url" en el controlador. Ahora podemos comprobar, entrando a la portada del sitio, que los enlaces a los ltimos artculos ya estn funcionando. Si los pulsamos accederemos a las pginas que acabamos de hacer en esta etapa, en la que se nos muestra el contenido de los artculos. Si intentamos acceder a una URL de un artculo que no existe, como: http://localhost/codeigniter/index.php/articulos/muestra/923 Podremos visualizar un error 404 de pgina no encontrada. Hasta aqu tenemos nuestra aplicacin que muestra artculos a sus visitantes, cargados en una base de datos. Es una aplicacin incompleta, puesto que a poco que nos imaginemos, se nos ocurrirn multitud de cosas para mejorarla. Sin embargo, nuestro objetivo era ms bien que los lectores sean capaces de entender el patrn de desarrollo de CodeIgniter, el MVC.

Quizs pensis que, siguiendo vuestras costumbres habituales de desarrollo en PHP, podrais haber hecho esta pequea aplicacin en menos tiempo y quizs con menos cdigo fuente. No obstante, a medio plazo observaremos los beneficios de codificar por medio de los controladores, vistas y mdulos, con los que obtendremos cdigo ms claro, organizado, y con mantenimiento ms sencillo, entre diversas ventajas.

16.- Helpers en CodeIgniter


Qu son los helpers en el framework PHP CodeIgniter, cmo cargarlos, utilizarlos para resolver tareas habituales y configurar su carga automtica. Los helpers son una de las dos bibliotecas de cdigo disponibles en CodeIgniter y la ms sencilla de manejar en un principio, puesto que son funciones que estn a nuestra disposicin sin depender de ningn objeto. Lo veremos con detenimiento en este artculo del Manual de CodeIgniter. En cualquier framework PHP, como nos podremos imaginar, se pone a nuestra disposicin una biblioteca de funciones que resuelven las cosas tpicas que podemos necesitar al realizar una aplicacin web. De hecho, una de las ventajas de usar frameworks es justamento no tener que programar por nosotros mismos todas las funciones que se utilizan reiteradas veces en la mayora de los sitios web profesionales. As pues, los helpers son una de las bibliotecas de funciones que supongo esperbamos que CodeIgniter nos proporcionara. Podemos decir que los helpers son juegos de funciones, ordenados por temtica en diferentes paquetes, que nos ayudan en la realizacin de tareas habituales en las aplicaciones web. Existen helpers para muchas cosas distintas, como para trabajo con arrays, fechas, cookies, emails, URLs, formularios, etc. Nota: En CodeIgniter disponemos de dos tipos de bibliotecas de cdigos, Helper y Class. Los Helpers son funciones propiamente dichas y las Class son clases de programacin orientada a objetos (POO). Su carga y utilizacin son ligeramente distinta, as que las veremos por separado. De momento quedmonos con que los helpers no dependen de programacin orientada a objetos, sino que son funciones (de programacin funcional o prodecimental, ms tradicional que la POO) que podremos utilizar para solucionar temas concretos y cuyo uso es independiente. Los helpers estn almacenados en el directorio system/helpers o en el directorio system/application/helpers. Al intentar cargar un helper (que se tiene que realizar de manera explcita, como veremos ms adelante) CodeIgniter mirar si se encuentra primero en system/application/helpers y si no es as lo buscar en la carpeta system/helpers.

Carga de un helper en CodeIgniter


En CodeIgniter no se carga de manera predeterminada ninguna librera o juego de funciones (salvo algunas libreras muy bsicas), para aumentar el rendimiento del sistema, no haciendo procesar a PHP nada que realmente no necesite. Por ello tenemos que cargar los helpers, as como cualquier otra librera explcitamente, ya sea en todas las pginas a travs de los archivos de configuracin, o en una pgina en concreto a travs de las funciones de carga de helpers.

Una vez un helper ha sido cargado, estar a nuestra disposicin en los controladores y vistas, de manera global. Para cargar un helper podemos invocar este cdigo. $this->load->helper('mihelper'); En el cdigo anterior la cadena "mihelper" corresponde con el nombre del helper que se desea cargar. Este nombre es una palabra como "url", "file", etc. y no el propio archivo del cdigo del helper. Por ejemplo con el cdigo: $this->load->helper('url'); Se est cargando el helper con nombre "url" que realmente est en el archivo "url_helper.php". Pero para cargarlo simplemente tenemos que indicar el nombre del helper y no el nombre del archivo donde est el helper. Puedes cargar un helper en cualquier parte del cdigo de tus controladores o incluso de las vistas (aunque no sea una buena prctica cargar helpers en las vistas), siempre y cuando lo cargues antes de utilizarlo. En un controlador podras cargar el helper en el constructor, con lo que estara disponible en todas las funciones del mismo, o bien en una de las funciones donde lo necesites. Puedes cargar mltiples helpers a travs de una nica llamada a load(). $this->load->helper( array('cookie', 'file', 'form') );

Carga automtica de helpers


En CodeIgniter tenemos a disposicin los archivos de configuracin para definir cosas como la carga automtica de helpers, que estarn disponibles de manera predeterminada en toda la aplicacin sin que los tengamos que cargar cada vez que los pretendamos utilizar. La carga automtica nos ahorrar repetir el cdigo de carga de los helpers que deseemos en toda la aplicacin y como podremos imaginar, es una buena idea cuando pensamos usar un helper en varios sitios distintos. El archivo de configuracin que tenemos que editar para definir los helpers que deseamos cargar de manera predeterminada es el siguiente: system/application/config/autoload.php Para indicar qu helpers queremos cargar tenemos que editar el array $autoload, en su ndice "helpers", con un cdigo parecido al siguiente: $autoload['helper'] = array('url', 'file', 'cookie');

Extender helpers en CodeIgniter


Los helpers se pueden extender con nuevas funcionalidades personalizadas por nosotros mismos. Para ello tienes que crear un archivo con el helper modificado con tus propias

funciones y colocarlo en el directorio system/application/helpers y nombrarlo como el helper original pero con el prefijo "MY_". En ese archivo modificado del helper podrs aadir las funciones que te hagan falta o incluso modificar el cdigo de las funciones ya existentes en los propios helpers.

La lista completa de helpers de CodeIgniter


Podemos saber los helpers que se encuentran a nuestra disposicin en la gua del usuario de CodeIgniter, que est en la propia pgina del framework. Aunque esa gua de usuario est en Ingls, no resulta difcil de seguir y podrs encontrar cada helper y sus funciones relatadas con bastante detalle. En el futuro mostraremos algunos ejemplos de uso de al menos los helpers ms fundamentales.

17.- Ejemplo de Helper en CodeIgniter


Veamos el URL Helper de CodeIgniter, que nos vendr bien como ejemplo de uso de un helper en este framework PHP. El Helper de URL es una de las libreras de funciones ms fundamentales de CodeIgniter, que quizs utilicen todas las aplicaciones web que puedas construir con el framework, por muy sencillas que sean. El URL Helper contiene una serie de funciones que nos servirn a trabajar con URLs en las aplicaciones web, para realizar acciones tan bsicas como generar URLs completas de pginas de la aplicacin web a partir de una ruta sencilla, la obtencin de la URL base se nuestra aplicacin, la URL actual, etc. Este artculo pretende servir de gua de uso de Helpers en general, aunque habra que comentar que, en el Manual de CodeIgniter, ya hemos publicado alguna informacin previa sobre los helpers, que deberas conocer. Nota: Para que quede claro hasta que punto es bsico este Helper de URL cabe decir que, hasta donde hemos explicado en este Manual de CodeIgniter, ya lo hemos utilizado en el primer ejemplo de aplicacin sencilla. Ese ejemplo est dividido en tres artculos y en el segundo, titulado Creamos la base de datos y conectamos desde una pgina se puede encontrar el uso del helper URL.

Controlador para probar el helper


Vamos a crear en este artculo un controlador que hace uso del helper URL, con un par de usos del mismo para construir enlaces y ver la URL principal de la aplicacin web. Haremos un controlador bastante simple, para centrarnos ms bien en el uso del helper. Como cualquier controlador, debe extender la clase Controller. class Probando_helper_url extends Controller { //cdigo del controlador }

Cargar el helper desde el constructor del controlador


Como hemos dicho cuando se hablaba de los helpers en el artculo anterior, tenemos que cargar explcitamente el Helper de URL para poder utilizarlo. Esto lo podemos hacer desde el archivo de configuracin autoload.php, con lo que tendremos el helper cargado en cualquier lugar de la aplicacin, o bien desde el controlador donde lo necesitemos. En este caso vamos a ver un controlador que carga el helper. En el caso de cargar el helper desde el controlador, lo podemos hacer desde el constructor, para que est accesible desde cualquier funcin, o desde una de las funciones del controlador. Veremos cmo cargarlo desde el constructor. function __construct(){ parent::Controller(); //cargo el helper de url $this->load->helper('url'); } Nota: Como se puede ver, el mtodo de realizacin del constructor es de PHP 5. Recordar que en PHP 4 el constructor es una funcin con el mismo nombre que la clase y en PHP 5 el constructor es una funcin con el nombre __construct(). Dentro de los constructores de controladores se debe llamar primeramente al constructor de la clase padre (de la que heredamos), con parent::Controller(). Luego hacemos la carga del helper URL con la llamada al mtodo helper() de la clase load que forma parte del controlador, indicando entre parntesis el helper que deseamos cargar: 'url'.

Uso el helper en las funciones de los controladores


Ahora que ya he cargado el helper en el constructor, en todo el cdigo del controlador tendr disponibles, como globales, todas las funciones del helper URL. (Tambin en las vistas que se carguen desde el controlador, aunque nosotros no vamos a hacer en este ejemplo ninguna vista) Veamos entonces un ejemplo de funcin del controlador. function index(){ //escribo desde el controlador, aunque debera hacerlo desde la vista echo "<h1>Probando helper URL</h1>"; //genero el enlace de este controlador, para la funcin creada muestra_base_url() $enlace = site_url("probando_helper_url/muestra_base_url"); //escribo un enlace con esa funcin del controlador echo '<a href="' . $enlace . '">Muestra la URL base</a>'; }

Este es el mtodo index() que es el que se invoca por defecto en el controlador si no se especifica ningn otro en la solicitud de URL. Podemos ver el uso de las funciones del helper de URL en la lnea: $enlace = site_url("probando_helper_url/muestra_base_url"); Con esta lnea invocamos la funcin site_url() del helper URL, que sirve para obtener una URL del sitio a partir de una ruta parcial. Esta funcin es til porque sirve para saber cmo es la URL completa con la que hay que enlazar distintas pginas del sitio, que podra variar dependiendo del lugar donde se haya instalado CodeIgniter, slo a partir de un segmento que no puede cambiar. Dicho de otra manera, al enlazar con otras pginas del sitio conviene componer las URL siempre con la funcin site_url(), para que esos enlaces sigan funcionando aunque la aplicacin la cambiemos a otro directorio, otro dominio, etc. Nota: Un detalle que queremos sealar tambin sobre la funcin anterior, index(), es que hacemos uso de la sentencia echo de PHP para escribir cosas en la pgina directamente con el controlador. Esto no es recomendable, aunque se pueda hacer en CodeIgniter, pues la salida hacia la pgina desde nuestros scripts debera estar siempre en las vistas. Ahora podemos ver un segundo mtodo del controlador con otro uso de las funciones del helper URL. function muestra_base_url(){ //escribo desde el controlador, aunque debera hacerlo desde la vista echo base_url(); //un enlace para volver echo '<p><a href="' . site_url('probando_helper_url') . '">Volver</a></p>'; } Esa funcin escribe por pantalla lo que devuelve la funcin base_url(), que pertenece al helper de URL y sirve para informar de la ruta raz de la aplicacin CodeIgniter, que tambin depender del dominio donde estemos trabajando y el directorio donde se haya instalado el framework. Luego tambin escribe un enlace para volver a la pgina anterior y para crear la ruta del enlace tambin utilizamos el helper de URL con la funcin site_url() relatada anteriormente, indicando en este caso tan solo el nombre del controlador al que queremos dirigir el enlace.

Cdigo completo del controlador


Ahora veamos el cdigo del controlador completo que hace uso del helper URL: class Probando_helper_url extends Controller { /////////////////////////////////////////////////////////////////////////// //Constructor function __construct(){ parent::Controller();

//cargo el helper de url $this->load->helper('url'); } /////////////////////////////////////////////////////////////////////////// //mtodo index, funcin por defecto del controlador function index(){ //escribo desde el controlador, aunque debera hacerlo desde la vista echo "<h1>Probando helper URL</h1>"; //genero el enlace de este controlador, para la funcin creada muestra_base_url() $enlace = site_url("probando_helper_url/muestra_base_url"); //escribo un enlace con esa funcin del controlador echo '<a href="' . $enlace . '">Muestra la URL base</a>'; } /////////////////////////////////////////////////////////////////////////// //funcion muestra_base_url, para mostrar la URL principal de esta aplicacin web function muestra_base_url(){ //escribo desde el controlador, aunque debera hacerlo desde la vista echo base_url(); //un enlace para volver echo '<p><a href="' . site_url('probando_helper_url') . '">Volver</a></p>'; } /////////////////////////////////////////////////////////////////////////// //funcion muestra_url_actual, para mostrar la URL actual de esta pgina function muestra_url_actual(){ //escribo desde el controlador, aunque debera hacerlo desde la vista echo current_url(); //un enlace para volver echo '<p><a href="' . site_url('probando_helper_url') . '">Volver</a></p>'; } } En este cdigo hemos agregado al controlador un mtodo llamado muestra_url_actual(), para probar la funcin del helper URL current_url(), que sirve para obtener la URL actual de la pgina que se est ejecutando. Recordar que todo lo visto en este artculo sirve para entender el uso de los helpers en CodeIgniter, aunque nos hayamos saltado algunas recomendaciones del trabajo con el framework, como escribir contenido en la pgina directamente con el controlador y sin utilizar las vistas. As mismo, es importante sealar que el helper URL tiene otras funciones tambin bastante tiles que seguramente nos vendr bien conocer y que podemos revisar en la documentacin del framework.

18.- Trabajar con plantillas en CodeIgniter

Esquema de trabajo posible para implementar en CodeIgniter y de manera sencilla un layout o plantilla que sea comn en todas las pginas del sitio. Una de las cosas que desearemos hacer a la hora de construir un sitio web es crear un diseo que se aplique a todo el sitio web. Esto se suele hacer creando una plantilla, que contiene el diseo de lo que sera la estructura de pgina para nuestro sitio, con elementos como cabecera, cuerpo, pie de pgina y dems. En CodeIgniter existen clases para crear "templates" (en castellano, plantillas) que podramos utilizar en nuestro sitio. Sin embargo, las propias vistas del mtodo MVC, nos ofrecen la suficiente funcionalidad para hacer eso por nuestra propia cuenta sin tener que aprender a usar los templates de CodeIgniter, que a menudo agregan una complejidad adicional al desarrollo sin aportar ventajas significativas. En este artculo del Manual de CodeIgniter explicaremos una posible forma de trabajo con este framework PHP para implementar una plantilla que sea comn a todas las pginas del sitio, por medio de la anidacin de vistas.

Esquema de trabajo posible para trabajar con plantillas - Anidacin de vistas


Para implementar un sistema de plantilla en CodeIgniter, un esquema de trabajo posible es crear una vista general que contenga todo el layout principal del sitio, con el diseo que hayamos creado con los elementos tpicos de cabecera, cuerpo, lateral, pie, etc. Como sabemos, las vistas en CodeIgniter reciben unos datos para personalizarlas. En este esquema de trabajo crearemos esa vista principal con el layout del sitio, que podr recibir diversos datos, como ttulo de la pgina, contenido de etiquetas META y todo lo que necesitemos para configurarla y presonalizarla para producir las distintas pginas. Adems, esta vista general podr tener algunos datos que son generados a travs de otras vistas. Por ejemplo podremos tener el cuerpo de la pgina, tan complejo como lo requiera cada una de las secciones del sitio, que est formado a partir de otras vistas. Por decirlo de otra manera, estamos sugiriendo un sistema de anidacin de vistas, en el que se meten unas vistas dentro de otras, tal como hemos querido expresar en la siguiente imagen:

En la imagen podremos observar que tenemos "dato 1" y "dato 2", que son datos que posiblemente carguemos con simples cadenas de caracteres. Luego tenemos una vista de cuerpo, que podr ser especfica para cada una de las secciones del sitio y otra vista para el lateral del web, que a su vez podra generarse a travs de otras vistas, que podran ser tambin distintas para diversas secciones del sitio.

Desarrollando un esquema de vistas anidadas para implementar la plantilla general


Si nos ponemos a pensar cmo hacer ese esquema de vistas anidadas, con lo que hemos aprendido hasta ahora en el Manual de CodeIgniter, quizs tengamos algn problema para poder implementar esta plantilla general y anidar vistas, pero vamos a aprender un detalle importante para poder desarrollar este punto. Cuando invocamos una vista, como comportamiento predeterminado, el contenido de la vista se vuelca en la salida general de la aplicacin, es decir, se escribir en la pgina web. $this->load->view('mi_vista', $datos_vista); Esto hace que la vista "mi_vista" se procese con los $datos_vista y se escriba en la pgina web que se est generando. Ahora bien, para poder escribir la vista principal (con el layout del sitio), tenemos que enviarle los datos del cuerpo y el lateral. Pero para producir el cuerpo y el lateral debemos a su vez procesar las correspondientes vistas. Teniendo en cuenta el comportamiento por defecto del mtodo load() para cargar una vista y sabiendo que la vista de cuerpo y la vista del lateral se tienen que ejecutar antes que la vista general, podremos imaginar que el cuerpo y el lateral se escribiran en la pgina antes que la vista general. Por ello tenemos que cambiar el comportamiento por defecto de la invocacin de vistas.

Al cargar una vista en CodeIgniter tenemos a nuestra disposicin un tercer parmetro en el mtodo load(), que es un boleano que sirve para marcar qu deseamos hacer con la vista procesada. Un valor "false" indica que la vista se mande directamente para la salida (se escriba en la pgina). Un valor "true" indica que deseamos que la vista se devuelva en una variable. De manera predeterminada, ese parmetro tiene valor "false". $vista_procesada = $this->load->view('mi_vista', $datos_vista, true); En esta otra lnea de cdigo conseguimos que el contenido de la vista "mi_vista", una vez procesada con los datos $datos_vista, no se escriba en pantalla, sino que se devuelva en una cadena que almacenamos en la variable $vista_procesada.

Cdigo para anidar vistas en CodeIgniter


Ahora que sabemos para qu nos sirve anidar vistas y conocemos en detalle cmo invocarlas para que se muestren o no directamente en la pgina, veamos cul sera el esquema de trabajo para generar vistas anidadas. El siguiente cdigo parcial mostrara como invocar las diferentes vistas desde un controlador para poder anidarlas. $datos_plantilla["dato1"] = "Un dato simple"; $datos_plantilla["dato2"] = "Otro dato simple tipo cadena"; $datos_plantilla["dato3"] = $this->load->view('vista_cuerpo', $datos_para_vista_cuerpo, true); $datos_plantilla["dato4"] = $this->load->view('vista_lateral', $datos_para_vista_lateral, true); $this->load->view('plantilla_principal', $datos_plantilla); Como se puede ver, en las primeras 4 lneas creamos los datos para la plantilla principal (con el layout del sitio). Dos datos son simples y los cargamos directamente con el contenido de un par de strings. Otros dos datos son ms complejos y para generarlos utilizamos otras vistas, como la vista del cuerpo y del lateral, pero indicando true como tercer parmetro al invocar a estas vistas, para que no se escriban en pantalla, sino que se devuelva su valor. Por ltimo llamamos a la plantilla_principal enviando todos los datos generados y necesarios para mostrar esa vista. Esperamos que este esquema de trabajo posible se haya podido entender y para practicarlo, en el siguiente artculo vamos a mostrar cmo implementar ese sistema de layout general en la aplicacin de artculos que estamos realizando para repasar las cosas que estamos aprendiendo en CodeIgniter.

19.- Repaso 4: Mejorar el sitio por medio de una vista utilizada como plantilla
Aplicamos una vista para hacer la plantilla general del sitio de artculos, para que todas las pginas se muestren con un layout propio para toda la web. Nos hemos detenido para hacer una pausa que sirva de repaso para lo que llevamos aprendido en el Manual de CodeIgniter. En pasados artculos hicimos una aplicacin bsica para

asimilar conceptos nuevos como los controladores, vistas o modelos, que esperamos haya podido entenderse perfectamente. Llevamos tres entregas del mencionado repaso, que comenz en el artculo Tutorial para hacer una aplicacin de prueba en CodeIgniter y aunque podramos decir que hemos creado una aplicacin suficiente para revisar esos conceptos nuevos, lgicamente, aun tenemos muchas otras cosas que aprender. En este sentido y motivados por uno de los comentarios de usuarios enviados en los artculos, vamos a mostrar la manera de crear un sistema sencillo para implementar lo que llamaramos una plantilla o layout para el sitio. La idea es crear una vista que sirva para definir una estructura de pgina que sea comn para todo el sitio y claro, que se pueda personalizar para mostrar datos distintos en cada pgina. La estructura del sitio har de plantilla y marcar el diseo de la pgina. Es de suponer que nuestro propsito no ser nuevo para las personas que puedan leer este manual, puesto que el trabajo con plantillas es algo que casi todos los desarrolladores hemos realizado en algn momento. En este artculo lo que haremos ser poner en marcha una posibilidad de esquema de trabajo cuando queremos crear plantillas, que hemos visto en el artculo anterior, en una aplicacin web desarrollada con CodeIgniter.

Adaptar nuestra aplicacin de artculos para tener una plantilla


Ahora, si hemos seguido las explicaciones de los anteriores repasos de CodeIgniter, podremos ver cules son los cambios a realizar para adaptar el sitio a la estructura de vistas propuesta. Para realizar esos cambios hemos decidido crear nuevos controladores y vistas, para no machacar el trabajo realizado en los anteriores artculos. Veamos pues, archivo a archivo, cules son los cambios que tenemos que realizar en el cdigo.

Nuevo controlador Articulos_plantilla


Comenzamos reformulando el antiguo controlador que habamos llamado "Articulos". Ahora lo llamamos "Articulos_plantilla" y es todo igual, con la particularidad que vamos a tener que realizar invocaciones a ms de una vista. Por un lado tendremos la funcin index() (cuando se accede al controlador si especificar qu artculo mostrar, que presentaba un listado de artculos) y por otro lado la funcin muestra() (que recibe el identificador del artculo a mostrar). En la funcin index() ahora tendremos invocacin a dos vistas. Por un lado est la vista "listado_articulos", que sirve para generar el cuerpo de la pgina. Esta vista no se imprime directamente en pantalla al procesarse cuando se carga, sino que se devuelve y se guarda como dato para enviar a la vista principal. Por otro lado tendremos la vista "plantilla_articulo", que contiene el layout general del sitio, a la que enviamos diversos datos incluido el cuerpo de la pgina generado con la vista anterior. En la funcin muestra() tendremos tambin dos vistas. Por un lado una vista llamada "cuerpo_articulo", que tampoco se imprime, sino que simplemente guardamos su salida en una variable. Por otro lado tenemos la vista "plantilla_articulo", que contiene el layout del sitio, igual que en la funcin index().

class Articulos_plantilla extends Controller { function index(){ //cargo el helper de url, con funciones para trabajo con URL del sitio $this->load->helper('url'); //cargo el modelo de artculos $this->load->model('Articulo_model'); //pido los ultimos artculos al modelo $ultimosArticulos = $this->Articulo_model->dame_ultimos_articulos(); //creo el array con datos de configuracin para la vista $datos_vista = array('rs_articulos' => $ultimosArticulos); //cargo la vista pasando los datos de configuacion $datos_plantilla["cuerpo"] = $this->load->view('listado_articulos', $datos_vista, true); $datos_plantilla["titulo"] = "Portada de la aplicacin de artculos"; $this->load->view('plantilla_articulo', $datos_plantilla); } function muestra($id){ //cargo el helper de url, con funciones para trabajo con URL del sitio $this->load->helper('url'); //cargo el modelo de artculos $this->load->model('Articulo_model'); //pido al modelo el artculo que se desea ver $arrayArticulo = $this->Articulo_model->dame_articulo($id); //compruebo si he recibido un artculo if (!$arrayArticulo){ //no he recibido ningn artculo //voy a lanzar un error 404 de pgina no encontrada show_404(); }else{ //he encontrado el artculo //muestro la vista de la pgina de mostrar un artculo pasando los datos del array del artculo $datos_plantilla["cuerpo"] = $this->load->view('cuerpo_articulo', $arrayArticulo, true); $datos_plantilla["titulo"] = $arrayArticulo["titulo"]; $this->load->view('plantilla_articulo', $datos_plantilla); } } } ?>

Nota: En el cdigo anterior del controlador hay que fijarse que cuando se invoca a la vista 'listado_articulos' desde el mtodo index(), en el mtodo load() enviamos como tercer parmetro un valor true. Esto es para que esa vista no se muestre en la pgina una vez procesada, sino que se devuelva por el mtodo load() y se asigne as a una variable. Esto mismo se hace tambin en la llamada para cargar la vista 'cuerpo_articulo' desde el mtodo muestra(). Ahora podramos ver el cdigo de las distintas que utilizamos en este controlador.

Vista para crear el layout: plantilla_articulo


Esta es la vista principal del sitio, que contiene el layout o plantilla del sitio web. Como vemos, tenemos todas las etiquetas para la pgina bsica (HTML, HEAD, TITLE, BODY, etc.) y algunas capas para crear elementos comunes a todas las pginas, como la cabecera o el pie. <html> <head> <title><?=$titulo?></title> </head> <body> <div style="background-color: #ffffcc; padding: 10px 20px; font-size:200%;"> Cabecera aplicacin de artculos </div> <div style="padding: 15px;"> <?=$cuerpo?> </div> <div style="background-color: #ccc; padding: 10px 20px; font-size:80%;"> Pi de pgina | enlace | enlace de pie 2 </div> </body> </html>

Vista listado_articulos
Esta plantilla sirve para mostrar el listado de los artculos que tenemos en la base de datos. La plantilla simplemente la utilizamos para generar el cuerpo de la portada de la aplicacin de artculos. Slo contiene cdigo que se colocar en el layout general, en la parte destinada al cuerpo de pgina. Por ello podemos ver que hemos eliminado todas las etiquetas HTML que sirven para generar el layout general de sitio, puesto que estarn en la plantilla principal, que hemos visto antes. <h1>Listado de artculos</h1> <p>Estos son los ltimos artculos publicados.</p> <?php while ($fila = mysql_fetch_array($rs_articulos)){ echo '<p>'; echo '<a href="' . site_url('/articulos_plantilla/muestra/' . $fila['id']) . '">' . $fila['titulo'] . '</a>';

echo '</p>'; } ?>

Vista cuerpo_articulo
Esta vista la invocamos desde la funcin muestra() y es para mostrar el cuerpo de un artculo cualquiera del sitio. Este cuerpo de artculo luego se enviar por el controlador para la vista principal, para que el artculo se muestre dentro del layout de pgina del sitio. <h1><?=$titulo?></h1> <blockquote><b><?=$titulo?></b></blockquote> <?=nl2br($cuerpo)?> <p><a href="<?=site_url("/articulos_plantilla/")?>">Volver</a></p>

Conclusin al repaso 4 de la aplicacin de artculos en CodeIgniter


Con las modificaciones que hemos visto tenemos ya creada nuestra aplicacin de artculos pero con un layout especfico, que se repetir en todas las pginas del sitio. En total hemos tenido que crear un nuevo controlador, adaptando el anterior, y tres vistas nuevas, basadas tambin en las que tenamos antes. Podramos poner en marcha este nuevo ejemplo accediendo al controlador creado en esta ocasin. Como el controlador es nuevo, tenemos que acceder con una URL que indique su nombre. Algo como esto: http://localhost/index.php/articulos_plantilla

20.- Libreras de CodeIgniter


Qu son las libreras de CodeIgniter, cmo cargarlas en los controladores o configurar el framework PHP para que las cargue automticamente. CodeIgniter, el ms accesible de los frameworks PHP populares, tiene bibliotecas de cdigo para realizar diversas cosas interesantes y tiles. Por un lado tenemos los Helpers, que implementan juegos de funciones y que ya relatamos en artculos anteriores del Manual de CodeIgniter. Por otro lado tenemos las libreras, que vamos a tratar en este artculo. Las libreras en CodeIgniter son clases de programacin orientada a objetos (POO) preparadas para realizar tareas tpicas en el desarrollo de pginas web. Implementan clases, de POO, para resolver problemas muchas veces similares a los que resuelven los Helpers, pero son un poco ms especializadas en temas particulares. Algunos ejemplos de libreras que se dispone en CodeIgniter son para trabajar con bases de datos, FTP, upload de archivos, sesiones, calendario, etc. As pues, podemos decir que las liberas (libraries en ingls) son uno de los componentes que ms tiempo nos ahorrarn a la hora de desarrollar una web, pues contienen cdigo que

resultar siempre til. El trabajo con las libreras es bastante simple, como veremos a continuacin.

Carga de libreras
Para cargar una library en CodeIgniter tenemos que indicarlo explcitamente, pues en este framework no se carga nada por defecto, salvo contadas excepciones, para optimizar el tiempo de respuesta de PHP al procesar las pginas. Para ello tenemos que invocar el siguiente cdigo: $this->load->library('nombre de la clase'); Donde 'nombre de la clase' es el nombre de la librera, o clase de POO, que queremos cargar. Nota: Realmente todas las libreras no se necesitan cargar, puesto que hay algunas que ya se encuentra por defecto disposicin de nuestros scripts, sin tener que cargarlas explcitamente. Esto es porque algunas libreras son fundamentales para el funcionamiento del ncleo de CodeIgniter. Por ejemplo, siempre tendremos disponibles las libreras que implementan las clases de Output, Input o URI. Por ejemplo, si quisiramos cargar la librera de Email, que facilita el envo de correos por medio de PHP, tendramos que utilizar el siguiente cdigo: $this->load->library('email'); Ya que son clases de POO, una vez cargada tenemos que utilizar sus mtodos para poner en marcha sus funcionalidades. Dentro de los controladores, para acceder a la clase y sus mtodos utilizamos el nombre de la clase como una propiedad de $this. Por ejemplo, en el caso de la librera email, para definir quin enva un correo electrnico utilizamos un cdigo como este: $this->email->from('tu@dominio.com', 'Nombre del remitente'); En la gua de usuario de CodeIgniter existe una referencia completa sobre cada una de las clases y su utilizacin. Nosotros iremos viendo ejemplos de uso en futuros artculos.

Carga automtica de libraras en CodeIgniter


Como ya sabemos, antes de utilizar una clase de una de las libreras de CodeIgniter, tenemos que cargarla en el controlador. No obstante, tambin tenemos la opcin de indicar en nuestros archivos de configuracin la carga predeterminada de algunas libreras, para que estn disponibles en todas las pginas sin necesidad de cargarlas en los controladores. Para indicar las libreras que queremos cargar automticamente tenemos que editar el archivo autoload.php, que est en la ruta: system/application/config/autoload.php

En ese archivo encontraremos un array llamado libraries, donde podemos indicar todos los nombres de las libreras a cargar, por ejemplo: $autoload['libraries'] = array('database', 'session', 'form_validation'); Para ilustrar cmo se deben utilizar las libreras de CodeIgniter hemos publicado un ejemplo de uso de la librera Calendar.

21.- Ejemplo de librera en CodeIgniter: Calendar Library


Veamos cmo trabajar con una librera de CodeIgniter, en concreto con la librera Calendar, que nos servir como ejemplo de uso de libraries. En el anterior artculo del Manual de CodeIgniter vimos los pasos y especificaciones para crear nuestras propias libreras, con lo que ser bueno detenerse a ver un ejemplo de una librera creada por nosotros mismos. Vamos a hacer una librera con algunas funciones para convertir formatos de fechas. La funcionalidad en si no importa mucho, lo que nos interesa es ver cmo se hace. En el artculo continuaremos con el procedimiento para cargar la librera desde un controlador de CodeIgniter y utilizarla invocando sus mtodos.

Librera propia en CodeIgniter: Conversor_fechas


Este sera el cdigo de nuestra librera de ejemplo. <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Conversor_fechas{ //////////////////////////////////////////////////// //Convierte fecha de mysql a espaol //////////////////////////////////////////////////// function fecha_mysql_a_espanol($fecha){ ereg( "([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})", $fecha, $mifecha); $lafecha=$mifecha[3]."/".$mifecha[2]."/".$mifecha[1]; return $lafecha; } //////////////////////////////////////////////////// //Convierte fecha de espaol a mysql //////////////////////////////////////////////////// function fecha_espanol_a_mysql($fecha){ ereg( "([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})", $fecha, $mifecha); $lafecha=$mifecha[3]."-".$mifecha[2]."-".$mifecha[1]; return $lafecha; } }

/* Fin del fichero */ /* No necesito cerrar PHP y de hecho no se recomienda para no insertar saltos de lnea al final */ Como se puede ver, se ha creado una clase llamada "Conversor_fechas" (la "C" inicial en maysculas) y un par de funciones que sern las que nos aporte la librera cuando la carguemos. La hemos guardado con el nombre de archivo "Conversor_fechas.php" (Tambin la "C" en maysculas), en la siguiente ruta: system/application/libraries

Controlador que carga la librera propia


Ahora podemos hacer un controlador para probar esta librera. Para ello creamos el archivo del controlador con un cdigo como este: <?php class Convierto_fechas extends Controller { function index(){ //creo una variable con una fecha $fecha = "21/07/2010"; //cargo la librera para convertir fechas $this->load->library('conversor_fechas'); //cambio la fecha de formato $fecha_formato_mysql = $this->conversor_fechas->fecha_espanol_a_mysql($fecha); //muestro la fecha (debera usar una vista) echo $fecha_formato_mysql; //convierto la fecha mysql a espaol $fecha_formato_espanol = $this->conversor_fechas>fecha_mysql_a_espanol($fecha_formato_mysql); //muestro la fecha (debera usar una vista) echo "<br>" . $fecha_formato_espanol; } } ?> Como ya debemos saber, el controlador lo debemos guardar en el directorio system/application/controllers y con el mismo nombre que la clase que hemos creado, con la extensin .php y en minsculas: convierto_fechas.php. Supongo que no ser problema localizar el lugar del cdigo donde se carga la librera: $this->load->library('conversor_fechas');

Y el lugar donde utilizamos los mtodos de la librera para acceder a sus funcionalidades: $fecha_formato_mysql = $this->conversor_fechas->fecha_espanol_a_mysql($fecha); Nota: En este controlador estamos escribiendo directamente en la pgina sin utilizar las vistas. Es slo una prueba y CodeIgniter nos lo permite, pero no es una buena prctica. Deberamos utilizar una vista. La URL con la que acceder a este controlador depender un poco de donde tengas instalado tu CodeIgniter, pero so lo has puesto en la raz de tu dominio podras acceder a travs de una URL como esta: http://www.ejemplo.com/index.php/convierto_fechas/ O si hemos ocultado el index.php a travs de un .htaccess: http://www.ejemplo.com/convierto_fechas/ De momento hemos aprendido a crear una librera 100% desarrollada por nosotros e integrada dentro de nuestro CodeIgniter. En el siguiente artculo mostraremos un detalle importante que debemos implementar en nuestras libreras para acceder a los recursos del framework CodeIgniter desde el cdigo de tus propias libreras.

22.- Crear tus propias libreras en CodeIgniter


Cmo crear tus propias libreras e integrarlas al ncleo de CodeIgniter para poder utilizarlas en tus aplicaciones web PHP. En CodeIgniter, cuando se habla de libreras, generalmente nos estamos refiriendo a las clases que CodeIgniter pone a disposicin de los desarrolladores para construir las aplicaciones web. Estas libreras estn documentadas en el manual de usuario de CodeIgniter y se conocen generalmente con el nombre libraries en ingls. De hecho, ya fueron explicadas de manera general en el Manual de CodeIgniter y concretamente se vieron en el artculo Libreras de CodeIgniter. Podemos decir que las libreras que vienen ya creadas en CodeIgniter contemplan muchos de los casos habituales que podemos necesitar resolver en pginas web, como accesos a base de datos, trabajo con calendarios, con URLs, cookies, etc. Pero esto no quiere decir que para todo problema existe una librera, porque las situaciones y casos de uso pueden ser tan variados como los gustos. Para extender las funcionalidades del framework, CodeIgniter pone a nuestra disposicin un procedimiento sencillo que nos permitir crear nuestras propias libreras, que resuelvan o den soporte a nuestras necesidades especficas. As mismo, puede darse el caso que un programador necesite expandir una librera ya creada en CodeIgniter, para agregar o sustituir funcionalidades, o que quiera reemplazar por completo una librera ya creada en el framework con un cdigo totalmente propio. Afortunadamente, todo se puede conseguir con CodeIgniter. Para que quede claro, con CodeIgniter podemos crear hasta tres tipos de "libreras propias":

Libreras creadas enteramente por el desarrollador. Libreras para extender otras libreras nativas de CodeIgniter Libreras para reemplazar totalmente otra nativa de CodeIgniter

Almacenamiento de nuestras propias libreras


Cuando creamos una librera que queremos utilizar desde CodeIgniter la tenemos que colocar en un directorio determinado: system/application/libraries. CodeIgniter buscar siempre las libreras en ese directorio cuando son solicitadas. Nosotros tenemos que asegurarnos siempre de cumplir las siguientes convenciones en los nombres:

Los nombres de los archivos de las libreras deben tener la primera letra en maysculas. Por ejemplo, Validador.php. Los nombres de las clases deben tener tambin la primera letra en maysculas. En el cdigo de las libreras colocaremos una clase, de Programacin Orientada a Objetos (POO), cuyo nombre tendr la primera letra en maysculas. Por ejemplo class Validador. El nombre del archivo tiene que ser igual al nombre de la clase (de POO) que colocaremos dentro.

Cdigo de una clase para crear una librera personalizada en CodeIgniter


Veamos a continuacin el cdigo bsico para crear una librera en CodeIgniter. Se trata simplemente de la declaracin de una clase (POO) donde colocaremos las funciones de la librera. <?php if ( ! defined('BASEPATH')) exit('No se permite el acceso directo al script'); class Miclase { //funciones que queremos implementar en Miclase. function una_function(){ } } ?>

Invocar y usar la librera


Para utilizar las libreras que creemos, primero tenemos que cargarlas desde los controladores y para ello actuaremos del mismo modo que para cargar las libreras nativas de CodeIgniter. $this->load->library('miclase'); En este caso, es indiferente si colocamos en mayscula la primera letra de la librera o no.si la A partir del momento que la librera est cargada, podremos acceder a ella, para ejecutar sus mtodos, siempre con el nombre en minscula.

$this->miclase->una_function();

Paso de parmetros a una librera


Si lo deseamos, podemos enviar parmetros adicionales en el momento de cargar la librera, que podran servirnos para realizar cualquier tipo de configuracin en la clase. Estos parmetros se indicaran en la llamada para cargar la librera de esta manera: $params = array('p1' => 'valor 1', 'p2' => 'valor 2'); $this->load->library('Miclase', $params); En el constructor de la clase tendramos que recibir los parmetros de la siguiente manera: <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Otraclase { function Otraclase($params){ //Constructor, donde se supone que haremos algo con $params } } ?> Aun nos quedan cosas que aprender sobre la creacin de libreras propias, pero vamos a detenernos por aqu y en el siguiente artculo veremos un ejemplo de construccin y uso de libreras creadas por nosotros en CodeIgniter.

23.- Ejemplo de creacin y uso de una librera en CodeIgniter


Vamos a crear una librera propia en CodeIgniter y luego vamos a cargarla desde un controlador y utilizar sus mtodos. En el anterior artculo del Manual de CodeIgniter vimos los pasos y especificaciones para crear nuestras propias libreras, con lo que ser bueno detenerse a ver un ejemplo de una librera creada por nosotros mismos. Vamos a hacer una librera con algunas funciones para convertir formatos de fechas. La funcionalidad en si no importa mucho, lo que nos interesa es ver cmo se hace. En el artculo continuaremos con el procedimiento para cargar la librera desde un controlador de CodeIgniter y utilizarla invocando sus mtodos.

Librera propia en CodeIgniter: Conversor_fechas


Este sera el cdigo de nuestra librera de ejemplo. <?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Conversor_fechas{ //////////////////////////////////////////////////// //Convierte fecha de mysql a espaol //////////////////////////////////////////////////// function fecha_mysql_a_espanol($fecha){ ereg( "([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})", $fecha, $mifecha); $lafecha=$mifecha[3]."/".$mifecha[2]."/".$mifecha[1]; return $lafecha; } //////////////////////////////////////////////////// //Convierte fecha de espaol a mysql //////////////////////////////////////////////////// function fecha_espanol_a_mysql($fecha){ ereg( "([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})", $fecha, $mifecha); $lafecha=$mifecha[3]."-".$mifecha[2]."-".$mifecha[1]; return $lafecha; } } /* Fin del fichero */ /* No necesito cerrar PHP y de hecho no se recomienda para no insertar saltos de lnea al final */ Como se puede ver, se ha creado una clase llamada "Conversor_fechas" (la "C" inicial en maysculas) y un par de funciones que sern las que nos aporte la librera cuando la carguemos. La hemos guardado con el nombre de archivo "Conversor_fechas.php" (Tambin la "C" en maysculas), en la siguiente ruta: system/application/libraries

Controlador que carga la librera propia


Ahora podemos hacer un controlador para probar esta librera. Para ello creamos el archivo del controlador con un cdigo como este: <?php class Convierto_fechas extends Controller { function index(){ //creo una variable con una fecha $fecha = "21/07/2010"; //cargo la librera para convertir fechas $this->load->library('conversor_fechas'); //cambio la fecha de formato $fecha_formato_mysql = $this->conversor_fechas->fecha_espanol_a_mysql($fecha);

//muestro la fecha (debera usar una vista) echo $fecha_formato_mysql; //convierto la fecha mysql a espaol $fecha_formato_espanol = $this->conversor_fechas>fecha_mysql_a_espanol($fecha_formato_mysql); //muestro la fecha (debera usar una vista) echo "<br>" . $fecha_formato_espanol; } } ?> Como ya debemos saber, el controlador lo debemos guardar en el directorio system/application/controllers y con el mismo nombre que la clase que hemos creado, con la extensin .php y en minsculas: convierto_fechas.php. Supongo que no ser problema localizar el lugar del cdigo donde se carga la librera: $this->load->library('conversor_fechas'); Y el lugar donde utilizamos los mtodos de la librera para acceder a sus funcionalidades: $fecha_formato_mysql = $this->conversor_fechas->fecha_espanol_a_mysql($fecha); Nota: En este controlador estamos escribiendo directamente en la pgina sin utilizar las vistas. Es slo una prueba y CodeIgniter nos lo permite, pero no es una buena prctica. Deberamos utilizar una vista. La URL con la que acceder a este controlador depender un poco de donde tengas instalado tu CodeIgniter, pero so lo has puesto en la raz de tu dominio podras acceder a travs de una URL como esta: http://www.ejemplo.com/index.php/convierto_fechas/ O si hemos ocultado el index.php a travs de un .htaccess: http://www.ejemplo.com/convierto_fechas/ De momento hemos aprendido a crear una librera 100% desarrollada por nosotros e integrada dentro de nuestro CodeIgniter. En el siguiente artculo mostraremos un detalle importante que debemos implementar en nuestras libreras para acceder a los recursos del framework CodeIgniter desde el cdigo de tus propias libreras.

24.- Acceder a recursos de CodeIgniter desde tus propias libreras


Veamos cmo acceder a los recursos del framework PHP CodeIgniter, desde el cdigo de las libreras creadas por tu mismo.

Ahora que ya sabemos un poco sobre cmo crear nuestras propias libreras en CodeIgniter, vamos a comentar cmo se accede, desde su cdigo, a los recursos nativos de CodeIgniter. Cuando nos referimos a los recursos de CodeIgniter puede ser cualquier cosa que dependa del framework, como las vistas, modelos u otras libreras, por poner varios ejemplos. Si ests leyendo el Manual de CodeIgniter que estamos publicando en DesarrolloWeb.com, quizs no entiendas de entrada para qu puedes necesitar esos recursos, pero a medida que te plantees hacer cosas ms o menos interesantes en tus libreras vers que necesitas invocar recursos dependientes de otros componentes de tu aplicacin web. Para aclarar este punto, en la parte final de este artculo mostraremos un ejemplo de librera que utiliza un modelo, para acceso a la base de datos desde la propia librera.

Obtener la instancia de CodeIgniter con get_instance()


La funcin get_instance() sirve para acceder a una instancia del superobjeto CodeIgniter, con la que podremos recuperar o usar todos los recursos nativos de CodeIgniter. Para hacernos una idea, en nuestros controladores accedemos a los recursos de CodeIgniter por medio de la variable $this, con la que hacemos cosas como las siguientes: $this->load->helper('array'); $this->load->library('Milibreria'); $this->config->item('base_url'); Desde los controladores, vistas o modelos podemos acceder a esa variable $this sin problemas, pero si estamos definiendo nuestras libreras, u otras clases que vamos a utilizar en CodeIgniter, la variable $this no servir para acceder a CodeIgniter. En ese caso debemos utilizar este modelo de cdigo para obtener la instancia del framework. Asignamos CodeIgniter dentro de una variable con get_instance(). $CI =& get_instance(); Ahora accedemos a los mtodos del superobjeto CodeIgniter por medio de esa variable. $CI->load->helper('array'); $CI->load->library('Milibreria'); $CI->config->item('base_url'); Nota: Te habrs fijado en el carcter "&" al recuperar la instancia del superobjeto CodeIgniter. Esto se hace para que se pase por referencia el objeto, as podrs usar el objeto CodeIgniter original en vez de utilizar una copia del mismo. Es importante este detalle. Para los usuarios de PHP 4: En entornos donde todava se trabaje con PHP 4 tenemos que tener en cuenta la siguiente recomendacin que podemos encontrar en la gua de uso de CodeIgniter. Por favor, no crees instancias de CodeIgniter con get_instance() desde los constructores de las clases, porque te puede dar problemas. Esto es porque PHP 4 tiene un problema al obtener referencias al objeto CodeIgniter en constructores, pues los objetos no existen antes de que la clase sea totalmente instanciada.

Ejemplo de librera que hace uso de recursos de CodeIgniter


Veamos ahora un ejemplo con el que afianzar nuestros conocimientos. Simplemente vamos a mostrar el cdigo de una librera que tiene una funcin en la que se accede a base de datos. Como en CodeIgniter el acceso a base de datos se centraliza en los modelos, tendremos que acceder a recursos de CodeIgniter desde la librera. Este cdigo lo he sacado de uno de los ejemplos de CodeIgniter que veremos ms adelante en DesarrolloWeb.com. Quizs ahora no tenga mucho sentido, porque no conocemos el modelo que estamos invocando, pero sirve para hacernos una idea. <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Validador{ protected $ci; function __construct(){ $this->ci =& get_instance(); } //comprueba si un email est repetido function hay_email_repetido($str){ $this->ci->load->model('usuario_model'); if ($this->ci->Usuario_model->existe_email($str)) { return TRUE; } else { return FALSE; } } } En el cdigo anterior se ha definido una propiedad en la clase $ci. Luego, en el constructor colocamos la instancia del superobjeto CodeIgniter en esa propiedad. Nota: El modelo de constructor que hemos utilizado en el cdigo anterior es de PHP 5. Adems, recordar que llamar en el constructor a get_instance() da problemas en PHP 4. Por lo que la llamada a get_instance() la deberamos poner en el cdigo de la funcin. En la funcin hay_email_repetido() se accede a la propiedad $ci a travs de $this->ci, donde tenemos la instancia de CodeIgniter. Podemos a travs de ella acceder a la carga de modelos y la invocacin de alguna de las funciones del modelo. En el prximo artculo mostraremos cmo se pueden extender las libreras nativas de CodeIgniter y cmo podemos reemplazarlas totalmente por otro cdigo distinto.

25.- Reemplazar y extender libreras de CodeIgniter


Cmo reemplazar el cdigo por completo de las libreras de CodeIgniter y cmo extenderlo con nuevas funcionalidades. Ya llevamos varios artculos del Manual de CodeIgniter en los que estamos haciendo un segumiento exhaustivo sobre todas las posibilidades de creacin de nuestras propias libreras personalizadas en este framework PHP. En artculos anteriores vimos muchas cosas sobre cmo crear nuestras propias libreras, pero en poco tiempo podremos encontrarnos con mayores necesidades. Desarrolladores un poco ms avanzados desearn en algn momento mejorar o cambiar algo en las libreras nativas de CodeIgniter. Esto es perfectamente posible en este framework PHP y para ello han puesto a nuestra disposicin dos maneras de actuar:

Reemplazar cdigo de una librera nativa por otro totalmente nuevo Extender el cdigo de una librera nativa

Reemplazar el cdigo de una librera con tu propia versin


En el momento de escribir este artculo en CodeIgniter podemos reemplazar el cdigo de cualquier librera excepto la de trabajo con bases de datos "Database". Esto lo podemos hacer simplemente haciendo una librera que tenga el mismo nombre que la librera que pretendemos reemplazar. La guardaremos en el directorio de nuestras propias libreras: system/application/libraries y le damos el nombre de la librera que queremos sustituir. Por ejemplo, si queremos reemplazar la librera Calendar, guardaramos nuestro archivo como "Calendar.php". El nuevo cdigo de la librera sera el que nosotros queramos, slo tenemos que respetar el nombre de la librera original: <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class CI_Calendar{ protected $ci; function __construct(){ $this->ci =& get_instance(); } function algo(){ //lo que sea... } } Nota: Fjate que la mayora de libreras nativas de CodeIgniter tienen el prefijo "CI_". Este prefijo slo lo tienes que utilizar en el nombre de la clase.

Ahora, cuando carguemos la librera nativa Calendar en realidad se estar cargando el cdigo que hemos definido nosotros en esa nueva clase. $this->load->library('calendar'); $this->calendar->algo(); //$this->calendar->generate(); dara error, pues ya no existe ese mtodo.

Extender las libreras nativas de CodeIgniter


Ahora vamos a ver un caso si cabe ms probable. Imagina que quieras quieras que permanezca la funcionalidad de una librera y agregarle un par de funciones. Para esto no necesitas reemplazar el cdigo completo de esa librera, sino simplemente extenderla con algunas funciones propias que solventen tus necesidades particulares. El proceso es bastante parecido al de reemplazar por completo el cdigo de la librera, excepto por un par de cosas:

La declaracin de la nueva clase debe extender la clase original Tu nueva clase debe tener el prefijo "MY_" (aunque esto se puede configurar)

Este sera el cdigo para extender la libera Calendar. class MY_Calendar extends CI_Calendar { } Tendramos que guardar ese archivo en el directorio de las libreras (system/application/libraries) y darle el nombre "MY_Calendar.php". Nota: Un detalle importante es que, si necesitas redefinir el constructor de la clase, no debes olvidarte de hacer una llamada al construccin de la clase parent. class MY_Calendar extends CI_Calendar { function My_Calendar(){ parent::CI_Calendar(); } } La carga de la clase de la librera extendida se hace igual que para la librera original, sin utilizar el prefijo "MY_". A partir de entonces tendrs la clase original ms las funciones con las que la has extendido. $this->load->library('calendar'); $this->calendar->mifuncion_extendida(); Nota:El prefijo "MY_" que se utiliza por defecto para los nombres de clases nativas de CodeIgniter que extendemos se puede configurar en el archivo system/application/config/config.php. Para ello simplemente tienes que editar la variable de configuracin $config['subclass_prefix'].

Con esto ya hemos aprendido todo lo que debamos conocer acerca de crear tus libreras con CodeIgniter y extender o reemplazar las existentes. Ms adelante conoceremos cmo extender o reemplazar las clases del ncleo de CodeIgniter, como pueden ser Controller, Config...

26.- Reemplazar y extender clases del Core de CodeIgniter


Cmo podemos modificar las clases que forman el ncleo de CodeIgniter para alterar significativamente la manera de funcionar del framework PHP. Una caracterstica de CodeIgniter que le diferencia de otros frameworks PHP es la posibilidad que ofrece de cambiar los modos de trabajo que inicialmente propone a los desarrolladores. En este sentido, en CodeIgniter podemos hacer cosas tan crticas como modificar las propias clases que forman parte del "core" o ncleo de la aplicacin. Cuando se pone en marcha CodeIgniter existen varias clases que se cargan automticamente como ncleo de proceso del framework. Esas clases son las que se denominan habitualmente el Core de CodeIgniter y nosotros podemos intercambiarlas por nuestros propios cdigos, o lo que realmente sera ms comn, extenderlas con cdigo adicional que realice funciones que resulten crticas en nuestras aplicaciones web. En este artculo del Manual de CodeIgniter mostraremos el modo de modificar el Core de CodeIgniter, para las personas que juzguen que puede ayudarles en sus tareas de desarrollo. Nota: Este es un artculo que podramos catalogar de avanzado, de modo que lo ms seguro es que no resulte en estos momentos muy interesante para las personas que estn dando sus primeros pasos con el framework. No obstante, no hemos querido saltarnos el tema para seguir en la medida de lo posible el guin del "User Guide" oficial de CodeIgniter. En la prctica, la mayora de los usuarios no van a necesitar nunca alterar las clases del Core. Si acaso en algunos casos puede resultar interesante extender alguna de las clases con cdigo adicional, para dotarles de algn mtodo que resulte til en determinadas aplicaciones. Del mismo modo, antes de cambiar nada del Core de CodeIgniter, es importante que el desarrollador sepa lo que est haciendo y sepa por qu lo est haciendo, aparte que tenga cierta experiencia que le ayude a no meter la pata con las clases ms fundamentales de este framework.

Listado de clases del Core de CodeIgniter


Cuando nos referimos al Core de CodeIgniter, hacemos referencia de aquellas clases que son cargadas siempre que el framework se pone en funcionamiento. Son las siguientes:

Benchmark Config Controller Exceptions Hooks Input Language Loader Log

Output Router URI

Reemplazar las clases del core con nuestras propias versiones


La primera posibilidad que existe es sustituir completamente una clase del Core por otra creada enteramente por nosotros. Esta tarea en principio resulta poco aconsejable y adems requerira un nivel mucho mayor del desarrollador que est realizndola, porque estaremos eliminando una clase clave del framework y colocando un cdigo nuestro, que tenemos que asegurarnos que funcione y que realiza las tareas para las que est diseada la clase originalmente. En cualquier caso se realiza de la siguiente manera: Primero tenemos que fijarnos en el nombre de la clase que queremos sustituir, que puede ser cualquiera de las listadas antes. Luego tenemos que crear una clase con el mismo nombre y colocarla en el directorio de "system/application/libraries". Por ejemplo, imaginemos que queremos sustituir la clase "Config". Entonces crearamos un archivo en: system/application/libraries/Config.php Luego, el cdigo a insertar en ese archivo sera el necesario para definir la clase que estamos sustituyendo, teniendo en cuenta que el nombre de la clase a sustituir debe tener el prefijo CI_. Veamos el siguiente esquema: class CI_Config { //Cdigo de nuestra nueva clase Config }

Extender el cdigo de una clase del Core


Esta segunda posibilidad resulta bastante ms interesante, al menos para usuarios ms normales, puesto que permite agregar funcionalidad a las clases existentes en el Core de CodeIgniter, sin alterar las cosas que ya hacen originalmente. Nota: En mi segunda aplicacin de CodeIgniter ya me result interesante hacer alguna modificacin de la clase Controller, para agregarle algunos mtodos que me resultaba especialmente til disponer en todos los controladores. Realmente, viendo el problema ahora desde otra perspectiva, pienso que quizs se podra haber colocado esos mtodos en otras libreras, pero acab decidiendo colocarlos en la clase de los controladores y funcion bien. Extender una clase se hace de manera similar a sustituirla, con la diferencia que al extenderla tenemos que asegurarnos de invocar al constructor de la clase "parent" (clase que estamos extendiendo) y que debemos utilizar un prefijo "MY_" tanto en el nombre del archivo como en el de la clase. As pues, veamos cmo podemos extender, por ejemplo, la clase Controller.

Tendremos que crear un archivo llamado MY_Controller.php que situaremos en la ruta system/application/libraries/MY_Controller.php. Su cdigo sera el siguiente: <?php if (!defined('BASEPATH')) exit('No deseo permitir acceso directo a este script'); class MY_Controller extends Controller { //constructor, debe llamar al constructor de la clase parent function MY_Controller(){ parent::Controller(); } function algo_importante_que_deseo_tener_siempre(){ //cdigo de una funcin con la que estoy extendiendo mis controladores } } Como se puede ver, estamos extendiendo la clase Controller y lo ms importante es fijarse cmo en el constructor hemos hecho una llamada al constructor de la clase "parent", para que no se pierdan las tareas de inicializacin de los objetos que se definieron en las clases del core que estamos extendiendo. Nota: Hemos utilizado en el cdigo de este caso el modelo de constructor de PHP 4, pero podra utilizarse el de PHP 5 si lo deseamos. Luego, nuestros mtodos tendrn cualquier nombre que deseemos. Adems, si queremos sustituir especficamente alguno de los mtodos que existan en la clase original, simplemente tenemos que crear un nuevo mtodo con el mismo nombre que tena antes. Por ejemplo, si creamos un mtodo llamado index() en la clase MY_Controller, estaremos sustituyendo el cdigo de ese mtodo de los controladores originales. Nota: Si lo deseamos, podemos cambiar el prefijo "MY_" utilizado para las clases que extienden el core y eso se consigue desde el archivo de configuracin, que est en la ruta "system/application/config/config.php", donde tenemos que alterar esta variable: $config['subclass_prefix'] = 'MY_';

27.- Carga automtica de recursos en CodeIgniter


Los recursos en CodeIgniter, como libreras o plugins, se cargan slo bajo demanda, pero podemos configurar el framework para la carga automtica cada vez que se ejecuta el sistema. En el Manual de CodeIgniter, al hablar de los distintos tipos de recursos, explicamos cmo se pueden cargar explcitamente desde los scripts donde los necesitamos. No obstante, debemos saber que esa operacin se puede resumir en un archivo de configuracin. En este artculo vamos a ver cmo realizar la precarga de aquellos recursos que utilizaremos de manera intensiva en el desarrollo de nuestra aplicacin web. En CodeIgniter, por razones de ahorro de tiempo de ejecucin del framework, se tom la decisin de cargar el menor nmero de complementos de manera predeterminada. Esto quiere

decir que nosotros tenemos que tomarnos la molestia de cargar todos los recursos que queramos utilizar, como libreras, helpers, plugins, etc. Ahora bien, existe un modo de precargar aquellos recursos que pretendemos utilizar en todas las pginas, o la mayora de ellas, de modo que no tengamos que invocarlos explcitamente en cada script donde queramos utilizarlos. La carga automtica (auto-load sera en ingls) se realiza cada vez que el framework se ejecuta, por lo que ser conveniente utilizarla cuando tengamos un componente que se va a necesitar en toda la aplicacin web. Nota: Por ejemplo, en CodeIgniter no se conecta con la base de datos de manera predeterminada, sino que tenemos que cargar la librera correspondiente ("database"). Excepto que en la documentacin diga lo contrario, todos los recursos de CodeIgniter deben cargarse en cada pgina que los necesite. Existen muy pocas libreras con carga predeterminada, un caso es la URI Class.

Archivo de carga automtica autoload.php


Para cargar cualquier recurso automticamente en CodeIgniter tienes que indicarlo en el archivo autoload.php, que est en la ruta: system/application/config/autoload.php En tal archivo encontrars el cdigo PHP para indicar qu elementos deseas que se carguen cada vez que se inicia CodeIgniter. La sintaxis es fcilmente comprensible. Veremos un array por cada tipo de cosa que se desea cargar de manera automtica, como libreras, plugins, helpers, modelos etc. En el array debemos incluir el nombre del archivo con cdigo que deseamos cargar, pero sin la extensin .php. En el propio archivo autoload.php hay instrucciones acerca de cada uno de los tipos de cosas que se pueden pre-cargar y algunos ejemplos de cdigo con la definicin de arrays en los que se indican varios elementos para cargar automticamente. Por ejemplo, as podemos precargar varios helpers de CodeIgniter. $autoload['helper'] = array('url', 'form', 'file'); Por supuesto, podemos cargar automticamente los recursos de CodeIgniter, as como otros programados por nosotros mismos. Ahora podemos ver cmo se hace el autoload de varias libreras, algunas que contienen clases definidas en el ncleo de CodeIgniter y otras creadas por nosotros mismos. $autoload['libraries'] = array('database', 'session', 'mylogin','form_validation', 'principales', 'validador');

Qu tipo de recursos se pueden cargar


En el propio archivo autoload.php encontraremos tambin una relacin de los recursos que podemos precargar desde all.

1. 2. 3. 4. 5. 6.

Libreras Helpers Plugins Archivos de configuracin personalizados Archivos de idioma Modelos

28.- Funciones comunes en CodeIgniter


Una serie de funciones bsicas que estn disponibles en CodeIgniter de manera global y que no tenemos que incluir nunca, pues no forman parte de ninguna librera. Existen en CodeIgniter mltiples libreras de funciones, que tienen cdigo para diversos propsitos. Sin embargo, hay una serie de funciones que debemos ver aparte, porque no pertenecen a ninguna librera y por ello, no encontraremos documentacin en otros lugares sobre ellas. Por tanto, este artculo viene a resolver las lagunas que podremos encontrarnos cuando queramos ver para qu sirve tal y tal funcin que parece que no estn explicadas en ningn helper o en ninguna librera (de las que ofrecen clases de programacin orientada a objetos). Estas funciones son globales a toda aplicacin CodeIgniter, por lo que no tenemos que incluirlas explcitamente de ningn modo. Del mismo modo, al ser globales, las podemos invocar desde cualquier pedazo de cdigo de nuestros programas, ya sean vistas, controladores o modelos.

is_php("numero_version")
Esta funcin sirve para saber si tenemos o no una versin de PHP en el servidor dada por parmetro. Devuelve true si la versin de PHP sobre la que trabajamos es igual o superior a la que le enviemos por parmetro. Aunque ningn informtico serio os recomendara desarrollar una aplicacin pensando en una versin de PHP determinada, para conseguir que un proyecto pueda funcionar en varios tipos de servidores web, tendremos que hacer esa pregunta en algunos casos, cuando queramos utilizar funcionalidades de PHP que quizs no estn disponibles en todos los servidores. if (is_php('5.2.3')) { echo "Ests usando PHP 5.2.3 o superior"; }

is_really_writable('Camino/a/archivo')
Esta funcin nos sirve para sustituir la funcin nativa de PHP is_writable(), dado que esta ltima puede en determinadas circunstancias ofrecer una respuesta incorrecta, en sistemas operativos Windows. La versin de CodeIgniter de esta funcin que nos dice si podemos

o no escribir en un fichero funciona siempre bien, dado que la prueba la realiza intentando escribir realmente en el fichero. if (is_really_writable('camino/miarchivo.txt')) { echo "Puedes estar tranquilo, pues el archivo se puede escribir con certeza"; } else { echo "No vas a conseguir escribir en ese fichero"; }

config_item('item_key')
Esta funcin sirve para obtener la configuracin sobre un item simple, de los definidos en el archivo system/application/config/config.php. echo config_item('charset'); //nos devolvera el juego de caracteres configurado en nuestra aplicacin CodeIgniter. Nota: Para trabajar con las configuraciones de CodeIgniter hay una librera llamada "Config Class" que tiene muchas otras funciones que debemos conocer.

set_status_header(codigo, 'texto')
Esta funcin nos sirve para enviar cdigos de estado en la cabecera del protocolo HTTP. set_status_header("401"); Esta funcin hara que el acceso a esta pgina tuviera una respuesta de estado del servidor como la que sigue: HTTP/1.1 401 Unauthorized Nota: Las cabeceras del HTTP envan al cliente web un estado de la respuesta a su solicitud de acceso a una URL. Cdigos habituales en la cabecera son, por ejemplo: HTTP/1.1 200 OK (para pgina encontrada) HTTP/1.1 500 Internal Server Error (para un error de script del servidor en la generacin de la pgina) En el segundo parmetro de set_status_header() podemos colocar un texto cualquiera, para que la descripcin del cdigo de HTTP sea la que nosotros indiquemos.
Funciones relacionadas con la gestin de errores

Adems, existen otra serie de funciones como show_error(), show_404() o log_message() que sirven para la gestin y administracin de errores de aplicacin, que veremos ms adelante en el captulo dedicado a la gestin de errores en CodeIgniter. Cmo hacer un sistema de login de usuarios, acceso por usuario y contrasea, en una pgina web PHP desarrollada con el framework CodeIgniter. Por Ing. Diego Angelini
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

Este es un artculo prctico que nos puede ayudar a aprender algunas tcnicas de desarrollo en el framework CodeIgniter, adems de darnos una gua til para la creacin de un sistema que permita loguearse a los usuarios que visitan nuestra aplicacin web. El sistema de login es uno de los primeros problemas que querremos resolver en aplicaciones web. No es ms que un mdulo que identifica a los usuarios que visitan una pgina web, para implementar un nivel de seguridad por medio de un nombre de usuario y una clave. Por supuesto, en las aplicaciones CodeIgniter, uno de nuestros primeros pasos ser desarrollar ese acceso autenticado. Por ello, nos pondremos manos a la obra para explicar paso por paso una posible implementacin de un script para facilitar la autenticacin de usuarios en nuestra pgina web. Nota: El sistema de login ha sido tratado anteriormente en DesarrolloWeb.com. Claro que, cuando estamos desarrollando en CodeIgniter, los modos en los que tenemos que enfrentar los problemas varan un poco con respecto a la programacin tradicional en PHP (sin usar ningn framework). As pues, os pasamos un par de referencias tiles para poder complementar la presente informacin. Manual de CodeIgniter Desarrollo de un sistema de autenticacin en PHP

5 sencillos pasos para crear un sistema de login en CodeIgniter


Comenzamos listando los pasos que hemos realizado para la construccin de este sistema de autenticacin de usuarios.

Paso 1: crear el archivo php.php y guardarlo en /application/controllers/ Paso 2: crear el archivo login.php y guardarlo en /application/views/ Paso 3: crear usuarios_model.php y guardarlo en /application/models/ Paso 4: crear la tabla mysql con algunos usuarios de prueba Paso 5: Importante: pre-cargar automticamente las libreras de CodeIgniter para base de datos y validaciones de formularios

A continuacin, podis ver los listados de cdigo de cada uno de los scripts que hemos utilizado. Ms tarde en este mismo artculo, despus de los listados, podris leer una descripcin de cada uno de estos pasos para la implementacin.

Paso 1: Cdigo para el controlador php.php:


<?php class Php extends CI_Controller { function login($idioma=null) { // $this->config->set_item('language', 'spanish'); que deseamos que ejecute nuestra aplicacin // Setear dinmicamente el idioma

if(!isset($_POST['maillogin'])){ // Si no recibimos ningn valor proveniente del formulario, significa que el usuario recin ingresa. $this->load->view('login'); // Por lo tanto le presentamos la pantalla del formulario de ingreso. } else{ // Si el usuario ya pas por la pantalla inicial y presion el botn "Ingresar" $this->form_validation->set_rules('maillogin','e-mail','required|valid_email'); // Con figuramos las validaciones ayudandonos con la librera form_validation del Framework Codeigniter $this->form_validation->set_rules('passwordlogin','password','required'); if(($this->form_validation->run()==FALSE)){ // Verificamos si el usuario super la validacin $this->load->view('login'); // En caso que no, volvemos a presentar la pantalla de login } else{ // Si ambos campos fueron correctamente rellanados por el usuario, $this->load->model('usuarios_model'); $ExisteUsuarioyPassoword=$this->usuarios_model>ValidarUsuario($_POST['maillogin'],$_POST['passwordlogin']); // comprobamos que el usuario exista en la base de datos y la password ingresada sea correcta if($ExisteUsuarioyPassoword){ // La variable $ExisteUsuarioyPassoword recibe valor TRUE si el usuario existe y FALSE en caso que no. Este valor lo determina el modelo. echo "Validacion Ok<br><br><a href=''>Volver</a>"; // Si el usuario ingres datos de acceso vlido, imprimos un mensaje de validacin exitosa en pantalla } else{ // Si no logr validar $data['error']="E-mail o password incorrecta, por favor vuelva a intentar"; $this->load->view('login',$data); // Lo regresamos a la pantalla de login y pasamos como parmetro el mensaje de error a presentar en pantalla } } } } } ?>

Paso 2: Cdigo para la vista login.php:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Demo del script: Cmo hacer un login de usuarios en php?</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="description" content="Efecta tus propias pruebas on-line. Para ejecutarlo en tu sitio necesitas del framework CodeIgniter, provisto gratis por la empresa de hosting Solo10.com." /> <meta name="keywords" content="php, login, codeigniter, hosting, demo, web hosting,

script, usuarios" /> <link rel="stylesheet" href="http://www.blogdephp.com/script/php-login.css" type="text/css" media="screen"> <link rel="stylesheet" href="http://www.blogdephp.com/script/addtoany.min.css" type="text/css" media="screen"> <!--<link rel="stylesheet" href="../../php-login.css" type="text/css" media="screen">--> <meta name="google-site-verification" content="xWxEFUMgHER4nLx6TAXD9rHFhclvQkEX-RX6qClbszI" /> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20047775-3']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.googleanalytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <meta property="og:title" content="Cmo hacer un login de usuarios en php y codeigniter? Ver script y demo !" /> <meta property="og:type" content="blog" /> <meta property="og:url" content="http://www.blogdephp.com/script/php/login/" /> <meta property="og:image" content="http://www.blogdephp.com/images/php.gif" /> <meta property="og:site_name" content="www.blogdephp.com" /> <meta property="fb:admins" content="100001608753773" /> </head> <body style="margin-top:0px"> <?php echo form_open('php/login/'); ?> <div class="Info"> <p class="Titulo"><h1>Demo del script: <a href="/php-login/">Cmo hacer un login de usuarios en php y codeigniter?</a></h1></p> <p> </p> </div> <div id="LoginUsuarios"> <div class="fila"> <div class="LoginUsuariosCabecera">E-mail:</div> <div class="LoginUsuariosDato"><input type="text" name="maillogin" value="<?= set_value('maillogin'); ?>" size="25" /></div> <div class="LoginUsuariosError"> <? if(isset($error)){

echo "<p>".$error."</p>"; } echo form_error('maillogin'); ?> </div> </div> <div class="fila"> <div class="LoginUsuariosCabecera">Contrasea:</div> <div class="LoginUsuariosDato"><input type="password" name="passwordlogin" value="<?= set_value('passwordlogin'); ?>" size="25" /></div> <div class="LoginUsuariosError"><?= form_error('passwordlogin');?></div> </div> <div class="fila"> <div class="LoginUsuariosCabecera"></div> <div class="LoginUsuariosDato"></div> </div> <div class="fila"> <div class="LoginUsuariosCabecera"><input type="submit" value="Ingresar"></div> <div class="LoginUsuariosDato"></div> </div> </div> </form> <p> </p> <div class="Info"> <p><u><h2>Datos de acceso (demo)</h2></u></p> <p> </p> <p>(correspondiente a un usuario ya ingresado en la base de datos)</p> <p><strong>e-mail</strong>: diego@blogdephp.com</p> <p><strong>password</strong>: blogdephp</strong></p> </div> <p> </p> <!--<p><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F %2Fblogdephp.com%2Fscript%2Fphp %2Flogin&layout=standard&show_faces=true&width=450&action=like&colorscheme=light &height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:50px;" allowTransparency="true"></iframe></p> --> <div class="addtoany_share_save_container"><div class="a2a_kit addtoany_list"><iframe class="addtoany_special_service facebook_like" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblogdephp.com %2Fphp-login %2F&layout=button_count&show_faces=false&width=75&action=like&colorscheme=light &height=15" frameborder="0" scrolling="no" style="border:none;overflow:hidden;width:90px;height:20px"></iframe><iframe class="addtoany_special_service twitter_tweet" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F %2Fblogdephp.com%2Fphp-login%2F&counturl=http%3A%2F%2Fblogdephp.com%2Fphplogin%2F&count=horizontal&text=%C2%BFC%C3%B3mo%20hacer%20un%20login %20de%20usuarios%20en%20Php%20y%20Codeigniter%3F: " frameborder="0" scrolling="no" style="border:none;overflow:hidden;width:80px;height:20px"></iframe><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http

%3A%2F%2Fblogdephp.com%2Fphp-login%2F&linkname=%C2%BFC%C3%B3mo %20hacer%20un%20login%20de%20usuarios%20en%20Php%20y%20Codeigniter%3F" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blogdephp.com/wpcontent/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn" border="0" style="margin-right:20px; "/></a><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blogdephp.com/wpcontent/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share" border="0"/></a></div> <script type="text/javascript"><!-var a2a_config = a2a_config || {}; a2a_localize = { Share: "Compartir", Save: "Guardar", Subscribe: "Suscribirse", Email: "E-mail", Bookmark: "Marcador", ShowAll: "Mostrar todo", ShowLess: "Mostrar menos", FindServices: "Buscar servicios(s)", FindAnyServiceToAddTo: "Buscar servicio", PoweredBy: "Servicio ofrecido por", ShareViaEmail: "Compartir por e-mail", SubscribeViaEmail: "Suscribirse por e-mail", BookmarkInYourBrowser: "Agregar a marcadores de tu navegador", BookmarkInstructions: "Presione Ctrl+D o Cmd+D para marcar esta pagina", AddToYourFavorites: "Agregar a favoritos", SendFromWebOrProgram: "Enviar de cualquier direccin de e-mail o programa de e-mail", EmailProgram: "Programa de e-mail" }; a2a_config.linkname="Cmo hacer un login de usuarios en Php y Codeigniter?"; a2a_config.linkurl="http://blogdephp.com/php-login/"; //--></script><script type="text/javascript" src="http://static.addtoany.com/menu/page.js"></script> <div class="Info"> <p><u><h2>Requerimientos necesarios en tu web hosting para poder ejecutar el script</h2></u></p> <p> </p> <p>Para poder implementar este script de login, se requiere el framework de php "Codeigniter"</p> <p>(esta maravillosa herramienta nos ayuda a ahorrar mucho tiempo y esfuerzo en nuestros trabajos de programacin php).</p> <p> </p> <p>La empresa <a href="http://www.solo10.com/productos/WebHostingLinux/? safblogdephp">Solo10.com</a>, cuando contratas un paquete de hosting anual desde u$s 49.95,</p> <p>te ofrece la instalacin y configuracin inicial del Codeigniter gratis :-)</p> <p> </p> <p>Este blog y demo se encuentran alojados en los servidores de Solo10.com.</p> <p>Te recomiendo el <a href="http://www.solo10.com/productos/WebHostingLinux/? safblogdephp">servicio de hosting</a> que ofrece esta empresa de hablahispana!</p>

</div> <p> </p> <div class="Info"> <p><a href="http://www.blogdephp.com/">Ver ms artculos y scripts de php y codeigniter</a></p> </div> </body> </html>

Paso 3: Cdigo para el modelo usuarios_model.php


<?php class Usuarios_model extends CI_Model{ function ValidarUsuario($email,$password){ // Consulta Mysql para buscar en la tabla Usuario aquellos usuarios que coincidan con el mail y password ingresados en pantalla de login $query = $this->db->where('Usuario',$email); // La consulta se efecta mediante Active Record. Una manera alternativa, y en lenguaje ms sencillo, de generar las consultas Sql. $query = $this->db->where('Password',$password); $query = $this->db->get('Usuarios'); return $query->row(); // Devolvemos al controlador la fila que coincide con la bsqueda. (FALSE en caso que no existir coincidencias) } } ?>

Paso 4: Consulta Mysql para crear la tabla de usuarios


CREATE TABLE `Usuarios` ( `Id` INT NOT NULL AUTO_INCREMENT , `Usuario` VARCHAR( 50 ) NOT NULL , `Password` VARCHAR( 50 ) NOT NULL , PRIMARY KEY ( `Id` ) ) ENGINE = MYISAM ; INSERT INTO `Usuarios` ( `Id` , `Usuario` , `Password` ) VALUES ( NULL , 'diego@blogdephp.com', 'blogdephp' );

Paso 5: Importante: pre-cargar libreras de CodeIgniter para base de datos y validaciones de formularios
Abrir el archivo autoload.php, ubicado en la ruta /application/config/" y localizar la siguiente lnea: $autoload['libraries']=array(); Reemplazarla por: $autoload['libraries'] = array('database','form_validation'); (esto es indispensable para poder utilizar los mtodos de validaciones que nos brinda CodeIgniter).

Nota: La gran ventaja de cargar una librera desde el archivo autoload.php es que luego la tenemos disponible, y podemos utilizarla, desde cualquier parte del Framework. De lo contrario, tendriamos que cargar la librera en todos los controladores en que la necesitemos (ocasionando redundancia de cdigo).

Por qu es importante un sistema de login de usuarios


Como habis podido comprobar, se trata de un script que, mediante pocas lneas de cdigo, permite configurar el sistema de autenticacin de usuarios en tu propio sitio web. Sobra decir que esta implementacin es sumamente importante en cualquier proyecto y la necesitaremos en cualquier web que desarrollemos, por simple que sea nuestra aplicacin. Esto es debido a que en cualquier sitio web, medianamente avanzado, seguramente existe cierta informacin y funciones que nos interesa ofrecer nicamente a usuarios registrados y no al resto del pblico. As como posibilitar que un usuario tenga guardada cierta informacin y sta est asociada a su cuenta, slo visible por l. Pensemos en la posibilidad de estar realizando un sistema web para un peridico. En ese caso interesar que los periodistas puedan acceder al sistema (mediante un usuario y clave) y puedan dar de alta noticias u otro tipo de artculos. Por supuesto, esta funcin debera ser accesible nicamente por periodistas debidamente autenticados y no por otro tipo de usuario que pueda acceder a la web del medio de comunicacin.

Funcionalidades deseables en un sistema de autenticacin


A continuacin veamos una lista de las cosas que querremos tener disponibles en un sistema de login de usuarios.

Permitir acceso a determinada informacin y funcionalidades, pero que ste se otorgue solamente a determinados usuarios, aquellos que se encuentren en una tabla de la base de datos de nuestra aplicacin web. Nosotros trabajaremos con MySQL. Enviar un mensaje de error cuando no se ha indicado algn campo de la pantalla de acceso autenticado. Enviar un mensaje de error cuando los datos cumplimentados para el login no coinciden con ningn usuario de los existentes en la base de datos. Recordar los datos que tena escritos el visitante, cuando no supera el login y se le vuelve a mosotrar la pantalla de acceso autenticado.

Explicacin tcnica de los scripts


Como pueden observar, los scripts de este sistema de login (listados al principio del artculo) se encuentran comentados para una mayor facilidad de comprensin. Existen comentarios para cada una de las sentencias importantes, que relatan de manera resumida cada una de las funciones que cumplen. No obstante, intentaremos ahora realizar una explicacin general de cmo funciona el sistema desarrollado, de forma que las personas lo puedan entender tan fcil como si fuera un cuento :-) Comencemos con la pantalla de acceso, que est en la pgina login.php, donde el usuario podr escribir sus datos de autenticacin (usuario y password). Recordemos que en

CodeIgniter todo lo que se basa en la interaccin con el usuario (entrada y salida de datos) se debe desarrollar por medio de las las vistas (capa presentacin). Aqu la sentencia importante es la siguiente: <?php echo form_open('php/login/'); ?> Con ello se genera el formulario HTML para hacer el login y especificamos que sus datos deben ser enviados y procesados por el mtodo login del controlador php. La funcin form_open es propia de CodeIgniter. Otro punto importante a tener en cuenta est en la vista, en el momento en el que creamos los campos (osea, las cajas de texto donde el usuario podr escribir los datos de acceso para enviarlos a la aplicacin): <input type="text" name="maillogin" value="<?= set_value('maillogin'); ?>" size="25" /> Aqu estamos creando un campo INPUT (de texto) llamado maillogin. La funcin set_value sirve para recordar los datos rellenados por el usuario, en caso de que su acceso no sea vlido y tengamos que volver a mostrar la pantalla de acceso. Este simple detalle ofrece un valor aadido que permite una mayor usabilidad en nuestra aplicacin. Ahora podemos analizar el controlador php.php. Sin lugar a dudas, aqu reside la parte ms compleja del script. Por esa razn se han colocado comentarios para cada una de las lneas de cdigo, lo que espero mejore su comprensin. Te sugiero comenzar leyendo directamente los comentarios en el cdigo fuente. El controlador (php.php) toma los datos que nos envan del formulario de autenticacin y realiza las correspondientes validaciones. Tambin consulta al modelo (usuarios_model.php) si el usuario y clave indicados existen en algn registro de la tabla de usuarios, es decir, su el usuario y clave son vlidos. Por ltimo, este controlador decide si el usuario indicado pueda o no entrar a la aplicacin, y comunica su decisin a la vista (login.php), que es la encargada de mostrar la respuesta correspondiente en la pgina. Antes de acabar, me parece conveniente remarcar algunas sentencias y declaraciones puntuales que son elementales en PHP, y que por ello servirn en toda aplicacin web que desarrolles. $_POST['maillogin'] (Esto accede a los valores llegados del formulario en el campo "maillogin") $this->load->model('usuarios_model'); (Esto es una carga del modelo de usuarios "usuarios_model", de modo que se puedan utilizar sus recursos en los controladores.) $this->usuarios_model->ValidarUsuario($_POST['maillogin'],$_POST['passwordlogin']); (Esto es una llamada para ejecutar el mtodo ValidarUsuario que hay en el modelo usuarios_model. En el que le pasamos dos parmetros).

Tenemos pensado mejorar este sistema de autenticacin de usuarios en el futuro, con cosas como implementar que un usuarios pueda acceder a pginas exclusivas con informacin nicamente vlida y accesible por l. Y cmo acceder a la pgina sin tener que escribir en cada acceso sus sus de login, es decir, que los tenga que escribir una nica vez y que la aplicacin los recuerde en futuros accesos. Espero que mis explicaciones y scripts resulten de utilidad para los desarrolladores en CodeIgniter y que no resulte difcil de implementar este sistema de login de usuarios. Sobre todo, que las persoans hayan podido aprender algo con este artculo. Por supuesto, si han quedado dudas o si se quieren realizar consultas, podis publicar comentarios y tratar de contestarlos para aclarar lo que fuera necesario.

30.- Enrutado personalizado de URLs en CodeIgniter


Las funciones de enrutado definidas en CodeIgniter se pueden personalizar de manera que se creen nuevas reglas especficas en las aplicaciones. CodeIgniter tiene un sistema bastante prctico por el cual las URL de las aplicaciones web se enrutan a controladores y mtodos dentro de ellos. Es un sistema a travs del cual conseguimos que URLs amigables para buscadores se ejecuten en pedazos de cdigo a los que adems enviamos todo tipo de parmetros. A lo largo del Manual de CodeIgniter, estas funciones de enrutado ya las hemos estado utilizando de manera intensiva y estaban explicadas en el artculo URLs en CodeIgniter. En el presente texto vamos a explicar cmo podemos sobreescribir ese enrutado predeterminado, creando URLs mucho ms personalizadas, a las que asignamos diferentes recursos para su ejecucin. De manera predeterminada, el enrutado de CodeIgniter hace que el primer elemento despus del nombre del dominio sea la clase o controlador que tiene que gestionarlo. El segundo elemento de la URL sera el mtodo dentro de ese controlador y el tercero, y siguientes, seran los parmetros enviados al mtodo que ejecutara esa ruta. Eso se puede ver en el siguiente esquema de URL: http://midominio.com/controlador/metodo/parametro Pero este modelo de trabajo, que puede ser ptimo para la mayora de los casos, puede que no lo sea tanto para muchos otros. Afortunadamente, los desarrolladores de aplicaciones de CodeIgniter disponen de unos mecanismos para sobreescribir esas rutas predeterminadas y hacelas que se adapten a sus necesidades, para crear rutas diferentes, como podran ser: http://midominio.com/productos/21/ http://midominio.com/productos/13/ http://midominio.com/productos/9/ De manera predeterminada el segundo segmento de la URL correspondera con el nombre del mtodo que ejecutara la pgina, pero en esos ejemplos, como se puede ver, estaramos

pasando el identificador de un producto, que probablemente nos gustara que se enviara como parmetro a un mtodo de controlador.

Creando tus propias reglas de enrutado


Existe un archivo donde podemos generar todo tipo de reglas para conseguir un enrutado de URIs distinto del predeterminado. Ese archivo lo podemos encontrar en el directorio de los archivos de configuracin: system/application/config/routes.php All podremos definir un array llamado $route donde colocaremos todas las reglas de enrutado que queremos crear de manera especfica en nuestra aplicacin web CodeIgniter. Si abrimos el mencionado archivo podremos ver que ya hay dos valores de enrutado definidos en el array $route. $route['default_controller'] = "welcome"; $route['scaffolding_trigger'] = ""; Esos dos valores de enrutamiento son propios de CodeIgniter y estn reservados para cualquier otro uso. Nosotros podemos cambiar los valores predeterminados de enrutamiento para esas variables, pero no podemos crear rutas de nuestra aplicacin utilizndolos. Adems estas dos rutas predeterminadas deben aparecer antes de cualquier otra ruta que definamos posteriormente en el archivo routes.php. Nota: El primero de ellos, default_controller, sirve para definir el controlador por defecto que se ejecutara en caso que no se indique ninguna ruta en la URL (en la raz del dominio). En la configuracin que viene en la instalacin bsica de CodeIgniter, si no se especfica nada en la URL, se abre el controlador "welcome", pero ese controlador predeterminado lo podemos cambiar segn nuestras necesidades. Al hablar de controladores ya se coment qu era el controlador por defecto y cmo podemos cambiarlo. Ahora ya sabemos que ese cambio de controlador predeterminado en realidad no era ms que la definicin de una regla de enrutado en CodeIgniter. Entonces, para crear nuestras propias reglas, se tratara simplemente de asignar nuevos valores al array asociativo $route y para ello tenemos que atender a la siguiente sintaxis: $route['de_donde_vienes'] = 'a_donde_vas'; Como se puede ver, en las rutas tenemos dos partes:

En el ndice del array asociativo, 'de_donde_vienes', colocamos un patrn que debe coincidir para que se produzca un enrutamiento. En el valor asignado a ese ndice del array, 'a_donde_vas', colocamos la ruta a la que estamos enviando el flujo de ejecucin de CodeIgniter.

Ahora veamos un ejemplo de enrutamiento real: $route['desarrolloweb'] = "empresa/tecnologia/5";

Esto quiere decir que, si CodeIgniter se encuentra "desarrolloweb" en el primer segmento de la URL (despus del nombre del dominio), se redireccionar el flujo de la aplicacin para el controlador "empresa", el mtodo "tecnologia" y pasndole como parmetro el dgito 5. Claro que estas rutas se podrn definir por medio de patrones, de varias maneras, para hacerlas ms potentes. Para ello, dichos patrones de enrutamiento, que sirven para definir las rutas 'de_donde_vienes', pueden incluir comodines o expresiones regulares. Nota: De manera general, al definir las reglas de enrutado no se deben colocar las barras al principio ni al final de la ruta. Por ejemplo, no uses "/empresas/tecnologia/1/", sino "empresas/tecnologia/1".

Definir rutas con comodines


Los comodines nos sirven para definir patrones sencillos de enrutamiento. Existen dos dos tipos de comodines que podemos utilizar: (:num) Este comodn sirve para cualquier cadena que contenga solamente dgitos numricos. (:any) Este comodn sirve para cualquier cadena, con cualquier carcter. Para ver cmo utilizar estos comodines en la generacin de reglas de enrutamiento, podemos observar el siguiente ejemplo: $route['producto/(:any)'] = "productos/busqueda"; En este ejemplo, una URL que tenga la palabra producto en el primer segmento y en el segundo segmento cualquier conjunto de caracteres, se enrutar por el controlador productos y el mtodo bsqueda. $route['cliente/(:num)'] = "empresa/muestra_cliente/$1"; En este segundo ejemplo, si el sistema de enrutado de CodeIgniter detecta que en el primer segmento de la URL est la palabra "cliente" y en el segundo segmento hay un nmero, la aplicacin enrutara esta llamada a travs del controlador "empresa" y el mtodo "cliente". Adems, pasara ese nmero, del segundo segmento de la URL de origen, como parmetro al mtodo muestra_cliente.

Crear las reglas de enrutamiento con expresiones regulares


Toda la potencia de las expresiones regulares la podemos aplicar a CodeIgniter para crear reglas de enrutamiento tan complejas como deseemos. $route['manuales/([0-9]+)'] = "manuales/muestra/$1";

Si detectamos en la primera parte la palabra manuales y en el segundo segmento un conjunto de dgitos numricos, se enrutara a travs del controlador manuales, el mtodo muestra, con el parmetro indicado como dgitos numricos. $route['espana/([a-z_-]+)/([a-z_-]+)'] = "localidad/$1/$2"; Esta regla de enrutamiento, un poco ms compleja, servira para detectar la palabra "espana" en el primer segmento y luego dos segmentos adicionales, con sendas expresiones regulares que aceptaran letras de la "a" a la "z" con el guin bajo o medio, repetidas una o ms veces. Las enrutara a travs del controlador "localidad" y luego, el mtodo especificado en la primera expresin y el parmetro indicado en la segunda expresin regular. Nota: en el caso de usar "backreferences" de las expresiones regulares, se debe usar la sintaxis con el dlar en lugar de la contrabarra.

Anda mungkin juga menyukai