Puncte:0

Transmite limba curentă la twig pe blocuri personalizate

drapel za

blocul meu modul personalizat, fără cache

<?php

spațiu de nume Drupal\amu_social_icon\Plugin\Block;

utilizați Drupal\Core\Block\BlockBase;

/**
 * Oferă un bloc „pictogramă”.
 *
 * @Bloc(
 * id = "amu_social_icon_block",
 * admin_label = @Translation ("Bloc de pictograme sociale"),
 * )
 */
clasa IconBlock extinde BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    $config = \Drupal::config('amu_social_icon.settings');
    întoarcere [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#attached' => [
        'biblioteca' => [
          „amu_social_icon/global-styling”,
        ],
      ],
    ];
  }

  /**
   * @return int
   */
  funcția publică getCacheMaxAge() {
    întoarce 0;
  }
}

contextul lingvistic pe care încerc să îl adaug pe adresele URL interne

<ul class="social-icon menu socialicon-nav">
      {{ dump(language) }}
  {% for icon in icons %}
    {% if icon.url is not empty %}
          {% if icon.url starts with '/' %}
                <li><a href="/{{ language }}{{ icon.url }}" aria-label="{{ icon.aria_label }}"><i aria-hidden="true" class="{{ icon.icon }}"></i></a></li>
          {% else %}
                   <li><a href="{{ icon.url }}" aria-label="{{ icon.aria_label }}"><i aria-hidden="true" class="{{ icon.icon }}"></i></a></li>
    {% endif %}
      {% endif %}
  {% endfor %}
</ul>

Am înțeles că variabilele transmise de hook_theme sunt statice, așa că am încercat să o înlocuiesc pe blocul de preprocesare

funcția amu_social_icon_theme($existent, $tip, $temă, $cale) {
  întoarcere [
    'amu_social_icon_block' => [
      'variabile' => [
        'icoane' => nul,
        'language' => \Drupal::languageManager()->getCurrentLanguage()->getId()
      ],
    ],
  ];
}

funcția amu_social_icon_preprocess_block(&$vars) {
  dacă ($vars['plugin_id'] == 'amu_social_icon_block') {
    $limba = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $vars['limba'] = $limba;
  }
}

Niciuna dintre aceste lucrări. Trebuie să golesc memoria cache Drupal, astfel încât

{{ dump(limbă) }}

afișați limba curentă corectă

Puncte:3
drapel cn

Am înțeles că variabilele transmise de hook_theme sunt statice

Da, puteți considera valorile implicite definite în hook_theme ca fiind statice, acestea sunt setate când instalați modulul. Pentru a ajuta dezvoltatorii să golească memoria cache, de asemenea, șterge majoritatea lucrurilor care sunt instalate de module, astfel încât să nu fie nevoie să reinstalați modulul tot timpul, dar acest lucru nu are nimic de-a face cu redarea în cache.

limba este o variabilă a temei personalizate, nu a blocului. Atunci nu aveți nevoie de un cârlig de preprocesare, îl puteți adăuga direct la compilarea blocului care conține acest șablon:

  public function build() {
    întoarcere [
      '#theme' => 'amu_social_icon_block',
      '#language' => $limba,

Memorarea în cache a limbii curente funcționează imediat. Acesta este unul dintre cele trei contexte implicite. Cu toate acestea, nu puteți depana stocarea în cache prin ieșirea de depanare. De cele mai multe ori ai o lovitură de cache, difuzând conținutul din cache, fără a rula codul care creează conținutul.

Matoeil avatar
drapel za
acest lucru cauzează eroare utilizator: „limba” este o cheie de matrice de randare nevalidă în Drupal\Core\Render\Element::children() (linia 97 din core/lib/Drupal/Core/Render/Element.php).
4uk4 avatar
drapel cn
Am adăugat un semn `#` înainte de numele variabilei.
sonfd avatar
drapel in
Fiecare matrice de randare variază în funcție de limbă în mod implicit? Asta pare să implice răspunsul tău. Privind codul OP, nu pare că blocul este de fapt o entitate tradusă. Nu va trebui să adăugați manual un context de cache de limbă la bloc?
4uk4 avatar
drapel cn
@sonfd, din cutie, acesta este cazul pentru toate matricele de randare. Vedeți https://drupal.stackexchange.com/questions/298480/how-do-i-specify-a-render-cache-context-as-universal
Matoeil avatar
drapel za
Am încercat „#language” => $language, dar este nul
Puncte:0
drapel za

o valoare implicită pare să fie necesară în hook_theme

 */
funcția amu_social_icon_theme($existent, $tip, $temă, $cale) {
  $limba = \Drupal::languageManager()->getCurrentLanguage()->getId();
  întoarcere [
    'amu_social_icon_block' => [
      'variabile' => [
        'icoane' => nul,
        'lang' => $limba,
      ],
    ],
  ];
}

precum și o intrare #cache în metoda de construire a blocurilor

<?php

spațiu de nume Drupal\amu_social_icon\Plugin\Block;

utilizați Drupal\Core\Block\BlockBase;

/**
 * Oferă un bloc „pictogramă”.
 *
 * @Bloc(
 * id = "amu_social_icon_block",
 * admin_label = @Translation ("Bloc de pictograme sociale"),
 * )
 */
clasa IconBlock extinde BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    $limba = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $config = \Drupal::config('amu_social_icon.settings');
    întoarcere [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#lang' => $limba,
      '#cache' => [
        'max-age' => 0,
      ],
      '#attached' => [
        'biblioteca' => [
          „amu_social_icon/global-styling”,
        ],
      ],
    ];
  }

  funcția publică getCacheMaxAge() {
    returnează 0;
  }
}
leymannx avatar
drapel ne
Apelurile Drupal ar trebui evitate în clasă, în schimb injectați dependențe. Dar pe lângă asta: frumos!

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.