Вы не знаете, когда отображается шаблон HTML, активен фасет или нет. Итак, в mytheme_preprocess_html() предположим, что это не так:
$variables['attributes']['class'][] = 'facet-is-not-active-class';
В блоке фасетов замените класс-заполнитель, если блок виден:
функция mytheme_preprocess_block(&$variables) {
if ($variables['configuration']['provider'] == 'facets') {
if (!in_array('скрытый', (массив) $variables['атрибуты']['класс'])) {
$variables['#attached']['placeholders']['facet-is-not-active-class'] = [
'#markup' => 'facet-active',
];
}
}
}
Важно, чтобы строка-заполнитель грань-не-активный-класс
уникален, используйте более длинное имя или даже хэш. Заполнители заменяются для всех вхождений строки на странице.
Проблема с вложенными заполнителями
Это работает только для блоков, которые не замещаются автоматически. Фасетный блок, к сожалению, всегда заменяется. Он устанавливает максимальный возраст кеша 0, что соответствует условию по умолчанию для автоматического заполнения. Видеть https://www.drupal.org/docs/drupal-apis/render-api/auto-placeholdering#s-what
Чтобы предотвратить это, вы можете установить #create_placeholder в FALSE:
/**
* Реализует hook_block_build_BASE_BLOCK_ID_alter().
*/
function mymodule_block_build_facet_block_alter (массив & $ build, \ Drupal \ Core \ Block \ BlockPluginInterface $ block) {
$build['#create_placeholder'] = ЛОЖЬ;
}
Предупреждение: это настоящий убийца производительности, он удваивает время загрузки страницы в моих тестах. Поэтому, если важна производительность, вам, вероятно, следует искать решение на стороне клиента, лучший CSS или библиотеку javascript, которая добавляет необходимые классы.