Reemplazar y extender librerías de CodeIgniter

  • Por
  • PHP
Cómo reemplazar el código por completo de las librerías de CodeIgniter y cómo extenderlo con nuevas funcionalidades.
Ya llevamos varios artículos del Manual de CodeIgniter en los que estamos haciendo un segumiento exhaustivo sobre todas las posibilidades de creación de nuestras propias librerías personalizadas en este framework PHP. En artículos anteriores vimos muchas cosas sobre cómo crear nuestras propias librerías, pero en poco tiempo podremos encontrarnos con mayores necesidades.

Desarrolladores un poco más avanzados desearán en algún momento mejorar o cambiar algo en las librerías nativas de CodeIgniter. Esto es perfectamente posible en este framework PHP y para ello han puesto a nuestra disposición dos maneras de actuar:

  • Reemplazar código de una librería nativa por otro totalmente nuevo
  • Extender el código de una librería nativa

Reemplazar el código de una librería con tu propia versión

En el momento de escribir este artículo en CodeIgniter podemos reemplazar el código de cualquier librería excepto la de trabajo con bases de datos "Database". Esto lo podemos hacer simplemente haciendo una librería que tenga el mismo nombre que la librería que pretendemos reemplazar.

La guardaremos en el directorio de nuestras propias librerías: system/application/libraries y le damos el nombre de la librería que queremos sustituir. Por ejemplo, si queremos reemplazar la librería Calendar, guardaríamos nuestro archivo como "Calendar.php".

El nuevo código de la librería sería el que nosotros queramos, sólo tenemos que respetar el nombre de la librería 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: Fíjate que la mayoría de librerías nativas de CodeIgniter tienen el prefijo "CI_". Este prefijo sólo lo tienes que utilizar en el nombre de la clase.

Ahora, cuando carguemos la librería nativa Calendar en realidad se estará cargando el código que hemos definido nosotros en esa nueva clase.

$this->load->library('calendar');
$this->calendar->algo();
//$this->calendar->generate(); daría error, pues ya no existe ese método.

Extender las librerías nativas de CodeIgniter

Ahora vamos a ver un caso si cabe más probable. Imagina que quieras quieras que permanezca la funcionalidad de una librería y agregarle un par de funciones. Para esto no necesitas reemplazar el código completo de esa librería, sino simplemente extenderla con algunas funciones propias que solventen tus necesidades particulares.

El proceso es bastante parecido al de reemplazar por completo el código de la librería, excepto por un par de cosas:

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

Este sería el código para extender la libería Calendar.

class MY_Calendar extends CI_Calendar {

}

Tendríamos que guardar ese archivo en el directorio de las librerías (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 construcción de la clase parent.
class MY_Calendar extends CI_Calendar {

   function My_Calendar(){
      parent::CI_Calendar();
   }
}

La carga de la clase de la librería extendida se hace igual que para la librería original, sin utilizar el prefijo "MY_". A partir de entonces tendrás la clase original más 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 configuración $config['subclass_prefix'].

Con esto ya hemos aprendido todo lo que debíamos conocer acerca de crear tus librerías con CodeIgniter y extender o reemplazar las existentes. Más adelante conoceremos cómo extender o reemplazar las clases del núcleo de CodeIgniter, como pueden ser Controller, Config...

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Juan

16/7/2010
Buen Articulo
Muy bien tutorial en esta pagina lo implementarea gracias
sencillosanuncios.22web.net/modulo_lista_anuncios_eviaremails/index.php?direccion=http://sencillosanuncios.22web.net/modulo_lista_anuncios_eviaremails/&refresco=1

israelpg

19/8/2012
No me carga el método de la librería extendida
Extendiendo la librería Calendar.php pero al llamar desde un controlador al método de esta en la clase extendida, me da error de método no definido.

Código de la librería extendida: (sólo quiero mostrar una fecha, algo simple)

class MY_Calendar extends CI_Calendar {

function prueba($fecha){
echo $fecha;
}

}

israelpg

20/8/2012
Me contesto a mí mismo
Pues la solución ha sido sencilla. Resulta que el archivo de mi librería extendida lo copiaba en la carpeta: system/libraries (junto a las nativas) en lugar de donde realmente toca: application/libraries

Ahora ya me voy a acordar para siempre, que bueno es practicar las cosas.

Un saludo y gracias por el manual, es genial, como todos los que sigo aquí.