Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

キャッシュじゃない場合

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away