Рейтинг:0

Какой кеш следует аннулировать в блочном плагине, который создает массивы рендеринга для одного или нескольких представлений?

флаг in

Реальная проблема заключается в том, что плагин иногда будет возвращать массивы рендеринга, которые представляют собой отдельные блочные дисплеи из одного и того же вида, возможно, также с разными аргументами. Что я обнаружил, так это то, что в этих случаях первый массив рендеринга кэшируется, чтобы последующие отображения были такими же, как начальный. Я создаю массивы рендеринга с помощью buildRenderable($display_id, $args, FALSE), что, по-видимому, отключит кэширование тегов и ключей. Но мне непонятно, как вручную предоставить настраиваемый контекст кеша без изменения запроса.

4uk4 avatar
флаг cn
Это связано с https://drupal.stackexchange.com/questions/307728/render-view-inside-block-with-caching. Лучшая стратегия для вашего пользовательского контекста кеша зависит от того, сколько вариаций создает этот контекст.
steve avatar
флаг in
Я видел проблему, на которую вы ссылались, не могли бы вы уточнить, что вы имеете в виду в своем комментарии @ 4uk4?
Рейтинг:1
флаг cn

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

Есть три стратегии:

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

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

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

Используйте первый вариант для контекста кеша, не имеющего слишком много вариантов. Второй вариант требует больше усилий для реализации, так как в Drupal 8.8 вам нужен дополнительный класс реализация TrustedCallbackInterface или RenderCallbackInterface, но является более гибким для определения статического и динамического содержимого даже в пределах одного блока. Проще третий вариант, используйте его, если содержимое блока настолько изменчиво, что кэширование не стоит затраченных усилий.

steve avatar
флаг in
Есть ли смысл в том, что переменная `content` в шаблоне содержит два разных массива рендеринга?
4uk4 avatar
флаг cn
Да, часто вы используете контейнеры, чтобы разделить их в визуализируемой структуре, которая также поддерживает темы. См. https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Container.php/class/Container.
steve avatar
флаг in
Я предполагаю, что я спрашивал, что переменная `content` в шаблоне содержит _correct_ массивы рендеринга, используя идентификаторы отображения дискретного представления. Однако в конце концов они не отображаются как отдельные, что является проблемой, с которой я столкнулся. Я просто отображаю `контент` с `{% for value in content %} {{ value }} {% endfor %}`.
4uk4 avatar
флаг cn
Обычно имя переменной `content` в шаблоне Drupal представляет собой массив рендеринга, отображаемый рекурсивно, как и любой другой массив рендеринга, без какой-либо определенной структуры.Если у вас есть контроль над обоими концами переменной, вы можете делать такие предположения, но я бы этого не сделал. Если кто-то еще не знает об этом и удалит настроенный шаблон блока или переключится на другую тему, не содержащую этот шаблон, все сломается.
4uk4 avatar
флаг cn
Если вам нужно визуализировать отдельные переменные, добавьте собственный шаблон в свой модуль для внутренней части и, при необходимости, используйте шаблон блока для оформления внешней части блока.
steve avatar
флаг in
Я думаю, что я, вероятно, не ясно. То, что мы обсуждаем, — это пользовательский модуль с классом плагина блока, который возвращает один или несколько блоков представления в виде массивов рендеринга в методе `build`. Эти массивы рендеринга оформлены в пользовательском шаблоне блока в модуле. Мой вопрос в этих комментариях о переменной `content`, которая передается в шаблон, заключается в следующем: имеет ли смысл, в связи с проблемой, с которой я столкнулся с кэшированием массива рендеринга, чтобы _правильные_, отдельные массивы рендеринга передавались в шаблон, который все еще, тем не менее, в конечном итоге неправильно отображается как один и тот же?
4uk4 avatar
флаг cn
Мы обсуждаем одно и то же, разница в том, что я предлагаю, чтобы эти массивы рендеринга были оформлены в пользовательском шаблоне, который не является шаблоном блока. См. https://www.drupal.org/docs/theming-drupal/twig-in-drupal/create-custom-twig-templates-for-custom-module#s-step-33-render-as-part-of -другой-плагин-такой-как-блок.
steve avatar
флаг in
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/135849/discussion-between-steve-and-4uk4).
Рейтинг:0
флаг in

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

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

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