Creación de Librerias
Cuando usamos el termino "Librerias" normalmente nos referimos a las clases que se localizan en el directorio libraries y descriptas en la Referencia de Clases de su Guia de Usuario. En este caso, sin embargo, en lugar de ello describiremos como puede crear sus propias librerias dentro del directorio application/libraries con el fin de mantener la separación entre sus recursos locales y los recursos del marco de trabajo global.
Como un agregado extra, CodeIgniter permite extender sus clases nativas a sus librerias si simplemente necesita agregar alguna funcionalidad a una libreria existente. O puede incluso sustituir a las librerias nativas colocando nombres idénticos de versiones en su carpeta application/libraries.
En Resumen:
- Puede crear librerias totalmente nuevas.
- Puede extender librerias nativas.
- Puede reemplazar librerias nativas.
La siguiente página explica estos tres conceptos en detalle.
Nota: Las clases de Base de Datos no pueden ser extendidas o reemplazadas con sus propias clases, ni puede la clase Loader en PHP 4. Todas las otras clases estan habilitadas para ser reemplazadas/extendidas.
Almacenamiento
Su libreria de clases debe almacenarce dentro de su carpeta application/libraries, pues es allí donde CodeIgniter las buscará cuando sean inicializadas.
Convenciones de Nombre
- Los nombres de archivos deben ser capitalizados. Por ejemplo: Myclass.php
- Las declaraciones de clases deben ser capitalizadas. Por ejemplo: class Myclass
- Los nombre de las clases y los nombres del archivo deben coincidir.
El Archivo de Clase
Las clases deben tener este prototipo básico (Nota: Estamos utilizando el nombre Someclass puramente como un ejemplo):
<?php if (!defined('BASEPATH')) exit('No permitir el acceso directo al script');
class Someclass {
function some_function()
{
}
}
?>
Usando Su Clase
Desde cualquiera de sus funciones de Controller puede inicializar su clases utilizando el estándar:
$this->load->library('someclass');
Donde someclass es el nombre del archivo, sin la extensión ".php" del archivo. Puede enviar el nombre del archivo en mayúscula o minúscula. A CodeIgniter no le importa.
Una vez cargado puede acceder a su clase utilizando la versión en minúsculas:
$this->someclass->some_function(); // Las instancias de objetos serán siempre en minúsculas
Pasando Parámetros Cuando Inicializa Su Clase
En la función que carga la libreria puede pasar dinámicamente datos a travéz del segundo parámetro y ellos serán pasados a su constructor de clase:
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);
Si utiliza esta función debe configurar su constructor de la clase para esperar los datos:
<?php if (!defined('BASEPATH')) exit('No permitir el acceso directo al script');
class Someclass {
function Someclass($params)
{
// Hacer algo con $params
}
}
?>
También puede pasar parámetros almacenados en un archivo de configuración. Simplemente cree un archivo de configuración que se llame igual al nombre del archivo de la clase y almacénelo en su carpeta application/config/. Tenga en cuenta que si pasa el dinámicamente los parámetros descritos anteriormente, la opción en el archivo de configuración no estará disponible.
Utilizando los Recursos de CodeIgniter dentro de su Libreria
Para acceder a los recursos nativos de CodeIgniter dentro de su libreria use la función get_instance(). Esta función retorna el objeto super de CodeIgniter.
Normalmente desde sus funciones del controlador llamará a cualquiera de las funciones habilitadas en CodeIgniter usando el constructor $this:
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.
$this, sin embargo, sólo trabaja directamente dentro de sus controladores, sus modelos, o sus vistas. Si desea utilizar las clases de CodeIgniter dentro de sus propias clases puede hacerlo de la siguiente manera:
Primero, asigne el objeto de CodeIgniter a una variable:
$CI =& get_instance();
Una vez que se ha asignado el objeto a una variable, va a utilizar esa variable en lugar de $this:
$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.
Nota: Se dará cuenta de que la anterior función get_instance() esta siendo pasada por referencia:
$CI =& get_instance();
Esto es muy importante. La asignación por referencia le permite utilizar el objeto original de CodeIgniter en lugar de crear una copia del mismo.
Además, tenga en cuenta: Si está corriendo PHP 4 es usualmente mejor evitar que se hagan llamadas a get_instance() dentro de sus constructores de clase.
PHP 4 tiene problemas de referencias al objeto super CI dentro de los constructores de la aplicación ya que los objetos no existen hasta que la clase es totalmente instanciada.
Reemplazando Librerias Nativas con Sus Versiones
Simplemente por asignar un nombre a sus archivos de clase idéntico a una libreria nativa causará que CodeIgniter los utilice en lugar de los nativos. Para usar esta característica debe nombrar el archivo y la declaración de la clase exactamente como la libreria nativa. Por ejemplo, para reemplazar la libreria nativa Email deberá crear un archivo llamado application/libraries/Email.php, y declarar su clase con:
class CI_Email {
}
Tenga en cuenta que la mayoría de las clases son con prefijo CI_.
Para cargar su libreria puede ver la función de carga estándar:
$this->load->library('email');
Nota: En este momento las clases de base de datos no puede ser reemplazadas con sus propias versiones.
Extendiendo las Librerias Nativas
Si todo lo que necesita hacer es añadir alguna funcionalidad a una libreria existente - quizás añadir una función o dos - entonces es excesivo sustituir toda la libreria con su versión. En este caso es mejor simplemente extender la clase. La extensión de una clase es casi igual que la sustitución de una clase con un par de excepciones:
- La declaración de la clase debe extender la clase padre.
- Su nuevo nombre de la clase y el nombre del archivo se debe prefijar con MY_ (Este tema es configurable. Véase a continuación.).
Por ejemplo, para extender la clase nativa Email deberá crear un archivo llamado application/libraries/MY_Email.php, y declarar su clase con:
class MY_Email extends CI_Email {
}
Nota: Si necesita utilizar un constructor en su clase, asegúrese de extender el padre constructor:
class MY_Email extends CI_Email {
function My_Email()
{
parent::CI_Email();
}
}
Cargando Su Sub-Clase
Para cargar su sub-clase debe usar la sintaxis estándar que normalmente se utiliza. NO incluya su prefijo. Por ejemplo, para cargar el ejemplo anterior, que extiende la clase Email, se utiliza:
$this->load->library('email');
Una vez cargado se utiliza la variable de clase como siempre lo ha hecho para la clase de la que se extiende. En el caso de la clase Email utilizaremos todas las llamadas:
$this->email->some_function();
Estableciendo Su Propio Prefijo
Para establecer su propio prefijo de sub-clase, abra su application/config/config.php y busque este tema:
$config['subclass_prefix'] = 'MY_';
Tenga en cuenta que todas las librerias nativas de CodeIgniter están prefijadas con CI_ NO USE esto como su prefijo.