Рейтинг:2

Установить класс тела, если фасет активен

флаг in

Мне нужно установить класс тела, если активен фасетный фильтр.

Это должно быть сделано в yourtheme_preprocess_html

если Фасет активен
тогда
$variables['attributes']['class'][] = 'facet-active';

для условий полнотекстового поиска это работает так

  $variables['атрибуты']['класс'][] = 'поиск-' . \Drupal::request()->query->get('search_api_fulltext');

Кто-нибудь знает, как выкопать информацию, если фасет активен или нет.

заранее спасибо

Матиас

Рейтинг:2
флаг cn

Вы не знаете, когда отображается шаблон 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, которая добавляет необходимые классы.

флаг ru
Раньше я не знал об этих специальных `$variables['#attached']['placeholders']`. Есть ли какая-то документация для всех возможностей внутри массива `#attached`? Я знаю о ключах `drupalSettings`, `libraries` и `html_head`, но, похоже, там гораздо больше.
флаг ru
Относительно волшебных ключей в `$variables['#attached']`: сам погуглил от [этого блога](https://davidjguru.github.io/blog/drupal-tips-the-magic-of-attached) до [Документация по API](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21HtmlResponseAttachmentsProcessor.php/function/HtmlResponseAttachmentsProcessor%3A%3AprocessAttachments/9.3.x). Важно: читайте дальше документации в шапке и посмотрите на [(не)поддерживаемые ключи в коде](https://git.drupalcode.org/project/drupal/-/blob/9.4.x/core/lib/ Drupal/Core/Render/HtmlResponseAttachmentsProcessor.php#L140)
флаг in
Это фантастический подход. Большое спасибо. Но я не могу заставить его работать, и не знаю, почему. Фасетный-не-активный-класс определяется в хуке preprocess_html перед хуком preprocess_block.facet-is-not-active-class отображается в классе body, но не заменяется после использования фильтра фасетов.
флаг in
должен иметь отношение к одному из двух условий if `if ($variables['configuration']['provider'] == 'myblockid') { if (!in_array('скрытый', (массив) $variables['атрибуты']['класс'])) {` даже если я протестирую его с другими блоками, которые видны все время, он не заменит начальный класс тела «facet-is-not-active-class».
4uk4 avatar
флаг cn
Я также протестировал некоторые блоки. Одни работают, другие нет. Похоже, что блоки, которые сами по себе являются заполнителями, могут быть только заполнителями внутри блока. К сожалению, фасетный блок всегда заменяется, потому что он устанавливает максимальный возраст кеша 0. Я удаляю ответ через некоторое время, если решение не появляется. В качестве альтернативы вы можете прикрепить к блоку библиотеку javascript, чтобы проверить видимость фасетов на стороне клиента.
флаг in
если бы я мог это сделать, я мог бы ;) но я не знаю как это сделать :(

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.