Puncte:0

Cum să memorați în cache Blocul de vizualizare în funcție de limba conținutului?

drapel us

Am o vizualizare (bloc) foarte simplă pentru a enumera titlul unui nod. Această vizualizare are un id de la filtrul contextual URL și un singur filtru pentru a filtra pe limba de conținut setată pentru pagină (după prefixul URL). Acest bloc este apoi plasat folosind Layout Builder în modul de vizualizare Conținut complet pentru acest tip de nod.Vizualizarea este setată să utilizeze memorarea în cache bazată pe etichete. Când schimb pagina înainte și înapoi între limbi; limba titlului nu se schimbă.

Dezactivarea memorării în cache a vizualizărilor rezolvă acest lucru.

Puțin săpături și văd că contextul cache al vizualizărilor se bazează pe limbajul interfeței, dar titlul este conținut; deci trebuie să se bazeze pe limbajul conținutului. Am văzut câteva postări despre setarea contextului cache-ului și a etichetelor cache, dar acestea nu par să funcționeze.

Pana acum am incercat asta:

function mycustom_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
  $language_manager = \Drupal::languageManager();
  $langcode = $language_manager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
  if (isset($view->element['#cache']['contexts']) && is_array($view->element['#cache']['contexts'])) {
    foreach ($view->element['#cache']['contexts'] ca $key => $context) {
      dacă (stristr($context, 'interfaţă_limbă')) {
        unset($view->element['#cache']['contexts'][$key]);
      }
    }
    $view->element['#cache']['contexts'][] = 'languages:language_content';
    $view->element['#cache']['tags'][] = 'limba:' . $langcode;
  }
}

Nimic din toate acestea nu pare să ajute.

Este posibil să fi remediat memorarea în cache a vizualizării, dar blocul încă nu este memorat în cache corect?

Puncte:1
drapel cn

Pentru câmpurile de randare a Vizualizărilor, puteți adăuga metadatele din cache în câmp, astfel încât să poată fi utilizate deja pentru rândurile din cache și apoi să se ridice la vizualizarea randată și bloc.

/**
 * Implementează hook_preprocess_views_view_field().
 */
funcția mymodule_preprocess_views_view_field(matrice &$variabile) {
  // țintă vizualizare și câmp specific
  $variables['#cache']['contexts'][] = languages:language_content';
}
Puncte:0
drapel de

Puteți adăuga o clasă de backend pentru bloc, apoi puteți adăuga un context cache pe limbă la acel bloc.

Mai întâi, trebuie să obțineți cheia de configurare pentru blocul de vizualizare. Eu cred că este views.view.[BLOCK_ID]. Puteți obține ID-ul blocului în secțiunea avansată a vizualizării.

Apoi, adăugați o clasă personalizată la bloc. Iată cum se face acest lucru pentru blocul de branding al sistemului.

/**
 * Implementează hook_block_alter().
 *
 * Modifică clasa pentru blocul de branding al sistemului pentru a adăuga un cache
 * context pentru limbaj.
 */
funcția [MODULE]_block_alter(matrice &$definiții) {
  // Setați apel invers personalizat pentru blocul de meniu de sistem
  $definitions['system_branding_block']['class'] = 'Drupal\[MODULE]\Plugin\Block\SystemBrandingBlockOverride';
}

Apoi puteți adăuga un context cache pe limbă în clasă:

spațiu de nume Drupal\[MODULE]\Plugin\Block;

utilizați Drupal\system\Plugin\Block\SystemBrandingBlock;

/**
 * Adaugă cache de grup la blocul de branding al sistemului.
 */
clasa SystemBrandingBlockOverride extinde SystemBrandingBlock {

  /**
   * {@inheritdoc}
   */
  funcția publică getCacheContexts() {
    $contexts = parent::getCacheContexts();

    $contexts[] = 'limbi';

    returnează $contexte;
  }

}

Rețineți că este posibil să doriți să utilizați unul dintre următoarele contexte cache:

  • limbi:interfață_limbă
  • limbi:conținut_limbă
liquidcms avatar
drapel us
Nu ar fi surprins dacă funcționează și acest lucru; dar răspunsul lui 4k4 a fost 1 linie - așa că am ales-o pe aceea.
Jaypan avatar
drapel de
Dacă funcționează, atunci cu atât mai bine!
4uk4 avatar
drapel cn
Blocul de branding al sistemului este singurul bloc de bază pe care îl cunosc și care nu redă conținutul blocului. Nu aveți nevoie de această soluție pentru alte blocuri. Dimpotrivă, adesea nu funcționează pentru conținutul redat. În general, este cea mai bună abordare de a adăuga metadatele din cache la cea mai granulară bucată de conținut căreia îi aparține și de a o lăsa să se ridice.

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.