Le hook_init () est-il toujours utilisé? S'il n'est plus utilisé, comment convertir le code implémentant hook_init ()?


10

En regardant sur l'API Drupal.org, j'ai remarqué que hook_init () n'est pas documenté pour Drupal 8. En regardant les enregistrements de changement, j'ai trouvé que les crochets Bootstrap n'existent plus , ce qui indique de se débarrasser de tous les crochets «bootstrap» , où les crochets bootstrap sont censés être hook_boot()et hook_exit(); rien n'est dit hook_init().

J'ai recherché hook_init dans la source Drupal 8, et j'ai trouvé le code suivant. Le premier est une référence à hook_init()faite dans un commentaire; les deux autres semblent une hook_init()implémentation, mais ils obtiennent tous les deux un paramètre que je n'attends pas.

function overlay_enable() {
  if (strpos(current_path(), 'admin/modules') === 0) {
    // Flag for a redirect to <front>#overlay=admin/modules on hook_init().
    $_SESSION['overlay_enable_redirect'] = 1;
  }
}
/**
 * Implements hook_init().
 */
function phptemplate_init($template) {
  $file = dirname($template->filename) . '/' . $template->name . '.theme';
  if (file_exists($file)) {
    include_once DRUPAL_ROOT . '/' . $file;
  }
}
/**
 * Implements hook_init().
 */
function twig_init($template) {
  $file = dirname($template->filename) . '/' . $template->name . '.theme';
  if (file_exists($file)) {
    include_once DRUPAL_ROOT . '/' . $file;
  }
}

J'ai également cherché une fonction invoquée hook_init()mais je n'en ai pas trouvé.

Est hook_init()toujours utilisé dans Drupal 8? S'il n'est plus utilisé, comment convertir l'implémentation du code Drupal 7 hook_init()?

Réponses:


6

Peut-être que cela a changé depuis la dernière réponse à cette question. Mais je pense que l'approche préférée pour remplacer ce qui se passe hook_initest de créer un abonné à l'événement et d'ajouter à la «demande». Voici comment vous faites cela pour ceux qui pourraient le trouver utile.

Exemple services.yml

services:
  init_subscriber:
    class:   Drupal\mymodule\EventSubscriber\MyModuleSubscriber
    arguments: ['@current_user'] // <- optional args
    tags:
      - {name: event_subscriber} // <- Required Tag

Ensuite, vous implémenteriez le EventSubscriberInterface(nouveau fichier dans le src/EventSubscriberrépertoire) et dans la méthode implémentée, getSubscribedEventsvous pouvez faire quelque chose comme ...

/**
 * {@inheritdoc}
 */
public static function getSubscribedEvents() {
  $events[KernelEvents::REQUEST][] = array('initializeMyModule');
  return $events;
}

Et ajoutez la méthode en conséquence

/**
 * MyModule
 *
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 *   The event to process.
 */
public function initializeMyModule(GetResponseEvent $event) {
  $request = $event->getRequest();   
  ...
}

Comment utiliser ['#attached] [' js] dans la fonction initializeMyModule? Puisqu'il n'y a pas $ var, $ page ou autre argument dans la fonction.
neha

@neha - Non. Cette réponse permet de remplacer le crochet init pour des choses plus avancées. Mais pour attacher des bibliothèques que vous utilisez hook_page_attachmentsou hook_page_attachments_alter.
leymannx

5

Oui, hook_init()n'est pas utilisé dans Drupal 8. Si vous en avez besoin drupal_add_js()ou que drupal_add_css()vous pouvez utiliser à la hook_page_build()place ( remarque : ce crochet a été supprimé dans Drupal 8.0.0-beta3, voir l' enregistrement des modifications ), ce qui est également utile pour cela dans Drupal 7.

Par exemple, des styles CSS et du code JavaScript peuvent être ajoutés à l' hook_page_build()utilisation $page['#attached'].

 $path = drupal_get_path('module', 'MY_MODULE');
 $page['#attached']['js'][$path . '/my_module.js'] = array('scope' => 'footer');
 $page['#attached']['css'][$path . '/my_module.base.css'] = array('every_page' => TRUE);

Si vous avez besoin de faire une écoute plus complexe sur la demande / réponse, vous pouvez définir un écouteur d'événement de noyau de style Drupal 8 comme indiqué sur hook_init () supprimé .


4
Vous ne devriez jamais utiliser drupal_add_js / drupal_add_css - même dans Drupal 7, il vaut mieux les éviter - mieux utiliser #attached. J'ai supprimé cette partie.

1
@chx, drupal_process_attachedutilise également drupal_add_css / js pour ajouter les éléments requis pour la page danscall_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
Oui, mais se drupal_process_attacheddéclenche après la récupération du cache de rendu. Si vous le faites, #attachedvotre CSS / JS sera ajouté même lorsque le cache de rendu est utilisé.

2
Apparaît que hook_page_build n'est plus rien dans D8?
digitgopher

4

hook_page_build () est déconseillé au profit de hook_page_attachments () change record ici .

Exemple:

function MYMODULE_page_attachments(array &$attachments) {
  $attachments ['#attached']['library'][] = 'modulename/libraryname';
}

nom_bibliothèques est le nom de la bibliothèque, défini dans le module mymodule.libraries.yml de votre module

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.