6 CodeIgniter Hacks para los Masters

CodeIgniter es un marco de aplicaciones web de código abierto simple y potente para PHP. Hoy, haremos algunos "trucos" básicos a este marco para cambiar y mejorar su funcionalidad. En el proceso, obtendrá una mejor comprensión de las complejidades de CodeIgniter.

Renuncia

  1. No se recomienda aplicar estos hacks a un proyecto existente. Dado que cambian algunas de las funciones principales de CodeIgniter, puede romper el código existente.
  2. A partir de este escrito, CodeIgniter 1.7.2 es la última versión estable. No se garantiza que estos hacks funcionen para versiones futuras (o pasadas).
  3. Aunque CodeIgniter está diseñado para ser compatible con PHP 4, algunos de estos hacks no lo son. Así que necesitarás un servidor con PHP 5 instalado.
  4. Cuando realice cambios en los archivos dentro de la carpeta del sistema, debe documentarlo en algún lugar para futuras referencias. La próxima vez que actualice CodeIgniter (aunque no liberan actualizaciones muy a menudo), es posible que deba volver a aplicar esos cambios..

1. Modelos Autoloading PHP 5 Style

La meta

En el lado izquierdo, puede ver la forma habitual de cargar un modelo en CodeIgniter, desde dentro de un Controlador. Después de este hack, podremos crear objetos directamente. El código está más limpio y su IDE podrá reconocer los tipos de objetos. Esto habilita funciones IDE como autocompletar o previsualizar la documentación..

Hay dos efectos secundarios más de este truco. Primero, ya no es necesario que extienda la clase Modelo:

Y ya no tiene que agregar una llamada a require_once antes de modelar la herencia de clases.

El hack

Todo lo que necesitamos hacer es agregar una función de autocargador de estilo PHP 5.

Agregue este código al final del sistema / aplicación / config / config.php:

Si también está interesado en aplicar este truco para los controladores, puede usar este código en su lugar:

Cada vez que intenta utilizar una clase que no está definida, esta función __autoload se llama primero. Se encarga de cargar el archivo de clase..

2. Prevenir colisión de nombre de controlador de modelo

La meta

Normalmente, no puede tener el mismo nombre de clase para un modelo y un controlador. Digamos que creaste un nombre de modelo

clase Post amplía Modelo //…

Ahora no puedes tener una URL como esta:

http://www.mysite.com/post/display/13

La razón es porque eso requeriría que también tengas una clase de Controlador llamada "Publicar". Crear una clase así daría lugar a un error fatal de PHP.

Pero con este truco, será posible. Y el controlador para esa URL se verá así:

// aplicación / controllers / post.php class Post_controller extiende el Controlador //…

Tenga en cuenta el sufijo '_controller'.

El hack

Para solucionar este problema, normalmente la mayoría de la gente agrega el sufijo '_model' a los nombres de clase del modelo (por ejemplo, Post_model). Los objetos modelo se crean y se referencian en toda la aplicación, por lo que puede parecer un poco tonto tener todos estos nombres con '_model' flotando alrededor. Creo que es mejor agregar un sufijo a los controladores en su lugar, ya que casi nunca se hace referencia a ellos por sus nombres de clase en su código.

Primero necesitamos extender la clase Router. Cree este archivo: "aplicación / bibliotecas / MY_Router.php"

