[Zend Framework] Zend_Form: Zend_Form_Element をHTML5要素に対応させる

Zend_Form_Element で使える input タグで type=”date” を使いたくて悩んだ記録です。
Zend Framework Version: 1.12.3

ZF2では普通に使えるようなのですが、ZF1ではHTML5タグが作れなかったので悩みました。
さんざん悩んだあげく、Zend_Form_Element_Text を複製して作ったという…。
他にうまい方法がありましたら、ぜひ教えて下さい。

Form_Element

下記をもとに作成します。

  • /usr/local/zend/share/ZendFramework/library/Zend/Form/Element/Text.php

コメントは省略。

library/my/Date.php
<?php
/** Zend_Form_Element_Xhtml */
require_once 'Zend/Form/Element/Xhtml.php';
class My_Date extends Zend_Form_Element_Xhtml
{
    /**
     * Default form view helper to use for rendering
     * @var string
     */
    public $helper = 'formDate';
}

View_Helper

ビューヘルパーを呼んでいるので、下記を元に作成します。

  • /usr/local/zend/share/ZendFramework/library/Zend/View/Helper/FormText.php

コメントは省略。

applecation/views/helpers/FormDate.php
<?php
require_once 'Zend/View/Helper/FormElement.php';
class Zend_View_Helper_FormDate extends Zend_View_Helper_FormElement
{
    public function formDate($name, $value = null, $attribs = null)
    {
        $info = $this->_getInfo($name, $value, $attribs);
        extract($info); // name, value, attribs, options, listsep, disable
        // build the element
        $disabled = '';
        if ($disable) {
            // disabled
            $disabled = ' disabled="disabled"';
        }
        $xhtml = '<input type="date"'
                . ' name="' . $this->view->escape($name) . '"'
                . ' id="' . $this->view->escape($id) . '"'
                . ' value="' . $this->view->escape($value) . '"'
                . $disabled
                . $this->_htmlAttribs($attribs)
                . $this->getClosingBracket();
        return $xhtml;
    }
}

使い方

Zend_Form_Element_Text から変更した箇所は、date で呼べるように名前を変えたことと、type=”date” の部分だけです。

こんな感じで呼び出して使えました。

application/controllers/IndexController.php
<?php
require_once 'My/Date.php';
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        // action body
        $form = new Zend_Form();
        $form->setMethod('post')->setAction('/index');
        $text = new Zend_Form_Element_Text('text');
        $text
            ->setLabel('Text');
        $date = new My_Date('date');
        $date
            ->setValue('2013-08-01')
            ->setLabel('Date');

Glitch というライブラリを使うと、キレイに解決するようです。