web-dev-qa-db-ja.com

カスタムTwig確認Webフォームページのテンプレートがキャッシュされすぎる

プロジェクトに必要な追加のフォーム処理とスタイル設定を行うカスタムモジュールを作成しました-これはすべて正常に機能しています。

フォームのサイズが原因で-50の奇数フィールド-Twigで管理する方がはるかに簡単なので、確認画面用にIDEファイルをモジュールに設定しています。 GUIを使用するよりも。私の確認ページには、特定の方法でスタイル設定され、特定の方法でレイアウトされたすべての値が一覧表示されます。技術的にはhook_theme_suggestions_webform_confirmation_alterhook_themeを使用してTwigテンプレートを指すことで、技術的に機能しています。

しかし、最近発見したのは、Drupal 8の内部ページキャッシュが匿名ユーザーにとって非常に積極的であるため、実際の送信値に関係なく、確認ページがすべてのユーザーに対してキャッシュされることです。そのため、最初のユーザーは問題ありませんが、それ以降の2回目の送信では、最初のユーザーからキャッシュされたバージョンが取得されます。

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

Twigの提案は次のとおりです。

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

残念ながら、現在Twigテンプレートはまったく読み込まれていません(hook_theme_suggestions_webform_confirmation_alterを削除したため)。

4
SaRiD

私の元の質問に対する最終的な回答の要約。

_hook_theme_は、モジュールで提案されたTwigテンプレートに使用できることを示すために、依然として必要でした。

_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デバッガーによって提案された提案された名前を持つ必要がありました。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は、my Twigファイルが1つのファイルと一致する限り必要ありませんでしたTwigが示唆していました。私のサイトでは_webform-confirmation--application-form.html.twig_。

上記の調整により、my Twigファイルは正しく読み込まれていましたが、webformモジュールからの元のフックもすべて使用しています。

もう1つの問題は、匿名ユーザーのためにキャッシュされる確認ページでした。 _hook_preprocess_webform_confirmation_内で\Drupal::service('page_cache_kill_switch')->trigger();を使用してこれを解決できました。 Drupalのキャッシュをクリアした後は、確認ページが再度キャッシュされることはありません。

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

これと同じロジックが、他のモジュールのTwigテンプレートの更新にも適用されます。これはWebformモジュールのみのソリューションではありません。

ガイダンスを提供してくれた 4k4Stefanos に感謝します。

3
SaRiD

ここには2つの異なる問題があるようです:

(a)任意のフォルダからtwigテンプレートをロードします。

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

したがって、最初の1つの場所は、content変数全体をtwigテンプレートでレンダリングすることです。

更新:\Drupal::service(''page_cache_kill_switch'')->trigger();を呼び出して、内部ページキャッシュがリクエストとページの読み込みを妨げないようにすることもできます。

twigテンプレート内でこれを行う簡単な方法は、このモジュールと同様のアプローチを使用することです=> https://github.com/stefanospetrakis/twig_killswitch_trigger

幸運を!

PS:サンプルコードもこちらから入手できます=> https://www.drupal.org/sandbox/stefanospetrakis/301161 、潜在的な興味があれば、これを完全なプロジェクトにプロモートすることができます。

4

次のステートメントをTwigテンプレートに追加して、キャッシュをオフにすることができます。

{{ {'#cache': {'max-age': 0}} }}
0
ya.teck