#navi_header|PHP| PEAR Bug Report: http://pear.php.net/bugs/bug.php?id=4781 '' ver 3.2.5 で修正されました。 '' dateエレメントを利用する場合、setDefaults()を呼ばないと、コンストラクタで'format'で渡した日付フォーマットが正しくHTML化されません。 $form->addElement('date', 'date1', 'date1_capt', array('format' => '年月日:Y 年 m 月 d 日', ... このように、いわゆるPrefix/Suffixのあるformatの場合、setDefaults()を呼んでおかないとPrefix/SuffixがHTML化したとき表示されない問題があります。つまり、 '' "Y 年 m 月 d" までが解析されて表示され、"年月日:"および" 日"部分は表示されません。 '' これはdateエレメントのtoHtml()関数が呼ばれるタイミングに関係しており、レンダラクラスとは無関係に発生します。(QuickFormをダウンロードして付いてくるサンプルでも簡単に再現できる現象です。) これを解決するには、date.php のtoHtml()関数を以下の用に修正します。 - 修正前 function toHtml() { include_once('HTML/QuickForm/Renderer/Default.php'); $renderer =& new HTML_QuickForm_Renderer_Default(); $renderer->setElementTemplate($this->_wrap[0] . '{element}' . $this->_wrap[1]); parent::accept($renderer); return $renderer->toHtml(); } - 修正後 function toHtml() { include_once('HTML/QuickForm/Renderer/Default.php'); $renderer =& new HTML_QuickForm_Renderer_Default(); $renderer->setElementTemplate('{element}'); // ^^^^^^^^^^^ →$this->_wrapを削除 parent::accept($renderer); return $this->_wrap[0].$renderer->toHtml().$this->_wrap[1]; // ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ →こちらに$this->_wrapを追加 } formatの解析は、date.phpの_createElements()メソッド内で行われます。$this->wrap[0], [1]にそれぞれPrefix/Suffixが_createElements()内でセットされます。 問題は_createElements()の呼ばれるタイミングで、accept()(すなわちtoHtml)の呼ばれる前に、dateエレメントに対して何らかの値の操作を行うと、自動的に呼ばれます。たとえばsetDefaults()がそのケースです。逆に言えば値の操作なしでいきなりaccept()に入ると、その時点で初めてformatの解析が行われるわけです。 修正前のdate.phpではこの結果、いきなりaccept()が呼ばれると$this->wrap[]が空のままsetElementTemplateに流れ込み、結果としてPrefix/Suffixが取り込まれずにHTML化されるようです。 少しvar_dumpなどで解析した結果、setElementTemplate内では何らかのタイミングで_createElements()が呼ばれているようです。いきなりaccept()を呼んだ場合でも、setElementTemplateの前では$this->_wrapが空でしたが、呼んだ後ならちゃんとPrefix/Suffixが入っていました。 よって解決策としてはsetElementTemplateの「後に」$this->_wrapを利用することが考えられます。そこで、$this->_wrapをtoHtml()がリターンする直前に連結して使用するよう変更したわけです。これでとりあえずQuickForm添付のサンプルとか、自分で弄ってるSmartyRendererとかでは正常に表示されるようになりました・・・。 #navi_footer|PHP|