Nici hook_cache_flush()
nici hook_rebuild()
implementarea poate adăuga direct cod JavaScript la o pagină, pur și simplu pentru faptul că nu primesc nicio matrice de randare ca argument și nici nu returnează o matrice de randare la funcția/metoda care le invocă.
Puteți adăuga un handler de trimitere a formularelor la setări_performanță_sistem formular pentru când Ștergeți toate cache-urile se face clic pe butonul de pe formularul respectiv. Acest lucru nu va funcționa atunci când memoria cache este șters folosind alte metode, de exemplu printr-un modul care apelează drupal_flush_all_caches()
în codul său.
// Pune următoarea linie în partea de sus a fișierului care conține acest cod.
utilizați Drupal\Core\Form\FormStateInterface;
funcția mymodule_form_system_performance_settings_alter(&$form, FormStateInterface $form_state) {
if (isset($form['clear_cache']['clear'])) {
dacă ($form_state->getTemporaryValue('mymodule_cache_cleared')) {
$form['#attached']['library'][] = 'mymodule/cache.rebuild';
}
$form['clear_cache']['clear']['#submit'][] = 'mymodule_system_performance_settings_submit';
}
}
funcția mymodule_system_performance_settings_submit(matrice &$form, FormStateInterface $form_state) {
$form_state->setRebuild();
$form_state->setTemporaryValue('mymodule_cache_cleared', TRUE);
}
Pentru o soluție care funcționează în toate cazurile drupal_flush_all_caches()
este apelat și adaugă codul JavaScript la prima pagină solicitată după ștergerea cache-ului, aș implementa hook_cache_flush()
pentru a seta o valoare care este apoi înregistrată hook_page_attachments()
.
funcția mymodule_cache_flush() {
\Drupal::state()->set('mymodule_cache_cleared', TRUE);
}
funcția mymodule_page_attachments(array &$attachments) {
$state = \Drupal::state();
if ($state->get('mymodule_cache_cleared')) {
// Ștergeți valoarea stării pentru a evita adăugarea bibliotecii
// fiecare pagină după golirea memoriei cache.
$state->delete('mymodule_cache_cleared');
$attachments['#attached']['library'][] = 'mymodule/cache.rebuild';
}
}
Pentru a adăuga codul JavaScript la primul X paginile solicitate după ștergerea cache-ului, aș folosi următoarele implementări de cârlig. (Următorul cod atașează biblioteca la primele trei solicitări de pagini.)
funcția mymodule_cache_flush() {
\Drupal::state()->set('mymodule_cache_cleared_count', 3);
}
funcția mymodule_page_attachments(array &$attachments) {
$state = \Drupal::state();
dacă ($număr = $state->get('mymodule_cache_cleared_count')) {
$attachments['#attached']['library'][] = 'mymodule/cache.rebuild';
$state->set('mymodule_cache_cleared_count', $count - 1);
}
}
obisnuiam \Drupal::state()->get()
și \Drupal::state()->set()
deoarece:
Valoarea stabilită cu drupal_static()
nu va fi păstrat între solicitările de pagină. Pagina de documentație spune clar:
Toate funcțiile care necesită o variabilă statică pentru a persista sau a stoca în cache datele într-o singură pagină de solicitare sunt încurajați să folosească această funcție, cu excepția cazului în care este absolut sigur că variabila statică nu va trebui să fie resetată în timpul solicitării paginii.
Setarea unei valori de sesiune, fiecare utilizator va primi o valoare diferită. Aceasta înseamnă că codul JavaScript va fi adăugat la următoarea pagină solicitată după ștergerea memoriei cache numai atunci când acea pagină este solicitată de la același utilizator care a fost conectat când memoria cache a fost șters.
Adăugați JavaScript la tema sau modulul dvs arată cum este definită o bibliotecă JavaScript dintr-un modul.