Puncte:2

Setați Body Class dacă Facet este activ

drapel in

Trebuie să setez o clasă corporală dacă este activ un filtru de fațete.

Ar trebui făcut în yourtheme_preprocess_html

dacă Facet este activ
atunci
$variables['attributes']['class'][] = 'facet-active';

pentru termenii de căutare fulltext funcționează așa

  $variables['atribute']['clasa'][] = 'căutare-' . \Drupal::request()->query->get('search_api_fulltext');

Oricine știe cum să scoată informațiile dacă o fațetă este activă sau nu.

mulțumesc anticipat

Matthias

Puncte:2
drapel cn

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.

drapel ru
Nu știam de acele „$variables[”#attached”][„placeholders”]” speciale înainte. Există un fel de documentație pentru toate posibilitățile din interiorul matricei `#attached`? Știu cheile `drupalSettings`, `biblioteci` și `html_head` acolo, dar se pare că există mult mai multe.
drapel ru
În ceea ce privește cheile magice din `$variables['#attached']`: m-am căutat pe google de la [acest blog](https://davidjguru.github.io/blog/drupal-tips-the-magic-of-attached) la [Documente API](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21HtmlResponseAttachmentsProcessor.php/function/HtmlResponseAttachmentsProcessor%3A%3AprocessAttachments/9.3.x). Important: Citiți dincolo de documentele din antet și uitați-vă la [cheile (ne)acceptate în cod](https://git.drupalcode.org/project/drupal/-/blob/9.4.x/core/lib/ Drupal/Core/Render/HtmlResponseAttachmentsProcessor.php#L140)
drapel in
Aceasta este o abordare fantastică. Mulțumesc mult. Dar nu o pot face să funcționeze și nu știu de ce nu. Clasa-fațetă-este-nu-activă este definită într-un hook preprocess_html înainte de hook-ul preprocess_block.facet-is-not-active-class apare în clasa body, dar nu este înlocuită după utilizarea unui filtru de fațete.
drapel in
trebuie să aibă de-a face cu una dintre cele două clauze if `dacă ($variables['configuration']['furnizor'] == 'myblockid') { if (!in_array('ascuns', (matrice) $variables['atribute']['clasa'])) {` chiar dacă îl testez cu alte blocuri care sunt vizibile tot timpul, nu înlocuiește clasa de corp inițială `facet-is-not-active-class`.
4uk4 avatar
drapel cn
Am testat și niște blocuri. Unii funcționează, alții nu. Se pare că blocurile care sunt însele substituite pot doar substituent în cadrul blocului. Din păcate, blocul de fațete este întotdeauna substituent, deoarece setează cache max-age 0. Șterg răspunsul după un timp dacă nu apare nicio soluție. Ca o alternativă la aceasta, puteți atașa o bibliotecă javascript la bloc pentru a verifica vizibilitatea fațetelor din partea clientului.
drapel in
daca as putea face asta, as putea ;) dar nu stiu cum sa fac :(

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.