2

我是 Zend 框架的初学者。我想我的问题很基本......但我自己无法解决。

indexAction中,$request->isPost()总是假的。怎么了?

EntryController::indexAction

public function indexAction() {
    $form = new AgreementForm();
    $form->get('submit')->setValue('Go Entry Form');
    $request = $this->getRequest();
    if ($request->isPost()) {
        var_dump('//// $request->isPost() is true //////');
        if ($form->get('agreementCheck')) {
            // Redirect to list of entries
            return $this->redirect()->toRoute('entry');
        } else {
            return array('form' => $form);
        }
    } else {
        var_dump('//// $request->isPost() is false //////');
        return array('form' => $form);
    }
}

index.phtml 中的表格

<?php
$form = $this->form;
$form->setAttribute('action', $this->url('entry', array('action' => 'index')));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formCheckbox($form->get('agreementCheck'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
?>

AgreementForm是使用代码生成器生成的。 http://zend-form-generator.123easywebsites.com/formgen/create 如下。

class AgreementForm extends Form {

    public function __construct($name = null) {
        parent::__construct('');

        $this->setAttribute('method', 'post');

        $this->add(array(
            'name' => 'agreementCheck',
            'type' => 'Zend\Form\Element\MultiCheckbox',
            'attributes' => array(
                'required' => 'required',
                'value' => '0',
            ),
            'options' => array(
                'label' => 'Checkboxes Label',
                'value_options' => array(
                    '0' => 'Checkbox',
                ),
            ),
        ));

        $this->add(array(
            'name' => 'csrf',
            'type' => 'Zend\Form\Element\Csrf',
        ));

        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type' => 'submit',
                'value' => 'Go',
                'id' => 'submitbutton',
            ),
        ));
    }
}

请告诉我一些提示。

更新: 开发者工具分析结果,POST和GET同时工作。 在此处输入图像描述

更新: 路由器定义@module.config.php 就是这个。

'router' => array(
        'routes' => array(
            'entry' => array(
                'type' => 'segment',
                'options' => array(
                    'route' => '/entry[/][:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id' => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Entry\Controller\Entry',
                        'action' => 'index',
                    ),
                ),
            ),
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route' => '/',
                    'defaults' => array(
                        'controller' => 'Entry\Controller\Entry',
                        'action' => 'index',
                    ),
                ),
            ),
        ),
    ),
4

2 回答 2

1

有几点是不对的:

  1. 在表单类中添加一个 csrf 元素,但不会在视图中呈现它。这将导致验证错误。因此,您需要将其添加到您的视图中:

    echo $this->formHidden($form->get('csrf'));

  2. 您正在向表单添加一个 Multicheckbox 元素,但在您的视图中,您正在使用 formCheckbox 视图助手来呈现它。如果你真的想要一个 Multicheckbox,那么你应该使用 formMultiCheckbox 助手来渲染它:

    echo $this->formMultiCheckbox($form->get('agreementCheck'));

在这些更改之后,它应该可以工作。

编辑:您也可能希望将名称传递给表单构造函数:

parent::__construct('agreementform');
于 2013-08-03T20:03:20.330 回答
0

我想,你不需要明确说

$form->setAttribute('action', $this->url('entry', array('action' => 'index')));

省略那行,看看会发生什么。

于 2013-08-05T23:58:02.877 回答