2011-02-14 12 views
33

¿Es posible crear su propio gancho en un módulo Drupal para que otros módulos de Drupal consuman? De lo contrario, ¿existe un mecanismo en Drupal para que los desarrolladores de terceros proporcionen anzuelos? Si todo ha sido un no hasta ahora, ¿dónde está la lista de ganchos implementada?¿Puedes crear tu propio gancho en Drupal?

Según entiendo las cosas, los módulos de Drupal funcionan en un evento como el sistema llamado hooks. Cuando crea un nuevo módulo, crea funciones que implementan un gancho. Por ejemplo, hay un gancho hook_delete. Si implementa una función en su módulo

function mymodule_delete($node) 
{ 
} 

se llamará a esta función cada vez que se elimine un nodo.

Lo que quiero saber es, ¿hay alguna manera o yo, como desarrollador de un módulo de terceros, para crear mis propios ganchos. Digamos, algo así como hook_alanskickbutthook para que otros desarrolladores de módulos puedan suscribirse a este enlace.

Si esto es posible, ¿cómo lo hace? He revisado los documentos oficiales y no he encontrado mucho allí, y todavía me mareo un poco cuando empiezo a hurgar en el código fuente de Drupal (entiendo la recursión, pero no dedico suficiente tiempo a pensar en problemas recursivos). Las soluciones completas son bienvenidas, pero estoy contento de que me apunten en la dirección correcta.

Respuesta

37

Module_invoke_all() es su boleto a la creación de sus propios ganchos:

ver el API:

http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all

y luego ver este gran valoración crítica:

http://web.archive.org/web/20101227170201/http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules

(Editar: estaba en http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules pero esto ya no está)

Una vez que haya hecho su gancho, que se puede llamar en otro módulo usando:

/** 
* Implementation of hook_myhookname() 
*/ 

function THISMODULENAME_myhookname(args){ 
    //do stuff 
} 
+0

En el tutorial que publicaste, ¿qué se llama la función "taxonomy_rockstar_generate_layouts"? (disculpas por la pregunta estilo novato. Soy lo suficientemente nuevo para Druapl que no puedo decir dónde pertenecen las cosas en el sistema). –

+0

editado arriba para mostrar cómo llamar a dicho gancho recién creado :) – jpstrikesback

+4

Algunas correcciones/tipps: a) $ args no es por referencia cuando se usa module_invoke_all(). b) Si desea pasar algo por referencia, use drupal_alter() (fuerza el sufijo _alter en el nombre del gancho) o module_implements + a loop y luego llame a las implementaciones directamente. c) La forma recomendada para documentar los ganchos está en un archivo yourmodule.api.php, vea el núcleo para ver ejemplos. d) Un patrón común en D7 al recopilar información si se usa un sufijo de información y también se llama a drupal_alter sobre eso. Ejemplo . – Berdir

0

si recuerdo ... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7

hace THS ayuda? Ha pasado un tiempo desde que me metí con Drupal.

Para crear/ofrecer un enganche personalizado de Drupal, debe implementarlo de tal manera que llamar al enganche con module_invoke o module_invoke_all no genere conflictos con otros enganches de módulos. El nombre del gancho debe ser único y debe ofrecer todas las características/específicas de una manera general que no requiera ningún tipo de ajuste con el código. Toda la configuración debe ir en las páginas de administración y debe almacenar esas configuraciones en una tabla separada o en cualquier tabla existente creada por Drupal o módulos de los que dependen sus módulos. El gancho debe ser fácil de implementar por otros módulos y no debe ser muy complicado de implementar. Cuando crea ganchos personalizados, su (s) módulo (s) actúa (n) como proveedor de API.

+0

Lo sentimos, ya has visto esto :) – Brian

6

Por ejemplo, supongamos que desea crear hook_my_custom_goodness() para que otros lo utilizan.Entonces sólo tiene que colocar el código como este en su módulo en el punto donde desea que el gancho suceda:

$variables['msg'] = 'foo'; 

// Make sure at least one module implements our hook. 
if (sizeof(module_implements('my_custom_goodness')) > 0) { 
    // Call modules that implement the hook, and let them change $variables. 
    $variables = module_invoke_all('my_custom_goodness', $variables); 
} 

drupal_set_message($variables['msg']); // Will display 'bar' instead. 

Ahora, si alguien quería utilizar su gancho, entonces podrían hacerlo en su propio módulo de la siguiente manera:

/** 
* Implements hook_my_custom_goodness(). 
*/ 
function SOME_OTHER_MODULE_my_custom_goodness($variables) { 
    $variables['msg'] = 'bar'; 
    return $variables; 
} 

Hay una explicación más completa aquí:

http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-modules

Cuestiones relacionadas