คุณไม่รู้ว่าเมื่อใดที่เทมเพลต HTML แสดงผลว่า facet ทำงานอยู่หรือไม่ ดังนั้นใน mytheme_preprocess_html() ถือว่าไม่ใช่:
$variables['attributes']['class'][] = 'facet-is-not-active-class';
ในบล็อก facets ให้แทนที่คลาสตัวยึดตำแหน่งหากมองเห็นบล็อกได้:
ฟังก์ชัน mytheme_preprocess_block(&$ตัวแปร) {
ถ้า (ตัวแปร $ ['การกำหนดค่า'] ['ผู้ให้บริการ'] == 'แง่มุม') {
ถ้า (!in_array('hidden', (array) $variables['attributes']['class'])) {
$variables['#attached']['placeholders']['facet-is-not-active-class'] = [
'#markup' => 'facet-active',
];
}
}
}
สิ่งสำคัญคือสตริงตัวยึด facet-is-not-active-class
ไม่ซ้ำกัน ใช้ชื่อที่ยาวขึ้นหรือแม้กระทั่งแฮช ตัวยึดตำแหน่งจะถูกแทนที่สำหรับสตริงที่เกิดขึ้นทั้งหมดบนเพจ
ปัญหาเกี่ยวกับตัวยึดตำแหน่งที่ซ้อนกัน
วิธีนี้ใช้ได้เฉพาะกับบล็อกที่ไม่ได้วางตำแหน่งอัตโนมัติ น่าเสียดายที่บล็อก facet ถูกแทนที่เสมอ มันตั้งค่าอายุแคชสูงสุดเป็น 0 ซึ่งตรงตามเงื่อนไขเริ่มต้นสำหรับการยึดตำแหน่งอัตโนมัติ ดู https://www.drupal.org/docs/drupal-apis/render-api/auto-placeholdering#s-อะไร
เพื่อป้องกันไม่ให้คุณสามารถตั้งค่า #create_placeholder เป็น FALSE:
/**
* ใช้ hook_block_build_BASE_BLOCK_ID_alter()
*/
ฟังก์ชัน mymodule_block_build_facet_block_alter (อาร์เรย์ &$build, \Drupal\Core\Block\BlockPluginInterface $block) {
$build['#create_placeholder'] = FALSE;
}
ข้อแม้: นี่เป็นตัวฆ่าประสิทธิภาพที่แท้จริง มันเพิ่มเวลาในการโหลดหน้าเว็บเป็นสองเท่าในการทดสอบของฉัน ดังนั้น หากประสิทธิภาพเป็นสิ่งสำคัญ คุณควรมองหาโซลูชันฝั่งไคลเอ็นต์ CSS ที่ดีกว่า หรือไลบรารีจาวาสคริปต์ที่เพิ่มคลาสที่จำเป็น