Пользовательский шаблон ветки для страницы веб-формы подтверждения слишком сильно кэшируется


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

Из-за размера формы - 50 нечетных полей - я настраиваю файл Twig в своем модуле для экрана подтверждения, поскольку управлять им в моей среде разработки намного проще, чем с помощью графического интерфейса. На моей странице подтверждения перечислены все значения, оформленные определенным образом и изложенные определенным образом. Технически я заставил его работать, используя hook_theme_suggestions_webform_confirmation_alter и hook_theme, чтобы указать на мой шаблон ветки.

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

Я читал в других местах, чтобы использовать hook_preprocess_webform_confirmation и установить $variables['message']['#cache']['max-age'] = 0;. Однако это никогда не называется что, как я подозреваю, связано с тем, как я использовал свой шаблон Twig, упомянутый выше.

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

Функции в моем .module файле

function application_theme($existing, $type, $theme, $path) {
  $info = [
    'gib_application' => [
      'render element' => 'form',
      'template' => 'application-form'
    ],
    'application_form_confirmation' => [
      'template' => 'application-form-confirmation'
    ]
  ];
  return $info;
}

И

function application_theme_suggestions_webform_confirmation_alter(array &$suggestions, array $variables) {
  if (empty($variables['header'])) {
    $suggestions[] = 'application_form_confirmation';
  }
}

ОБНОВЛЕНИЕ

Я изменил свою функцию hook_theme на приведенную ниже, а также отключил hook_theme_suggestions_webform_confirmation_alter, предполагая, что это не имеет значения, пока hook_theme определяет правильное имя.

function application_theme($existing, $type, $theme, $path) {
  $info = [
    'gib_application' => [
      'render element' => 'form',
      'template' => 'application-form'
    ],
    'webform_confirmation__application_form' => [
      'template' => 'application-form-confirmation',
      'base hook' => 'webform_confirmation'
    ],
  ];
  return $info;
}

Вот предложения по веточке:

<!-- FILE NAME SUGGESTIONS:
   * webform-confirmation--application-form.html.twig
   x webform-confirmation.html.twig
-->

К сожалению, сейчас мой шаблон Twig вообще не загружается (из-за удаления hook_theme_suggestions_webform_confirmation_alter.

Author: SaRiD, 2018-10-31

3 answers

Похоже, что здесь есть две разные проблемы:

(a) Загрузка шаблона ветки из произвольной папки.

Не могли бы вы попробовать установить свойство темы path и посмотреть, позволяет ли это загружать ваш шаблон twig? Например:

'webform_confirmation__application_form' => [
  'template' => 'application-form-confirmation',
  'base hook' => 'webform_confirmation'
  'path' => \Drupal::moduleHandler()->getModule('application')->getPath() . '/templates',
],

(b) Изменение настроек кэша для части ваших переменных визуализации.

Вы должны убедиться, что теги кэша всплывают полностью из массива message. По-видимому:

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

Как упоминалось здесь => (https://www.previousnext.com.au/blog/ensuring-drupal-8-block-cache-tags-bubble-up-page)

Итак, одним из способов начать было бы попытаться отобразить всю переменную content в вашем шаблоне ветки, при условии, что вы прошли (a)

Обновление: Вы также можете попробовать вызвать \Drupal::service(''page_cache_kill_switch'')->trigger();, чтобы избежать вмешательства внутреннего кэша страницы в запрос и страницу погрузка.

Простым способом сделать это внутри шаблона ветки было бы использовать подход, аналогичный этому модулю => https://github.com/stefanospetrakis/twig_killswitch_trigger

Удачи!

P.S.: Пример кода также доступен здесь => https://www.drupal.org/sandbox/stefanospetrakis/3011610 , я могу продвинуть это до полного проекта, если есть какой-либо потенциальный интерес.

 4
Author: Stefanos Petrakis, 2018-11-06 01:51:38

Краткое изложение окончательного ответа на мои первоначальные вопросы.

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

function application_theme($existing, $type, $theme, $path) {
  $info = [
    'webform_confirmation__application_form' => [
      'base hook' => 'webform_confirmation'
    ]
  ];
  return $info;
}

hook_theme_suggestions_webform_confirmation_alter в конце концов, после правильной настройки hook_theme не требовалось.

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

<!-- FILE NAME SUGGESTIONS:
   * webform-confirmation--application-form.html.twig
   x webform-confirmation.html.twig
-->

Тире преобразуются в подчеркивания, т.е. webform-confirmation--application-form переводится в webform_confirmation__application_form.

Единственный переменная, связанная с этой частью массива, была base hook. Это означает, что нужно использовать начальную функциональность крючка, а не настраивать все заново в моем модуле - подробнее читайте здесь.

Базовый крючок: Используется только для предложений по теме: имя базового крючка темы. Вместо того, чтобы реализация этого предложения использовалась напрямую, базовый крючок будет вызван с этой реализацией в качестве первого предложения. Файлы базового крючка будут включены, а база функции предварительной обработки хука будут вызываться в дополнение к функциям предварительной обработки любого предложения. Если реализация hook_theme_suggestions_HOOK() (где HOOK является базовым крючком) изменяется порядок предложений, вместо этого предложения может быть использовано другое предложение . Если после hook_theme_suggestions_HOOK() это предложение остается первым предложением, то функция или шаблон этого предложения будут использоваться для создания отображаемого вывода.

template не было требуется до тех пор, пока имя файла моего файла Twig совпадало с тем, которое предлагал Twig. Для моего сайта это было webform-confirmation--application-form.html.twig.

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

Другой проблемой была страница подтверждения, кэшируемая для анонимных пользователей. Я смог решить эту проблему, используя \Drupal::service('page_cache_kill_switch')->trigger(); внутри hook_preprocess_webform_confirmation. После очистки кэша Drupal страница подтверждения больше никогда не будет кэшироваться.

function application_preprocess_webform_confirmation(array &$variables) {
  \Drupal::service('page_cache_kill_switch')->trigger();
}

Эта же логика будет применяться и для обновления шаблонов Twig в других модулях - это решение не только для модуля веб-формы.

Спасибо 4k4 и Стефанос за руководство.

 3
Author: SaRiD, 2018-11-06 03:17:46

Вы можете добавить следующую инструкцию в свой шаблон Twig, чтобы отключить кэширование.

{{ {'#cache': {'max-age': 0}} }}
 0
Author: ya.teck, 2019-06-23 07:22:19