今回は Zend Framework 2 でフォームを作成する。

いつものとおり、ZendSkeletonModule を改造する。モジュール名、ネームスペースは FormTest1、コントローラ名は Form1Controller とした。

コントローラ側のソース、Form1Controller.php は以下のとおり。

<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/FormTest1 for the canonical source repository
 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */
 
namespace FormTest1\Controller;
 
use Zend\Mvc\Controller\AbstractActionController;
 
use Zend\Captcha;
use Zend\Form\Element;
use Zend\Form\Form;
 
class Form1Controller extends AbstractActionController
{
    public function indexAction()
    {
        $name = new Element('name');
        $name->setLabel('Your name');
        $name->setAttributes(array('type' => 'text'));
 
        $email = new Element\Email('email');
        $email->setLabel('Your email address');
 
        $subject = new Element('subject');
        $subject->setLabel('Subject');
        $subject->setAttributes(array('type' => 'text'));
 
        $message = new Element\Textarea('message');
        $message->setLabel('Message');
 
        $captcha = new Element\Captcha('captcha');
        $captcha->setCaptcha(new Captcha\Dumb());
        $captcha->setLabel('Please verify you are human.');
 
        $csrf = new Element\Csrf('security');
 
        $send = new Element('send');
        $send->setValue('Submit');
        $send->setAttributes(array('type' => 'submit'));
 
        $form = new Form('contact');
 
        $form->add($name);
        $form->add($email);
        $form->add($subject);
        $form->add($message);
        $form->add($captcha);
        $form->add($csrf);
        $form->add($send);
 
        return array('form' => $form);
    }
 
    public function fooAction()
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            return array('datas' => $request->getPost());
        }
        return $this->redirect()->toRoute('formtest1');
    }
}


また、ビュー側のソース、index.phtml は以下のようにした。
<?php
// within a view script
$form = $this->form;
$form->prepare();
 
// Assuming the "form1/foo" route exists...
$form->setAttribute('action', 'form1/foo');
 
// Set the method attribute for the form
$form->setAttribute('method', 'post');
 
// Get the form label plugin
$formLabel = $this->plugin('formLabel');
 
// Render the opening tag
echo $this->form()->openTag($form);
?>
<div class="form_element">
<?php
    $name = $form->get('name');
    echo $formLabel->openTag() . $name->getOption('label');
    echo $this->formLabel($name);
    echo $this->formInput($name);
    echo $this->formElementErrors($name);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $email = $form->get('email');
    echo $formLabel->openTag() . $email->getOption('label');
    echo $this->formLabel($email);
    echo $this->formInput($email);
    echo $this->formElementErrors($email);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $subject = $form->get('subject');
    echo $formLabel->openTag() . $subject->getOption('label');
    echo $this->formLabel($subject);
    echo $this->formInput($subject);
    echo $this->formElementErrors($subject);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $message = $form->get('message');
    echo $formLabel->openTag() . $message->getOption('label');
    echo $this->formLabel($message);
    echo $this->formTextarea($message);
    echo $this->formElementErrors($message);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $captcha = $form->get('captcha');
    echo $formLabel->openTag() . $captcha->getOption('label');
    echo $this->formLabel($captcha);
    echo $this->formCaptcha($captcha);
    echo $this->formElementErrors($captcha);
    echo $formLabel->closeTag();
?></div>
 
<?php echo $this->formElement($form->get('security')) ?>
<?php echo $this->formElement($form->get('send')) ?>
 
<?php echo $this->form()->closeTag() ?>

続いて foo.phtml のソース。ポストされたデータを表示するだけである。
<div>
<strong>datas:</strong>
<?php var_dump($this->datas); ?>
</div>

実行してみる。初期表示。
zendframework2-6

入力後、ボタンを押した状態。
zendframework2-7

以上。