Hook_init () hala kullanılıyor mu? Artık kullanılmıyorsa hook_init () kodunu nasıl dönüştürebilirim?


10

Drupal.org API üzerinde bakıldığında, bunu fark hook_init () değişiklik kayıtlarına baktığımızda Drupal 8. için belgelenen, buldum Bootstrap artık var kanca işaret, hepsi 'önyükleme' kancalar kurtulun , önyükleme kancalar olduğu söylenir hook_boot()ve hook_exit(); hakkında hiçbir şey söylenmez hook_init().

Drupal 8 kaynağında hook_init aradım ve aşağıdaki kodu buldum. Birincisi hook_init()bir yorumda yapılan atıftır ; diğer ikisi bir hook_init()uygulama gibi görünüyor , ama her ikisi de ben beklemiyorum bir parametre olsun.

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;
  }
}

Ben de herhangi bir işlev çağırmak için aradım hook_init()ama herhangi bir bulamadık.

Is hook_init()hala Drupal 8'de kullanılan? Artık kullanılmıyorsa, Drupal 7 kod uygulamasını nasıl dönüştürebilirim hook_init()?

Yanıtlar:


6

Belki de bu soru en son cevaplandığından beri bu değişti. Ancak, neler olup bittiğini değiştirmek için tercih edilen yaklaşımın hook_initbir etkinlik abonesi oluşturmak ve 'isteğe' eklemek olduğunu düşünüyorum. Yararlı bulabilecekler için bunu nasıl yapacağınız aşağıda açıklanmıştır.

Örnek services.yml

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

Sonra EventSubscriberInterface( src/EventSubscriberdizindeki yeni dosya ) uygulamak ve uygulanan yöntem getSubscribedEventsgibi bir şey yapabilirsiniz ...

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

Ve yöntemi buna göre ekleyin

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

İnitializeMyModule işlevinde ['#attached] [' js] nasıl kullanılır? SInce işlevde $ var, $ page ya da somether bağımsız değişkeni yoktur.
neha

@neha - Yapmazsın. Bu cevap, daha gelişmiş şeyler için kanca başlığının nasıl değiştirileceği ile ilgilidir. Ama kullandığınız kütüphaneleri bağlamak için hook_page_attachmentsveya hook_page_attachments_alter.
leymannx

5

Evet, hook_init()sen gerekiyorsa Drupal 8. kullanılmaz drupal_add_js()ya drupal_add_css()kullanabilirsiniz hook_page_build()yerine ( not : bu kanca Drupal 8.0.0-beta3 bkz olarak uzaklaştırıldı değişim kaydında ) da Drupal 7 bunun için faydalıdır.

Örneğin, CSS stilleri ve JavaScript kodu eklenebilir hook_page_build()kullanarak $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);

Oradaki istek / yanıt üzerinde daha karmaşık bir dinleme yapmanız gerekirse, kaldırılan hook_init () üzerinde belgelendiği gibi bir Drupal 8 tarzı çekirdek olay dinleyicisi tanımlayabilirsiniz .


4
Asla drupal_add_js / drupal_add_css kullanmamalısınız. Bu kısmı kaldırdım.

1
@chx, drupal_process_attachedayrıca sayfa gereksinimlerini eklemek için drupal_add_css / js kullanırcall_user_func('drupal_add_' . $type, $data, $options);
David Thomas

1
Evet ama drupal_process_attachedyangınlar sonrasında hale önbellek alınır. Bunu yaparsanız #attached, oluşturma önbelleği kullanılsa bile CSS / JS'niz eklenir.

2
Hook_page_build'in artık D8'de bir şey olmadığı anlaşılıyor?
digitgopher

4

hook_page_build () burada hook_page_attachments () değişiklik kaydı lehine kullanımdan kaldırılmıştır .

Misal:

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

kitaplık adı, modülünüzün mymodule.libraries.yml dosyasında tanımlanan kitaplığın adıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.