Чи все ще використовується kuka_init ()? Якщо він більше не використовується, як я перетворять код, що реалізує mock_init ()?


10

Переглядаючи API Drupal.org, я помітив, що kuk_init () не задокументовано для Drupal 8. Переглядаючи записи змін, я виявив, що гачки Bootstrap більше не існують , що вказує на позбавлення від усіх гачок 'bootstrap' , де гачки завантаження. як кажуть, є hook_boot()і hook_exit(); нічого не сказано hook_init().

Я шукав прив’язку_init у джерелі Drupal 8, і знайшов наступний код. Перший - це посилання на hook_init()коментар; інші два здаються hook_init()реалізацією, але вони обидва отримують параметр, якого я не очікую.

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

Я також шукав будь-яку функцію, яка викликала, hook_init()але не знайшла жодної.

Є чи до hook_init()цих пір використовується в Drupal 8? Якщо він більше не використовується, як конвертувати реалізацію коду Drupal 7 hook_init()?

Відповіді:


6

Можливо, це змінилося з часу останнього відповіді на це питання. Але я думаю, що кращим підходом до заміни того, що відбувається, hook_initє створення абонента події та додавання до "запиту". Ось як це зробити для тих, хто може вважати це корисним.

Приклад services.yml

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

Тоді ви б реалізували EventSubscriberInterface(новий файл у src/EventSubscriberкаталозі), і в реалізованому методі getSubscribedEventsви можете зробити щось на кшталт ...

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

І відповідно додати метод

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

Як використовувати ['#attached] [' js] у функції InitializeMyModule? Оскільки у функції немає $ var, $ page чи іншого аргументу.
неха

@neha - Ти цього не робиш. Ця відповідь справляється з тим, як замінити гачок-ініт на більш досконалі речі. Але для приєднання бібліотек ви використовуєте hook_page_attachmentsабо hook_page_attachments_alter.
leymannx

5

Так, hook_init()не використовується в Drupal 8. Якщо вам потрібно drupal_add_js()або drupal_add_css()ви можете використовувати hook_page_build()натомість ( зверніть увагу : цей гачок був видалений у Drupal 8.0.0-beta3, див. Запис змін ), що також корисно для цього в Drupal 7.

Наприклад, для hook_page_build()використання можна додати стилі CSS та код JavaScript $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);

Якщо вам потрібно зробити більш складне прослуховування на запит / відповідь там, ви можете визначити слухача подій ядра в стилі Drupal 8 як задокументовано на вилученому_ук () .


4
Ніколи не слід використовувати drupal_add_js / drupal_add_css - навіть у Drupal 7 їх краще уникати - краще використовувати #attached. Я зняв цю частину.

1
@chx, drupal_process_attachedтакож використовує drupal_add_css / js для додавання реквізитів сторінкиcall_user_func('drupal_add_' . $type, $data, $options);
Девід Томас

1
Так, але drupal_process_attachedзапускається після вилучення кешу візуалізації. Якщо ви це зробите, #attachedто ваш CSS / JS буде доданий навіть при використанні кешу візуалізації.

2
Здається, що mower_page_build вже не є предметом D8?
Digiggopher

4

hook_page_build () є застарілим на користь hook_page_attachments () зміна запису тут .

Приклад:

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

ім'я бібліотеки - це ім'я бібліотеки, визначене в mymodule.libraries.yml вашого модуля

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.