home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

PHP/HTML_QuickFormメモ/20050814/hierselect使用時の注意点

PHP/HTML_QuickFormメモ/20050814/hierselect使用時の注意点

PHP / HTML_QuickFormメモ / 20050814 / hierselect使用時の注意点
id: 52 所有者: msakamoto-sf    作成日: 2005-08-14 22:50:04
カテゴリ: PHP 

hierselect(階層化selectメニュー)はQuickFormの中でも、dateと並んでおもしろい使い勝手を実現しているエレメントです。

が。
使うときにちょっとしたミスをしたため 「動かねえ~~~。JavaScriptでエラーでてるっぽい~~。_hs_swapOptionsとかいう関数が何で出力されないんじゃあ~~~」 という具合に見事嵌ってしまいました。

えーっとですね。まず、hierselectはJavaScriptで高度な階層化メニュー構造を実装しています*1。んで、hierselectってHTMLコードを生成するときに、使用するJavaScript関数を何回も出力してしまわないよう、内部で defineによるフラグを管理 してます。(何回も出力すると当然JavaScriptのエラーになってしまうので。)

んで、今回嵌ったのは次のような状況です。

  1. QuickFormオブジェクトを、スクリプト全体で二つ用意していた。
  2. それぞれのQuickForm毎にそれぞれhierselectをaddElementしていた。
  3. それぞれSmartyArray派生のレンダラを用いて、Smartyにassign()していた。
  4. 最初にassign()していたQuickFormオブジェクトを、意図的にSmartyテンプレート側で無視していた。

以上のような状況だと、最初のQuickFormオブジェクトで、hierselectのJavaScriptがSmartyにassign()されます。二つめのQuickFormオブジェクトがassign()、すなわちtoArray()(←toHtml())される場合は、既にdefineフラグが立っていますので、hierselectのJavaScriptはHTMLコードに含まれません。
ところが、最初のQuickFormオブジェクトがassign()されたHTMLを、Smartyのテンプレート側で無視して出力していません。

→その結果、最初のQuickFormオブジェクトがtoHtml()されたHTMLコードに含まれているJavaScriptが出力されないため、二つめのQuickFormに含まれるhierselectのJavaScriptは動きません。

えーっと、そんな具合で。とにかく、「最初の一度だけ出力されるJavaScriptを出力していなかった」為に、続くhierselectのHTMLコードが軒並みHTMLエラーになってしまった・・・という話。

というわけで、複数作ったQuickFormオブジェクトを、それぞれで出力したりしなかったりすると、結構嵌るかもしれないです。特にテンプレート使ってて、toHtml()はしてるが肝心のテンプレートの方でそれを出力していないと・・・こうした「一回目のtoHtml()」が出力されないんで、結構嵌るかも知れません。


*1: toHtml()されるときに含まれる

プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2008-12-21 22:52:06
md5:566d9663895d91dd0f32c9e3396933fd
sha1:f9926a40e36a8129ab682be3a8998af8014cfb8f
コメント
コメントを投稿するにはログインして下さい。