sábado, 16 de febrero de 2008

Lo primero que hay que saber

El objeto que se instancia como controlador, tiene referencias a todas las instancias de librerías y modelos que hayan cargadas como un atributo del mismo nombre de la clase.
Así, si cargamos la librería Email, tenemos que $this->email es una instancia de la clase Email.

El tema no termina ahí. Cada modelo, también, tiene esos mismos atributos cargados, entonces el código que tenemos en el controlador y en el módelo es similar, ya que accedemos a los mismos atributos. Entonces, si hacemos cierto código en el controlador y nos parece que es muy general y lo podemos necesitar en otro, es fácil pasarlo a un modelo.

Pero... ¿Qué pasa si estamos en una librería?
A las librerías no se les cargan los atributos, pero pueden necesitar acceso a otra librería, o a un modelo. Para eso, podemos acceder a la instancia del controlador a través de la función "get_instance".
Por ejemplo, dentro de la clase Email queremos validar el mail con el método valid_email de la clase de Validación. Entonces:

function valid_email($address)
{
// (El & es importante para no crear una copia en PHP 4)
$CI =& get_instance();

// Si no está cargada la librería, la cargamos nosotros
if (!isset($CI->validation))
{
$CI->load->library('validation');
}

// Llamamos al método
return $CI->validation->valid_email($address);
}

Simple, no?

Igualmente, esto sigue...
¿Qué pasa si en la vista, queremos acceder a una librería o modelo, por ejemplo, a la de validación para recuperar los mensajes?

Las views también pueden acceder como $this->validation al mismo objeto que el controlador o los modelos.
Internamente, esto se logra asignandole estas instancias a la clase Loader, donde se cargan las vistas.

No hay comentarios: