hierselect(階層化selectメニュー)はQuickFormの中でも、dateと並んでおもしろい使い勝手を実現しているエレメントです。
が。
使うときにちょっとしたミスをしたため 「動かねえ~~~。JavaScriptでエラーでてるっぽい~~。_hs_swapOptionsとかいう関数が何で出力されないんじゃあ~~~」 という具合に見事嵌ってしまいました。
えーっとですね。まず、hierselectはJavaScriptで高度な階層化メニュー構造を実装しています(*1)。んで、hierselectってHTMLコードを生成するときに、使用するJavaScript関数を何回も出力してしまわないよう、内部で defineによるフラグを管理 してます。(何回も出力すると当然JavaScriptのエラーになってしまうので。)
んで、今回嵌ったのは次のような状況です。
以上のような状況だと、最初の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()」が出力されないんで、結構嵌るかも知れません。