PHP
Drupal
Drupal7

Drupal7 フォームをキャッシュから生成するときbuild_idをrebuildする方法

画面がキャッシュから生成されるとは

画面がキャッシュから生成されたかどうかは、開発ツールで確認できる。

キャッシュじゃない場合

image.png

キャッシュから生成された場合

image.png

通常時とキャッシュから生成されるパターン

新規に画面を開く、URLから遷移する、Submitで次の画面に遷移するなどの場合、通常生成。history back(ブラウザの戻るボタン)などで戻った場合、キャッシュから画面が生成される。

Drupalのrebuild

Drupalでフォーム画面を表示した際、build_idを持っている。
同じURLでも $form_state['rebuild'] = TRUE; とすることで、build_idが再生成される。
しかし、history back等で戻った場合は、build_idの再生成は行われない。

build_idをrebuildしないことで発生した問題

画面はrebuildを行わなくても問題なく表示されたが、ajaxによるcallback関数が実行されず、正常に動作できない問題が発生した。

解決策

解決策としては、キャッシュから画面を生成した場合でも、build_idを再生成してあげる。

キャッシュから画面を生成したときにbuild_idをrebuildする方法

immutable を使用する。

Drupal 7 の $form_state についてのまとめ | Drupal専門の開発会社 Studio Umi

以下、一部抜粋

  • $form_state の代表的な要素:
    • build_info: 内部で使用。 Form API によって保持される情報の連想配列。もともとのコンテクストが利用できなくなったときにフォームをキャッシュからビルド/リビルドするときに必要です。
      • immutable: このフラグが TRUE にセットされると、フォームがキャッシュから読み込まれるときにフォームビルド ID が新たに生成されます。後ほどキャッシュへの保存が再度行われる際には別のキャッシュ ID を持ちます。結果として、もともとのフォームと form_state は変更されずに残ります。これは、ページキャッシュが有効なときに匿名ユーザの間で form_state が漏れるのを防ぐために重要です。

$form_state['build_info']['immutable'] = TRUE; を設定することで、history backした際でもbuild_idがrebuildされるようになった。

結果、ajaxのcallbackも呼ばれるようになった。