home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

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

作成日: 2005-08-14 22:50:04   /   last updated at: 2008-12-21 22:52:06
カテゴリ: 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()されるときに含まれる
original url: https://www.glamenv-septzen.net/view/52