ฉันจะไม่ใช้ Drupal::state() หรือ hook_page_attachments() สิ่งเหล่านี้คงที่เกินไป ใช้ค่าเซสชันและบล็อกได้ดีขึ้น ดู ความคิดเห็นของฉัน ในคำถามก่อนหน้า
ตั้งค่าเซสชันใน hook เมื่อแคชถูกล้างและเฉพาะเมื่อไม่ได้เรียกใช้จากบรรทัดคำสั่ง:
ฟังก์ชัน flush_cache_flush () {
ถ้า (PHP_SAPI !== 'cli') {
\Drupal::request()->getSession()->set('run_flush_js', TRUE);
}
}
ในบล็อกให้ตรวจสอบค่าเซสชันและลบออกเพื่อไม่ให้คงอยู่หลังจากเปลี่ยนเส้นทาง
src/Plugin/Block/FlushBlock.php
<?php
เนมสเปซ Drupal\flush\Plugin\Block;
ใช้ Drupal\Core\Block\BlockBase;
/**
* ให้บล็อกฟลัช
*
* @ปิดกั้น(
* id = "flush_flush",
* admin_label = @Translation("ฟลัช"),
* หมวดหมู่ = @Translation("กำหนดเอง")
* )
*/
class FlushBlock ขยาย BlockBase {
/**
* {@inheritdoc}
*/
สร้างฟังก์ชั่นสาธารณะ () {
$session = \Drupal::request()->getSession();
$สร้าง = [];
ถ้า ($ เซสชัน -> รับ ('run_flush_js')) {
$session->remove('run_flush_js');
$สร้าง['เนื้อหา'] = [
'#markup' => '<div class="run-flush-js"></div>',
'#attached' => ['library' => ['ล้าง/ล้าง']],
];
}
$build['#cache']['max-age'] = 0;
ส่งคืน $build;
}
}
js/flush.js
(ฟังก์ชัน ($, Drupal, ครั้งเดียว) {
'ใช้อย่างเข้มงวด';
Drupal.behaviors.flush = {
/**
* พฤติกรรมการแนบ Drupal
*/
แนบ: ฟังก์ชัน (บริบท การตั้งค่า) {
ถ้า (ครั้งเดียว ('ล้าง', '.run-flush-js', บริบท). ความยาว) {
alert("ล้าง!");
}
}
};
})(jQuery, Drupal, ครั้งเดียว);
flush.libraries.yml
ล้าง:
จส:
js/flush.js: {}
การพึ่งพา:
- หลัก / drupal
- แกน / jquery
- แกน/ครั้ง
แก้ไข: อัปเดตรหัส js ดู ฉันจะทำให้รหัส JavaScript นี้ทำงานได้อย่างไรเมื่อเปิดใช้งานโมดูล BigPipe