Không hook_cache_flush()
cũng không hook_rebuild()
việc triển khai có thể trực tiếp thêm mã JavaScript vào một trang, đơn giản vì thực tế là chúng không lấy bất kỳ mảng kết xuất nào làm đối số, cũng như không trả về mảng kết xuất cho hàm/phương thức gọi chúng.
Bạn có thể thêm trình xử lý gửi biểu mẫu vào system_performance_settings hình thức cho khi Xóa tất cả bộ đệm nút trên biểu mẫu đó được nhấp. Điều này sẽ không hoạt động khi xóa bộ đệm bằng các phương pháp khác, chẳng hạn như bằng một mô-đun gọi drupal_flush_all_caches()
trong mã của nó.
// Đặt dòng sau vào đầu tệp chứa mã này.
sử dụng Drupal\Core\Form\FormStateInterface;
function mymodule_form_system_performance_settings_alter(&$form, FormStateInterface $form_state) {
if (isset($form['clear_cache']['clear'])) {
if ($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(mảng &$form, FormStateInterface $form_state) {
$form_state->setRebuild();
$form_state->setTemporaryValue('mymodule_cache_cleared', TRUE);
}
Đối với một giải pháp hoạt động trong mọi trường hợp drupal_flush_all_caches()
được gọi và thêm mã JavaScript vào trang đầu tiên được yêu cầu sau khi xóa bộ nhớ cache, tôi sẽ triển khai hook_cache_flush()
để đặt một giá trị mà sau đó được đăng ký hook_page_attachments()
.
hàm mymodule_cache_flush() {
\Drupal::state()->set('mymodule_cache_cleared', TRUE);
}
function mymodule_page_attachments(mảng &$attachments) {
$state = \Drupal::state();
if ($state->get('mymodule_cache_cleared')) {
// Xóa giá trị trạng thái để tránh thư viện được thêm vào
// mọi trang sau khi xóa bộ nhớ cache.
$state->delete('mymodule_cache_cleared');
$attachments['#attached']['library'][] = 'mymodule/cache.rebuild';
}
}
Để thêm mã JavaScript vào đầu tiên X các trang được yêu cầu sau khi xóa bộ đệm, tôi sẽ sử dụng các triển khai hook sau đây. (Mã sau đính kèm thư viện vào ba yêu cầu trang đầu tiên.)
hàm mymodule_cache_flush() {
\Drupal::state()->set('mymodule_cache_cleared_count', 3);
}
function mymodule_page_attachments(mảng &$attachments) {
$state = \Drupal::state();
if ($count = $state->get('mymodule_cache_cleared_count')) {
$attachments['#attached']['library'][] = 'mymodule/cache.rebuild';
$state->set('mymodule_cache_cleared_count', $count - 1);
}
}
tôi đã sử dụng \Drupal::state()->get()
và \Drupal::state()->set()
bởi vì:
Giá trị được đặt với drupal_static()
sẽ không được bảo tồn giữa các yêu cầu trang. Trang tài liệu nói rõ ràng:
Tất cả các chức năng yêu cầu một biến tĩnh để duy trì hoặc lưu trữ dữ liệu trong một yêu cầu trang duy nhất được khuyến khích sử dụng chức năng này trừ khi hoàn toàn chắc chắn rằng biến tĩnh sẽ không cần phải đặt lại trong khi yêu cầu trang.
Đặt giá trị phiên, mỗi người dùng sẽ nhận được một giá trị khác nhau. Điều này có nghĩa là mã JavaScript sẽ được thêm vào trang tiếp theo được yêu cầu sau khi xóa bộ nhớ cache chỉ khi trang đó được yêu cầu từ cùng một người dùng đã đăng nhập khi bộ nhớ cache đã bị xóa.
Thêm JavaScript vào Chủ đề hoặc Mô-đun của bạn cho biết cách một thư viện JavaScript được xác định từ một mô-đun.