la clase MY_Router extiende CI_Router var $ sufijo = '_controller'; function MY_Router () parent :: CI_Router ();  function set_class ($ class) $ this-> class = $ class. $ this-> sufijo;  function controller_name () if (strstr ($ this-> class, $ this-> suffix)) return str_replace ($ this-> suffix, ", $ this-> class); else return $ this-> clase;   

Ahora edite la línea 153 "system / codeigniter / CodeIgniter.php":

if (! file_exists (APPPATH.'controllers /'.$ RTR-> fetch_directory (). $ RTR-> controller_name (). EXT))

Mismo archivo, línea 158:

include (APPPATH.'controllers /'.$ RTR-> fetch_directory (). $ RTR-> controller_name (). EXT);

A continuación, edite: "system /raries / Profiler.php", línea 323:

$ salida. = "
". $ this-> CI-> router-> controller_name ()." / ". $ this-> CI-> router-> fetch_method ()."
";

Eso es todo. Tenga en cuenta que con este truco debe poner el sufijo '_controller' en todos los nombres de clase de sus controladores. Pero no en los nombres de archivos o las URL.

3. Validación de formularios para valores únicos

La meta

CodeIgniter tiene una buena clase Form_validation. Viene con varias reglas de validación:

Estos son útiles, pero falta uno importante en esta lista: para verificar valores únicos. Por ejemplo, la mayoría de los formularios de registro de usuarios deben verificar que el nombre de usuario no esté en uso o que la dirección de correo electrónico no esté en el sistema..

Con este truco, podrá agregar esta regla de validación a su controlador de envío de formularios muy fácilmente:

$ this-> form_validation-> set_rules ('username', 'Username', 'required | alpha_numeric | min_length [6] | unique [User.username]');

Tenga en cuenta la última parte que dice "único [User.username]". Esta nueva regla de validación se llama simplemente "única" y toma un parámetro dentro de los corchetes, que es "tablename.fieldname". Por lo tanto, verificará la columna "nombre de usuario" de la tabla "Usuario" para asegurarse de que el valor enviado no exista..

Del mismo modo, puede comprobar si hay correos electrónicos duplicados:

$ this-> form_validation-> set_rules ('email', 'E-mail', 'required | valid_email | unique [User.email]');

Y su aplicación puede responder con mensajes de error apropiados:

El hack

Esto podría ser considerado más una extensión que un hack. Sin embargo, vamos a tomar una biblioteca central de CodeIgniter y mejorarla..

Crear: "aplicación / bibliotecas / MY_Form_validation.php"

la clase MY_Form_validation extiende CI_Form_validation function unique ($ value, $ params) $ CI = & get_instance (); $ CI-> carga-> base de datos (); $ CI-> form_validation-> set_message ('unique', 'El% s ya está siendo usado.'); list ($ table, $ field) = explode (".", $ params, 2); $ query = $ CI-> db-> select ($ field) -> from ($ table) -> where ($ field, $ value) -> limit (1) -> get (); if ($ query-> row ()) return false;  else return true; 

Ahora puedes usar la regla de validación única.

4. Ejecutando CodeIgniter desde la línea de comandos

La meta

Al igual que el título dice, nuestro objetivo es poder ejecutar aplicaciones CodeIgniter desde la línea de comandos. Esto es necesario para crear trabajos cron o ejecutar operaciones más intensivas para que no tenga las limitaciones de recursos de un script web, como el tiempo máximo de ejecución.

Esto es lo que parece en mi máquina de Windows local:

El código anterior sería como llamar a esta URL:

http://www.mysite.com/hello/world/foo

El hack

Cree un archivo "cli.php" en la raíz de su carpeta CodeIgniter:

if (isset ($ _ SERVER ['REMOTE_ADDR'])) die ('Command Line Only!');  set_time_limit (0); $ _SERVER ['PATH_INFO'] = $ _SERVER ['REQUEST_URI'] = $ argv [1]; requiere dirname (__ FILE__). '/index.php';

Si está en un entorno Linux y desea que este script sea auto ejecutable, puede agregarlo como la primera línea en cli.php:

#! / usr / bin / php

Si desea que un controlador específico sea solo una línea de comando, puede bloquear las llamadas web en el constructor del controlador:

la clase Hello extiende Controller function __construct () if (isset ($ _ SERVER ['REMOTE_ADDR'])) die ('Command Line Only!');  parent :: Controller ();  //…

5. Agregando Doctrine ORM a CodeIgniter

La meta

Doctrine es un popular Mapeo Relacional de Objetos para PHP. Al agregarlo a CodeIgniter, puede tener una capa de modelo muy poderosa en su marco.

El hack

El solo hecho de instalar Doctrine no es muy "pirateado" en sí mismo, ya que podemos agregarlo como un complemento. Sin embargo, una vez agregadas, sus clases de modelo deberán extender las clases base de Doctrine, en lugar de la clase de modelo CodeIgniter. Esto cambiará completamente la forma en que funciona la capa Modelo en el marco. Los objetos que cree tendrán una base de datos persistente y también podrán tener relaciones de base de datos con otros objetos..

Sigue estos pasos:

  1. Crear carpeta: aplicación / complementos
  2. Crear carpeta: aplicación / plugins / doctrina
  3. Descarga Doctrine (1.2 a partir de este artículo)
  4. Copia la carpeta "lib" de Doctrine a: "application / plugins / doctrine"
  5. Crear "aplicación / plugins / doctrine_pi.php"
// system / application / plugins / doctrine_pi.php // cargar la biblioteca de Doctrine require_once APPPATH. '/ plugins / doctrine / lib / Doctrine.php'; // cargar la configuración de la base de datos desde CodeIgniter require_once APPPATH. '/ config / database.php'; // esto permitirá que Doctrine cargue las clases del Modelo automáticamente spl_autoload_register (array ('Doctrine', 'autoload')); // cargamos las conexiones de nuestra base de datos en Doctrine_Manager // este bucle nos permite usar varias conexiones más adelante para foreach ($ db como $ connection_name => $ db_values) // primero debemos convertir al formato dsn $ dsn = $ db [$ connection_name] ['dbdriver']. ': //'. $ db [$ connection_name] ['username']. ':'. $ db [$ connection_name] ['contraseña']. '@'. $ db [$ connection_name] ['hostname']. '/'. $ db [$ connection_name] ['database']; Doctrine_Manager :: connection ($ dsn, $ connection_name);  // La clase de modelo de CodeIgniter se debe cargar require_once BASEPATH. '/ Library / Model.php'; // indicando a Doctrine dónde se encuentran nuestros modelos Doctrine :: loadModels (APPPATH. '/ models');

A continuación, edite "application / config / autoload.php" para cargar automáticamente este complemento de Doctrine

$ autoload ['plugin'] = array ('doctrine');

También asegúrese de tener la configuración de su base de datos en "application / config / database.php".

Eso es todo. Ahora puedes crear modelos de Doctrine dentro de tu aplicación CodeIgniter. Lee mis tutoriales sobre este tema para más información..

6. Ejecutando múltiples sitios

La meta

Este truco le permitirá ejecutar múltiples sitios desde una única instalación de CodeIgniter. Cada sitio web tendrá su propia carpeta de aplicaciones, pero todas compartirán la misma carpeta del sistema.

El hack

Instale CodeIgniter en cualquier parte del servidor. No necesita estar debajo de una carpeta de sitio web. Luego saque la carpeta de la aplicación de la carpeta del sistema. Y haga copias adicionales de él, como se ve en la imagen de arriba, para cada sitio web que quiera ejecutar. Puede colocar esas carpetas de aplicaciones en cualquier lugar, como debajo de cada carpeta de sitio web..

Ahora copie el archivo index.php en la raíz de cada carpeta del sitio web y edítelo de la siguiente manera:

En la línea 26, ponga la ruta completa a la carpeta del sistema:

 $ system_folder = dirname (__ FILE__). '… / Codeigniter / system';

En la línea 43, ponga la ruta completa a la carpeta de la aplicación:

 $ application_folder = dirname (__ FILE__). '… / Application_site1';

Ahora puede tener sitios web independientes utilizando carpetas de aplicaciones separadas, pero compartiendo la misma carpeta del sistema.

Hay una implementación similar en la Guía del usuario de CodeIgniter que también puede leer.

7. Permitir todos los tipos de archivos para subir

La meta

Al usar la biblioteca Cargar en CodeIgniter, debe especificar qué tipos de archivos están permitidos.

$ this-> load-> library ('subir'); $ this-> upload-> set_allowed_types ('jpg | jpeg | gif | png | zip');

Si no especifica ningún tipo de archivo, recibirá un mensaje de error de CodeIgniter: "No ha especificado ningún tipo de archivo permitido".

Por lo tanto, de manera predeterminada, no hay forma de permitir que se carguen todos los tipos de archivos. Necesitamos hacer pequeños trucos para sortear esta limitación. Después de eso podremos permitir todos los tipos de archivos configurándolo en '*'.

$ this-> load-> library ('subir'); $ this-> upload-> set_allowed_types ('*');

El hack

Para este hack vamos a modificar el comportamiento de la clase Upload..

Crear archivo: aplicación / bibliotecas / My_Upload.php

la clase MY_Upload extiende CI_Upload function is_allowed_filetype () if (count ($ this-> allowed_types) == 0 O! is_array ($ this-> allowed_types)) $ this-> set_error ('upload_no_file_types'); falso retorno;  if (in_array ("*", $ this-> allowed_types)) return TRUE;  $ image_types = array ('gif', 'jpg', 'jpeg', 'png', 'jpe'); foreach ($ this-> allowed_types as $ val) $ mime = $ this-> mimes_types (strtolower ($ val)); // Las imágenes obtienen algunas verificaciones adicionales si (in_array ($ val, $ image_types)) if (getimagesize ($ this-> file_temp) === FALSE) return FALSE;  if (is_array ($ mime)) if (in_array ($ this-> file_type, $ mime, TRUE)) return TRUE;  else else if ($ mime == $ this-> file_type) return TRUE;    falso retorno; 

Conclusión

Espero que algunos de estos te sean de utilidad. De lo contrario, aún son interesantes de conocer y pueden ayudarlo a conocer más sobre el funcionamiento interno de un marco y algunas de las características principales del lenguaje PHP..

Si conoces otros hacks o modificaciones interesantes, háznoslo saber en los comentarios. Gracias!

  • Síganos en Twitter o suscríbase a Nettuts + RSS Feed para obtener los mejores tutoriales de desarrollo web en la web. Listo

¿Listo para llevar sus habilidades al siguiente nivel y comenzar a beneficiarse de sus scripts y componentes? Echa un vistazo a nuestro mercado hermano, CodeCanyon.