Score:0

ฉันควรใช้ hook_cache_flush() หรือ hook_rebuild() ในโมดูลที่กำหนดเองเพื่อรันโค้ด JavaScript เมื่อล้างแคชได้อย่างไร

ธง jp

ฉันกำลังพยายามสร้างโมดูลที่รันโค้ด JavaScript เมื่อแคชถูกล้าง (ผ่านเมนูผู้ดูแลระบบหรืออย่างอื่น) ฉันเชื่อว่าฉันสามารถนำไปใช้ได้ hook_cache_flush() หรือ hook_rebuild()แต่ฉันไม่แน่ใจว่าเป็นอย่างไร ฉันไม่จำเป็นต้องมองหาสิ่งนี้ที่จะทำเพื่อฉัน แต่ถ้าฉันได้รับจุดเริ่มต้นและทิศทางที่จะมุ่งไป นั่นจะดีมาก

Score:1
ธง us

ไม่ใช่ทั้งสองอย่าง 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 จากโมดูล

jp flag
ฉันต้องการใช้หนึ่งในฟังก์ชันที่ฉันระบุไว้เพื่อให้โค้ดทำงานทุกครั้งที่เรียกฟังก์ชันใดฟังก์ชันหนึ่ง ด้วยวิธีนี้ ใช่แล้ว ปุ่มในการตั้งค่าประสิทธิภาพจะทำได้ แต่ถ้ามีคนติดตั้งโมดูลเมนูผู้ดูแลระบบและล้างแคชด้วยวิธีนั้น ก็จะยังคงดำเนินการอยู่ ไม่มีวิธีดำเนินการ JS เมื่อใช้ hook บางตัวโดยไม่คำนึงถึงอาร์กิวเมนต์หรือสิ่งที่ส่งคืน
apaderno avatar
us flag
เบ็ดเดียวที่จะสามารถแก้ไขอาร์เรย์การแสดงผลสำหรับหน้าจะถูกเรียกใช้สำหรับทุกหน้า และจะไม่สามารถเข้าใจได้ว่าแคชถูกล้างหรือไม่
jp flag
ฉันรู้ว่าคุณพูดถึงท่อนไหน และคุณพูดถูก สำหรับ JS ฉันจะไม่ถามถึงวิธีการทำในสิ่งที่ฉันต้องการเป็นพิเศษ แต่ถ้าฉันต้องการเพิ่มสิ่งง่ายๆ เช่นการแจ้งเตือนเพื่อทดสอบไลบรารีของฉัน คุณช่วยบอกใบ้เกี่ยวกับวิธีการทำได้ไหม นั่น? ฉันอ่านเอกสารที่คุณเชื่อมโยงและไม่พบวิธีแก้ปัญหาที่เหมาะกับฉัน
cn flag
คุณสามารถตั้งค่า var แบบคงที่ใน hook และรับอีกครั้งใน `hook_preprocess_page()` (ดู [`drupal_static()`](https://api.drupal.org/api/drupal/core%21includes%21bootstrap .inc/function/drupal_static/9.3.x) สำหรับรูปแบบที่จะใช้) แต่จะใช้ไม่ได้ในทุกบริบท ตัวอย่างเช่น เมื่อคุณล้างแคชจากเมนูผู้ดูแลระบบ แคชจะเปลี่ยนเส้นทางกลับไปยังเพจที่มาจาก ดังนั้นคุณจึงไม่มีโอกาสแนบคลังไปยังเพจนั้น คุณสามารถหลีกเลี่ยงสิ่งนั้นได้โดยใช้เซสชันหรือที่เก็บข้อมูลชั่วคราว แต่ต้องใช้ความพยายามมากกว่าและอาจยุ่งเหยิงหากการเปลี่ยนเส้นทางหน้าล้มเหลว เป็นต้น
4uk4 avatar
cn flag
@Clive เป็นความคิดที่ดีในการตั้งค่าเซสชัน เช่น คุณสามารถตั้งค่าข้อความสำหรับการโหลดเต็มหน้าถัดไปหากต้องการอ่านและล้างค่าเซสชันนี้ คุณไม่สามารถใช้ hook การประมวลผลล่วงหน้าของเพจได้ แม้ว่าเพจจะถูกแคชไว้ คุณสามารถใช้ผู้สมัครสมาชิกเหตุการณ์การตอบสนองได้หลังจากที่เพจถูกเรียกจากแคชหรือบล็อกที่ไม่สามารถแคชได้ด้วยแคชอายุสูงสุด 0 ซึ่งจะถูกแคชเป็นตัวยึดตำแหน่งเสมอและรันในทุกคำขอของเพจ
apaderno avatar
us flag
@Joseph ฉันได้เพิ่มวิธีแก้ปัญหาเพิ่มเติมเนื่องจากสิ่งที่รายงานในความคิดเห็นนั้นไม่ถูกต้องทั้งหมด
apaderno avatar
us flag
@ 4uk4 เป็นความคิดที่ดีหาก OP ต้องการค่าที่แตกต่างกันสำหรับผู้ใช้แต่ละคน หาก OP จำเป็นต้องตั้งค่าเมื่อแคชถูกล้าง และใช้ค่านั้นเพื่อเพิ่มโค้ด JavaScript ในหน้าถัดไปที่จำเป็น เซสชันจะไม่สามารถใช้งานได้โดยอิสระจากผู้ใช้ที่เข้าถึงหน้านั้น
4uk4 avatar
cn flag
ตกลง แต่การล้างแคชในคำขอโพสต์ที่เปลี่ยนเส้นทางโดยตรงไปยังการโหลดหน้าเว็บปกติ (แน่นอนว่าใช้คุกกี้เซสชันเดียวกัน) เป็นกรณีการใช้งานที่เป็นไปได้มากที่สุดของ drupal_flush_all_caches() ตามเอกสาร หากมีเบราว์เซอร์ที่เกี่ยวข้อง มิฉะนั้นจาวาสคริปต์ก็ไม่สมเหตุสมผล
apaderno avatar
us flag
@ 4uk4 ฉันไม่เข้าใจจุดประสงค์ของการเรียกใช้โค้ด JavaScript เมื่อแคชของ Drupal ถูกล้างคืออะไร ฉันคิดว่า OP กำลังพยายามเปลี่ยนแปลงบางอย่างในระดับเบราว์เซอร์ แต่นี่เป็นเพียงการคาดเดาเท่านั้น นั่นเป็นเหตุผลที่ฉันหลีกเลี่ยงที่จะบอกว่าการใช้ JavaScript เป็นความคิดที่ดีหรือไม่ดี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา