Mayor control sobre el orden en que corren los hooks y módulos de Drupal

Si llevas algún tiempo desarrollando en Drupal sabes que el orden en que corren los módulos de tu instalación depende del valor del campo weight en la tabla system. Puedes modificar esta tabla desde un archivo install para lograr que tu módulo corra exactamente cuando lo necesitas. Esto es lo que hace community tags para trabajar después de tagadelic y es el método que usé para ejecutar código de form_alter después de todo lo demás cuando necesité modificar formularios de eventos.

Pero cambiar el valor de weight para un módulo afecta a todos los hooks en él. ¿Qué sucede si necesitas controlar el orden de ejecución para cada hook en cada módulo? Esto es exactamente lo que necesitaba para correr algunas operaciones nodeapi en un módulo antes de event_nodeapi y cambios en form_alter, en el mismo módulo, después de event_form_alter. Aunque no lo creas, es posible que algún día necesites algo así (a menos que optes por una solución corriendo dos módulos, uno antes y el otro después).

Esta idea me inspiró a escribir código para reemplazar las operaciones de event_nodeapi una por una. Ahora puedo ejecutar load y view desde event_nodeapi y reemplazar insert y update con mi módulo.

El concepto es muy simple. Añadí una tabla event_nodeapi_overriders con dos campos: module y op. Mi modulo usa un archivo install para insertar valores en la tabla. Si quiero que mimodulo reemplace las operaciones insert y update en event_nodeapi debo insertar los siguientes pares de module/op en la tabla: mimodulo/insert y mimodulo/update.

Luego algunos campos de selección leen los valores de event_nodeapi_overriders y los muestran en la página de configuración de event para definir que módulos deben reemplazar que operaciones en event_nodeapi. Y finalmente algunas condiciones con variable_get() en event_nodeapi y mimodule_nodeapi me permiten decidir que código correr.

Talvez este concepto se pueda extender para eventualmente contar con una matriz de todos los hooks en todos los módulos o un parámetro hook_weight que permita a los desarrolladores decidir el orden de ejecución de cada hook en cada módulo. O talvez sea demasiado trabajo adicional para Drupal.

En todo caso, esto fue parte de un experimento y aunque luego de hablar con Gerhard decidimos que lo mejor era usar Form API para procesar el envío de eventos, talvez la idea de tener mayor control sobre el orden de ejecución de hooks merezca mayor análisis en la comunidad Drupal en el futuro.

Trackback URL for this post:

http://ventanazul.com/trackback/94

Drupal en 15 gotas y Teletrabajo Hoy, obtén ya la oferta de primavera.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h1> <h2> <h3> <h4>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato