#navi_header|PHP| hierselect(階層化selectメニュー)はQuickFormの中でも、dateと並んでおもしろい使い勝手を実現しているエレメントです。 '' が。 '' 使うときにちょっとしたミスをしたため &size(20px) {「動かねえ~~~。JavaScriptでエラーでてるっぽい~~。_hs_swapOptionsとかいう関数が何で出力されないんじゃあ~~~」 } という具合に見事嵌ってしまいました。 えーっとですね。まず、hierselectはJavaScriptで高度な階層化メニュー構造を実装しています((toHtml()されるときに含まれる))。んで、hierselectってHTMLコードを生成するときに、使用するJavaScript関数を何回も出力してしまわないよう、内部で '' defineによるフラグを管理 '' してます。(何回も出力すると当然JavaScriptのエラーになってしまうので。) んで、今回嵌ったのは次のような状況です。 + QuickFormオブジェクトを、スクリプト全体で二つ用意していた。 + それぞれのQuickForm毎にそれぞれhierselectをaddElementしていた。 + それぞれSmartyArray派生のレンダラを用いて、Smartyにassign()していた。 + '' 最初に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()」が出力されないんで、結構嵌るかも知れません。 #navi_footer|PHP|