4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-12

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

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

キャッシュじゃない場合

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も呼ばれるようになった。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?