Nu știți când este redat șablonul HTML dacă o fațetă este activă sau nu. Deci, în mytheme_preprocess_html() presupunem că nu este:
$variables['attributes']['class'][] = 'fațeta-nu-este-clasa-activă';
În blocul de fațete înlocuiți clasa substituent dacă blocul este vizibil:
funcția mytheme_preprocess_block(&$variabile) {
if ($variables['configuration']['furnizor'] == 'fațete') {
if (!in_array('ascuns', (matrice) $variables['atribute']['clasa'])) {
$variables['#attached']['placeholders']['facet-is-not-active-class'] = [
'#markup' => 'facet-active',
];
}
}
}
Important este că șirul substituent fațeta-nu-este-clasa-activă
este unic, folosește un nume mai lung sau chiar un hash. Substituenții sunt înlocuiți pentru toate aparițiile șirului de pe pagină.
Problemă cu substituenții imbricați
Acest lucru funcționează numai pentru blocurile care nu au loc substituent automat. Blocul de fațete, din păcate, este întotdeauna substituent. Setează cache max-age 0, care îndeplinește condiția implicită pentru înlocuirea automată. Vedea https://www.drupal.org/docs/drupal-apis/render-api/auto-placeholdering#s-what
Pentru a preveni acest lucru, puteți seta #create_placeholder la FALSE:
/**
* Implementează hook_block_build_BASE_BLOCK_ID_alter().
*/
function mymodule_block_build_facet_block_alter(array &$build, \Drupal\Core\Block\BlockPluginInterface $block) {
$build['#create_placeholder'] = FALS;
}
Avertisment: Acesta este un adevărat ucigaș de performanță, dublează timpii de încărcare a paginii în testele mele. Deci, dacă performanța este importantă, probabil că ar trebui să căutați o soluție pe partea clientului, un CSS mai bun sau o bibliotecă javascript care adaugă clasele necesare.