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

PHP/HTML_QuickFormメモ/20050710/dateエレメントの日付フォーマット

PHP/HTML_QuickFormメモ/20050710/dateエレメントの日付フォーマット

PHP / HTML_QuickFormメモ / 20050710 / dateエレメントの日付フォーマット
id: 50 所有者: msakamoto-sf    作成日: 2005-07-10 22:40:56
カテゴリ: 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とかでは正常に表示されるようになりました・・・。



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