Ни один hook_cache_flush()
ни hook_rebuild()
Реализация может напрямую добавлять код JavaScript на страницу просто потому, что они не получают никакого массива рендеринга в качестве аргумента и не возвращают массив рендеринга вызывающей их функции/методу.
Вы можете добавить обработчик отправки формы в system_performance_settings форма, когда Очистить все кеши кнопка на этой форме нажата. Это не сработает, если кеш очищается другими методами, например модулем, который вызывает drupal_flush_all_caches()
в его коде.
// Поместите следующую строку в начало файла, содержащего этот код.
используйте Drupal\Core\Form\FormStateInterface;
функция mymodule_form_system_performance_settings_alter(&$form, FormStateInterface $form_state) {
если (isset($form['clear_cache']['clear'])) {
если ($form_state->getTemporaryValue('mymodule_cache_cleared')) {
$form['#attached']['library'][] = 'mymodule/cache.rebuild';
}
$form['clear_cache']['clear']['#submit'][] = 'mymodule_system_performance_settings_submit';
}
}
function mymodule_system_performance_settings_submit (массив и $ форма, FormStateInterface $ form_state) {
$form_state->setRebuild();
$form_state->setTemporaryValue('mymodule_cache_cleared', TRUE);
}
Для решения, которое работает во всех случаях drupal_flush_all_caches()
вызывается и добавляет код JavaScript на первую запрошенную страницу после очистки кеша, я бы реализовал hook_cache_flush()
чтобы установить значение, которое затем проверяется hook_page_attachments()
.
функция mymodule_cache_flush() {
\Drupal::state()->set('mymodule_cache_cleared', TRUE);
}
функция mymodule_page_attachments (массив и $ вложения) {
$state = \Drupal::state();
если ($state->get('mymodule_cache_cleared')) {
// Удаляем значение состояния, чтобы избежать добавления библиотеки в
// каждую страницу после очистки кеша.
$state->delete('mymodule_cache_cleared');
$attachments['#attached']['library'][] = 'mymodule/cache.rebuild';
}
}
Чтобы добавить код JavaScript в первый Икс страницы, запрошенные после очистки кеша, я бы использовал следующие реализации ловушек. (Следующий код прикрепляет библиотеку к первым трем запросам страниц.)
функция mymodule_cache_flush() {
\Drupal::state()->set('mymodule_cache_cleared_count', 3);
}
функция mymodule_page_attachments (массив и $ вложения) {
$state = \Drupal::state();
если ($ count = $state->get('mymodule_cache_cleared_count')) {
$attachments['#attached']['library'][] = 'mymodule/cache.rebuild';
$state->set('mymodule_cache_cleared_count', $count - 1);
}
}
я использовал \Drupal::state()->получить()
и \Drupal::state()->set()
так как:
Значение, установленное с друпал_статический()
не будет сохраняться между запросами страниц. На странице документации четко сказано:
Все функции, требующие статической переменной для сохранения или кэширования данных в рамках одного запроса страницы рекомендуется использовать эту функцию, если нет абсолютной уверенности в том, что статическую переменную не нужно сбрасывать во время запроса страницы.
Установив значение сеанса, каждый пользователь получит свое значение. Это означает, что код JavaScript будет добавлен к следующей запрошенной странице после очистки кеша только тогда, когда эта страница запрашивается от того же пользователя, который вошел в систему, когда кеш был очищен.
Добавьте JavaScript в свою тему или модуль показывает, как библиотека JavaScript определяется из модуля.