Hero

Como cargar Clase PHP dentro de un modulo personalizado en Drupal 7

Marzo 22, 2013

kenneth
Drupal
Desarrollo de Modulos

El paradigma de programación orientada a objectos esta disponible en PHP a partir de la versión 5, para las personas que están acostumbradas a trabajar bajo este paradigma también lo pueden tener disponible mientras utilizan Drupal 7. Algunas de las preguntas mas frecuentes son:

  • ¿Que nombre utilizar para mi clase?
  • ¿Donde colocar mi clase?
  • ¿Como tener acceso a mi clase dentro de los módulos?
  • ¿Como definir y utilizar mi clase?

Contestare estas preguntas con una recomendación. Asumiendo que deseamos crear una clase para crear recordatorios dentro de un modulo personalizado que llamaremos ‘generador_recordatorios’, mostrare un ejemplo sencillo de como cargar nuestra clase PHP y tener acceso a esta dentro de nuestro módulo personalizado.

  1. ¿Que nombre utilizar para mi clase?

Como dice la documentación de PHP, en el manual de ‘Clases y Objetos’ la sección ‘Lo Básico’ podemos utilizar cualquier nombre de etiqueta valida para nombrar la clase.

Ahora bien teniendo presente que en Drupal existen muchos módulos contribuidos que pudiéramos utilizar y estos pueden contener definidas clases. Por tanto ser recomienda agregar a nuestra clase un prefijo que permita diferenciar las clases y de está forma evitar conflictos con algún otro modulo contribuido que utilice un nombre de clase igual.

Por ejemplo podemos pensar en crear la clase llamada ‘Recordatorio’ y que en nuestro módulo personalizado tendrá cierta lógica implementada, sin embargo puede ser que en algún otro modulo exista una clase llamada ‘Recordatorio’ que encapsula otra lógica y esto generara un conflicto por llamarse igual.

Por este motivo llamaremos nuestra clase ‘CreadorRecordatorio’; tengamos en mente que podemos utilizar cualquier prefijo que nos ayude a definir un nombre inequívoco para nuestra clase y evitar que tener un conflicto a futuro.

  1. ¿Donde colocar mi clase?

Podríamos almacenar nuestras clases en cualquier parte de nuestro módulo, sin embargo recomendamos guardarlas dentro de una carpeta llamada includes y allí es donde podremos almacenar nuestros archivos *.php que contengan las clases personalizadas.

En PHP no existe una regla magna de como llamar a los archivos que tienen definidas las clases, sin embargo para que lograr diferenciarlos les podemos colocar la terminación *.class.php y si se tratara de una clase abstracta o una interface podríamos utilizar las terminaciones *.abstract.php e *.interface.php respectivamente según sea el caso.

  1. ¿Como tener acceso a mis clases dentro de los modulos?

Ahora bien para que nuestra clase este accesible en todo nuestro modulo lo definiremos en el archivo *.info de la siguiente manera:

<pre title="Definir archivo *.info">; $Id$
name = "Generador de recordatorios"
description = "Permite definir recordatorios."
package = Personalizado
core = 7.x

files[] = includes/CreadorRecordatorio.class.php

En la ultima linea agregamos al arreglo “files” la dirección de donde encontrar nuestra clase y que Drupal pueda cargarla en nuestro modulo, permitiéndonos poder hacer uso de ella, si nuestro modulo ya fue creado con anterioridad de igual forma lo definimos en el archivo *.info y luego de eso limpiamos la cache, luego de eso podemos tener acceso a la clase.

  1. ¿Como definir y utilizar mi clase?

Ahora bien, nuestro archivo donde esta definido la clase se podría ver de la siguiente forma:

<pre title="Definicion de clase CreadorRecordatorio"><?php

class CreadorRecordatorio {

 public function __construct() {
 
 }

}

Una vez creada nuestra clase y definida en el archivo *.info podemos tener acceso a nuestra clase dentro de cualquier función que definiéramos dentro o fuera de nuestro módulo, en este ejemplo lo veremos dentro del hook_init(), en esta implementación utilizaremos el metodo class_exists que nos proporciona PHP para saber si podemos hacer uso de dicha clase.

<pre title="Implementacion del hook_init()">function generador_recordatorios_init(){

 if(class_exists('CreadorRecordatorio')){
 watchdog('generador_redodatorios', 'Clase CreadorRecordatorio cargada, new CreadorRecordatorio(): ' . dpr(new CreadorRecordatorio(), 1));
 }
 else{
 watchdog('generador_redodatorios', 'Clase CreadorRecordatorio NO cargada');
 }

}

Cabe recordar que esta verificación la estamos haciendo únicamente en este “hook” para saber si hemos realizado bien el proceso de cargar nuestra clase, y que eventualmente podemos tener acceso a ella sin realizar dicha verificación, pudiendo instanciar nuevos objetos de nuestra clase por medio del operador ’new’ (Utilizando new CreadorRecordatorio()).

Espero que les haya sido de mucha ayuda y de esta manera puedan trabajar en parte bajo el paradigma de programacion oriendata a objectos en nuestros proyectos con Drupal,

Saludos,

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.