Рейтинг:0

Как кэшировать блок просмотра по языку контента?

флаг us

У меня есть очень простое (блочное) представление для отображения заголовка узла. Это представление имеет идентификатор из контекстного фильтра URL-адреса и один фильтр для фильтрации по языку содержимого, установленному для страницы (по префиксу URL-адреса). Затем этот блок размещается с помощью Layout Builder в режиме просмотра Full Content для этого типа узла.Представление настроено на использование кэширования на основе тегов. Когда я переключаю страницу туда и обратно между языками; язык заголовка не меняется.

Отключение кэширования представлений исправляет это.

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

До сих пор я пробовал это:

функция mycustom_views_pre_view (ViewExecutable $ view, $ display_id, массив и $ 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'] as $key => $context) {
      если (stristr($context, 'language_interface')) {
        unset($view->element['#cache']['contexts'][$key]);
      }
    }
    $view->element['#cache']['contexts'][] = 'languages:language_content';
    $view->element['#cache']['tags'][] = 'language:' . $лангкод;
  }
}

Кажется, ничего из этого не помогает.

Возможно ли, что я исправил кэширование представления, но блок все еще не кэшируется должным образом?

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

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

/**
 * Реализует hook_preprocess_views_view_field().
 */
функция mymodule_preprocess_views_view_field (массив и переменные $) {
  // целевой вид и поле
  $variables['#cache']['contexts'][] = languages:language_content';
}
Рейтинг:0
флаг de

Вы можете добавить бэкэнд-класс для блока, а затем добавить к этому блоку контекст кеша для языка.

Во-первых, вам нужно получить ключ конфигурации для блока просмотра. Я считаю, что это views.view.[BLOCK_ID]. Вы можете получить идентификатор блока в расширенном разделе представления.

Затем вы добавляете в блок пользовательский класс. Вот как это делается для блока брендинга системы.

/**
 * Реализует hook_block_alter().
 *
 * Изменяет класс блока брендинга системы для добавления кеша
 * контекст для языка.
 */
функция [МОДУЛЬ]_block_alter(массив &$определения) {
  // Установить пользовательский обратный вызов для блока системного меню
  $definitions['system_branding_block']['class'] = 'Drupal\[MODULE]\Plugin\Block\SystemBrandingBlockOverride';
}

Затем вы можете добавить контекст кеша для языка в класс:

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

используйте Drupal\system\Plugin\Block\SystemBrandingBlock;

/**
 * Добавляет групповое кэширование в системный блок брендинга.
 */
класс SystemBrandingBlockOverride расширяет SystemBrandingBlock {

  /**
   * {@inheritdoc}
   */
  общедоступная функция getCacheContexts() {
    $contexts = parent::getCacheContexts();

    $contexts[] = 'языки';

    вернуть $контексты;
  }

}

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

  • языки:language_interface
  • языки:language_content
liquidcms avatar
флаг us
Не удивлюсь, если это тоже сработает; но ответ 4k4 был 1 строкой - так что выбрал ее.
Jaypan avatar
флаг de
Если его работает, то тем лучше!
4uk4 avatar
флаг cn
Системный блок брендинга — единственный известный мне базовый блок, который не отображает содержимое блока. Вам не нужен этот обходной путь для других блоков. Наоборот, это часто не работает для визуализированного контента. В общем, это лучший подход, чтобы добавить метаданные кеша к наиболее детализированному фрагменту контента, к которому он принадлежит, и позволить ему всплывать.

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

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