ไม่ใช่ทั้งสองอย่าง hook_cache_flush()
ก็ไม่เช่นกัน hook_rebuild()
การนำไปใช้งานสามารถเพิ่มโค้ด JavaScript ลงในเพจได้โดยตรง เพียงเพราะพวกเขาไม่ได้รับอาร์เรย์เรนเดอร์ใดๆ เป็นอาร์กิวเมนต์ และพวกเขาจะส่งคืนอาร์เรย์เรนเดอร์ไปยังฟังก์ชัน/เมธอดที่เรียกใช้
คุณสามารถเพิ่มตัวจัดการการส่งแบบฟอร์มให้กับ ระบบ_ประสิทธิภาพ_การตั้งค่า แบบฟอร์มสำหรับเมื่อ ล้างแคชทั้งหมด ปุ่มบนแบบฟอร์มนั้นถูกคลิก สิ่งนี้จะไม่ทำงานเมื่อแคชถูกล้างโดยใช้วิธีอื่น เช่น โดยโมดูลที่เรียกใช้ 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';
}
}
ฟังก์ชัน mymodule_system_performance_settings_submit (อาร์เรย์ &$form, 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 ไปที่รหัสแรก เอ็กซ์ หน้าที่ร้องขอหลังจากล้างแคช ฉันจะใช้การใช้งาน hook ต่อไปนี้ (รหัสต่อไปนี้แนบไลบรารีกับคำขอสามหน้าแรก)
ฟังก์ชัน 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', $นับ - 1);
}
}
ฉันใช้ \Drupal::state()->get()
และ \Drupal::state()->set()
เพราะ:
ค่าที่กำหนดด้วย drupal_static()
จะไม่ถูกรักษาไว้ระหว่างคำขอเพจ หน้าเอกสารระบุอย่างชัดเจน:
ฟังก์ชันทั้งหมดที่ต้องการตัวแปรคงที่เพื่อคงอยู่หรือแคชข้อมูล ภายในคำขอหน้าเดียว ได้รับการสนับสนุนให้ใช้ฟังก์ชันนี้ เว้นแต่จะแน่ใจอย่างยิ่งว่าตัวแปรสแตติกจะไม่ต้องรีเซ็ตระหว่างการร้องขอเพจ
การตั้งค่าเซสชัน ผู้ใช้แต่ละคนจะได้รับค่าที่แตกต่างกัน ซึ่งหมายความว่าโค้ด JavaScript จะถูกเพิ่มในหน้าถัดไปที่ร้องขอหลังจากล้างแคชแล้ว เฉพาะเมื่อหน้านั้นถูกร้องขอจากผู้ใช้รายเดียวกันที่เข้าสู่ระบบเมื่อล้างแคชแล้ว
เพิ่ม JavaScript ให้กับธีมหรือโมดูลของคุณ แสดงวิธีกำหนดไลบรารี JavaScript จากโมดูล