[Zend Framework] Zend_Form: Zend_Form を使った form

Twitter Bootstrap の class も追加してみた。

Zend_Form 2013-07-13 11-13-00

ビューファイルには下記を書くだけで良い。

application/views/scripts/index/sitemap.phtml
<?= $this->form->render() . PHP_EOL; ?>

このあたりも含めて書いてみる。

application/controllers/IndexController.php
<?php
require_once 'My/Date.php';
class IndexController extends Zend_Controller_Action
{
    public function sitemapAction()
    {
        // action body
        $form = new Zend_Form();
        $form
            ->setMethod('post')
            ->setAction(
                $this->view->url(array('controller' => 'index',
                                       'action'     => 'sitemap',
                                       'module'     => 'default'),
                                       'sitemap')
            );
        $text = new Zend_Form_Element_Text('text');
        $decorators = array(
            array('ViewHelper'),
            array('Errors'),
            array('Description', array('tag' => 'span', 'class' => 'help-block')),
            array('HtmlTag', array('tag' => 'dd')),
            array('Label', array('tag' => 'dt')),
        );
        $text
            ->setAttrib('placeholder', 'Type something…')
            ->setDescription('Example block-level help text here.')
            ->setDecorators($decorators)
            ->setLabel('Text')
            ->addFilter('StringToLower')
            ->setRequired(true);
        $date = new My_Date('date');
        $date
            ->setValue('2013-08-01')
            ->setLabel('Date')
            ->setRequired(true)
            ->addValidator('Date');
        $send = new Zend_Form_Element_Submit('send');
        $send
            ->setAttrib('class', 'btn');
        $form
            ->setAttrib('class', 'form-horizontal')
            ->addElement($text)
            ->addElement($date)
            ->addElement($send);
        $this->view->assign('form', $form);
        if ($this->getRequest()->isPost()) {
            if ($form->isValid($this->getRequest()->getPost())) {
                $text = $this->getRequest()->getParam('text');
                $date = $this->getRequest()->getParam('date');
                $data = array(
                    'text' => $text,
                    'date' => $date
                );
                Zend_Debug::dump($data);
            }
        }
    }
}

追記(2013/07/16)
最後のformの値を取得する方法ですが、下記のように書くだけでいいんですね。

application/controllers/IndexController.php
        if ($this->getRequest()->isPost()) {
            if ($form->isValid($this->_getAllParams())) {
                $data = $form->getValues();
                Zend_Debug::dump($data);
            }
        }

補遺

form-horizontal を class につけたが、もっとタグを足さないと表示されないことに気がつきました。
といっても、デコレータが大変そうだなと思いグーグル先生に聞いたところ、こんなライブラリがありました。

ということでメモ。

その他