画面がキャッシュから生成されるとは
画面がキャッシュから生成されたかどうかは、開発ツールで確認できる。
キャッシュじゃない場合
キャッシュから生成された場合
通常時とキャッシュから生成されるパターン
新規に画面を開く、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も呼ばれるようになった。