Рейтинг:0

Передать текущий язык в ветку на пользовательских блоках

флаг za

мой пользовательский блок модуля, предположительно без кеша

<?php

пространство имен Drupal\amu_social_icon\Plugin\Block;

используйте Drupal\Core\Block\BlockBase;

/**
 * Предоставляет блок «Значок»
 *
 * @Блокировать(
 * id = "аму_социальный_икон_блок",
 * admin_label = @Translation("Блок социальных иконок"),
 * )
 */
класс IconBlock расширяет BlockBase {

  /**
   * {@inheritdoc}
   */
  общедоступная функция сборки () {
    $config = \Drupal::config('amu_social_icon.settings');
    возвращаться [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '# прикрепленный' => [
        'библиотека' => [
          'amu_social_icon/глобальный стиль',
        ],
      ],
    ];
  }

  /**
   * @возврат внутр.
   */
  общедоступная функция getCacheMaxAge() {
    вернуть 0;
  }
}

языковой контекст, который я пытаюсь добавить к внутренним URL-адресам

<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>

я понял, что переменная, переданная hook_theme, является статической, поэтому я попытался переопределить ее в блоке предварительной обработки.

функция amu_social_icon_theme ($ существующая, $ тип, $ тема, $ путь) {
  возвращаться [
    'аму_социал_икон_блок' => [
      'переменные' => [
        'значки' => ноль,
        'язык' => \Drupal::languageManager()->getCurrentLanguage()->getId()
      ],
    ],
  ];
}

функция amu_social_icon_preprocess_block(&$vars) {
  если ($vars['plugin_id'] == 'amu_social_icon_block') {
    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $vars['язык'] = $язык;
  }
}

Ни одна из этих работ. Мне нужно очистить кеш друпала, чтобы

{{ дамп(язык) }}

отображать правильный текущий язык

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

Я понял, что переменная, переданная hook_theme, является статической.

Да, вы можете считать значения по умолчанию, определенные в hook_theme, статическими, они устанавливаются при установке модуля. Чтобы помочь разработчикам, очистка кеша также очищает большинство вещей, установленных модулями, так что вам не нужно постоянно переустанавливать модуль, но это не имеет ничего общего с кэшированием рендеринга.

язык является переменной вашей пользовательской темы, а не блока. Тогда вам не нужен препроцессорный хук, вы можете добавить его прямо в сборку блока, содержащую этот шаблон:

  общедоступная функция сборки () {
    возвращаться [
      '#theme' => 'amu_social_icon_block',
      '#language' => $язык,

Кэширование текущего языка работает «из коробки». Это один из трех контекстов по умолчанию. Однако вы не можете отладить кэширование с помощью отладочного вывода. В большинстве случаев вы попадаете в кеш, обслуживая содержимое из кеша, не запуская код, создающий содержимое.

Matoeil avatar
флаг za
это вызывает ошибку пользователя: «язык» является недопустимым ключом массива рендеринга в Drupal\Core\Render\Element::children() (строка 97 core/lib/Drupal/Core/Render/Element.php).
4uk4 avatar
флаг cn
Я добавил знак `#` перед именем переменной.
sonfd avatar
флаг in
Различается ли каждый массив рендеринга в зависимости от языка по умолчанию? Вот что, кажется, подразумевает ваш ответ. Глядя на код OP, не похоже, что блок на самом деле является переведенным объектом. Вам не нужно будет вручную добавлять в блок контекст языкового кэша?
4uk4 avatar
флаг cn
@sonfd, из коробки это относится ко всем массивам рендеринга. См. https://drupal.stackexchange.com/questions/298480/how-do-i-specify-a-render-cache-context-as-universal.
Matoeil avatar
флаг za
я пробовал '#language' => $language, но это null
Рейтинг:0
флаг za

значение по умолчанию, кажется, необходимо в hook_theme

 */
функция amu_social_icon_theme ($ существующая, $ тип, $ тема, $ путь) {
  $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
  возвращаться [
    'аму_социал_икон_блок' => [
      'переменные' => [
        'значки' => ноль,
        'язык' => $язык,
      ],
    ],
  ];
}

а также запись #cache в методе сборки блока

<?php

пространство имен Drupal\amu_social_icon\Plugin\Block;

используйте Drupal\Core\Block\BlockBase;

/**
 * Предоставляет блок «Значок»
 *
 * @Блокировать(
 * id = "аму_социальный_икон_блок",
 * admin_label = @Translation("Блок социальных иконок"),
 * )
 */
класс IconBlock расширяет BlockBase {

  /**
   * {@inheritdoc}
   */
  общедоступная функция сборки () {
    $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
    $config = \Drupal::config('amu_social_icon.settings');
    возвращаться [
      '#theme' => 'amu_social_icon_block',
      '#icons' => $config->get('amu_social_icon_icons'),
      '#язык' => $язык,
      '#кэш' => [
        'максимальный возраст' => 0,
      ],
      '# прикрепленный' => [
        'библиотека' => [
          'amu_social_icon/глобальный стиль',
        ],
      ],
    ];
  }

  общедоступная функция getCacheMaxAge() {
    вернуть 0;
  }
}
leymannx avatar
флаг ne
Следует избегать вызовов Drupal в классе, вместо этого внедрять зависимости. Но кроме этого: красиво!

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

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