Creare hook_personalizzato

6 contenuti / 0 new
Ultimo contenuto
Creare hook_personalizzato

Salve a tutti,
al momento non è una cosa essenziale ma mi chiedevo come fosse possibile creare un "nuovo Hook" per drupal. Chiarisco per chi magari non mi ha capito, ho un modulo che fa determinate cose, sarebbe utile attraverso un particolare hook poter dare l'opportunità ad altri moduli di sfruttare sue funzioni integrando negli altri moduli un hook che permetta per esempio di aggiungere dinamicamente un 'informazione nel modulo in questione...

ho cercato un po' ma non ho trovato gran chè, solitamente se non trovo qualche cosa è solo perchè sbaglio nella ricerca quindi se riuscite a damri qualche dritta su come realizzare nuovi hook sarebbe di grande aiuto...

Views2 è un buon esempio di hook aggiunti non-Drupal. Vedi http://drupalcontrib.org/api/group/views_hooks/6, e poi il codice views/views.module, riga 530 circa:

/**
* Get a list of modules that support the current views API.
*/
function views_get_module_apis() {
  static $cache = NULL;
  if (!isset($cache)) {
    $cache = array();
    foreach (module_implements('views_api') as $module) { // <= module_implements fa tutto il vero lavoro...
      $function = $module . '_views_api';
      $info = $function(); //  <= chiama il hook - per raccogliere altri info in questo esempio
      if (isset($info['api']) && $info['api'] == 2.000) {
        if (!isset($info['path'])) {
          $info['path'] = drupal_get_path('module', $module);
        }
        $cache[$module] = $info;
      }
    }
  }
  return $cache;
}

Probabilmente puoi trovare altri esempi cercando (grepando) "module_implements" al di fuori del core di Drupal

John

Più imparo, più dubito.

Grazie jOhn :D
come al solito dai consigli utili, comincerò da subito cercare nell'implementazione degli hook di Views2.
Thanks
ti tengo aggiornato su nuovi sviluppi in merito

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

jhl.verona wrote:

<?php
/**
 * Get a list of modules that support the current views API.
 */
function views_get_module_apis() { // <= tra l'altro questo non è un Hook, ma è una funzione che viene chiamata in un determinato momento e fà un check di quale modulo ha implementato l'hook in questione
 
static $cache = NULL;
  if (!isset(
$cache)) {
   
$cache = array();
    foreach (
module_implements('views_api') as $module) { // <= module_implements fa tutto il vero lavoro... confermo.
     
$function = $module . '_views_api'; // <=  Hook_NOMEHook ovvero nameModule_NameHook ....
     
$info = $function(); //  <= chiama il hook - per raccogliere altri info in questo esempio, e lo farà per ogni MODULO
     
if (isset($info['api']) && $info['api'] == 2.000) {
        if (!isset(
$info['path'])) {
         
$info['path'] = drupal_get_path('module', $module);
        }
       
$cache[$module] = $info;
      }
    }
  }
  return
$cache;
}
?>

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Esatto views_get_module_apis() e una funzione che chiama ogni modulo che implementa hook_views_api. E se vuolevi passare dei parametri all'implementazione del hook basta cambiare la riga $info = $function(); in $info = $function($param1, $param2);. Vedi questo codice in modules/node.module, riga 657:

/**
* Invoke a hook_nodeapi() operation in all modules.
*
* @param &$node
*   A node object.
* @param $op
*   A string containing the name of the nodeapi operation.
* @param $a3, $a4
*   Arguments to pass on to the hook, after the $node and $op arguments.
* @return
*   The returned value of the invoked hooks.
*/
function node_invoke_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  $return = array();
  foreach (module_implements('nodeapi') as $name) {
    $function = $name .'_nodeapi';
    $result = $function($node, $op, $a3, $a4); // <= chiamata con parametri
    if (isset($result) && is_array($result)) {
      $return = array_merge($return, $result);
    }
    else if (isset($result)) {
      $return[] = $result;
    }
  }
  return $return;
}

Più imparo, più dubito.

aggiungerei anche

  • module_invoke_all()
  • module_invoke()

che è un pò più pulito di come fa le cose nell'hook views (ma solo perchè li hanno esigenze un pò particolari). Inoltre non so se è una cosa conveniente avere un hook che dichiari che ci si interfaccia con il tuo modulo e poi gli hook che fanno lo sporco lavoro, nel caso di views (o comunque di moduli che devono includere file esterni) non ci sono altre strade, ma se il tuo modulo non richiede questo non è necessario (e IMHO anche sconsigliato).

Ciao
Marco
--
My blog
Working at @agavee