【问题标题】:Zend form and annotations validationZend 表单和注释验证
【发布时间】:2014-05-20 08:02:59
【问题描述】:

我正在尝试使用注释来构建和验证 zend 表单。 但目前我在打开 showformAction 时收到错误消息:

“致命错误:未捕获的异常 'Zend\Form\Exception\InvalidElementException' 并带有消息 'No element by the name of [username] found in form' ...”

所以下面是我的代码。我做错了什么?

实体\用户.php

namespace Application\Model;
use Zend\Form\Annotation;

/**
 * @Annotation\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
 * @Annotation\Name("user")
 */
class User
{
    /**
     * @Annotation\Attributes({"type":"text" })
     * @Annotation\Validator({"type":"Regex","options":{"regex":"/^[a-zA-Z][a-zA-Z0-9_-]{1,19}/"}})
     * @Annotation\Options({"label":"Username:"})
     */
    public $username;

}

控制器\ProductsController.php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Json\Json;
use Zend\View\Model\JsonModel;
use Zend\View\Model\ViewModel;
use Zend\Debug\Debug;
use Application\Entity\Products;
use Application\Entity\Category;
use Application\Form\ProductsForm;
use Doctrine\ORM\EntityManager;
use Application\Model\User;
use Zend\Form\Annotation\AnnotationBuilder;

class ProductsController extends AbstractActionController {

    protected $albumTable;
    protected $em;
    protected $form;

  public function savetodb($data) {
        //code save to db ....
    }

    protected function getForm() {
        $entity = new User();
        $builder = new AnnotationBuilder();
        $this->form = $builder->createForm($entity);

        return $this->form;
    }

    public function showformAction() {
        $viewmodel = new ViewModel();
        $form = $this->getForm();
        $request = $this->getRequest();

        //disable layout if request by Ajax
        $viewmodel->setTerminal($request->isXmlHttpRequest());

        $is_xmlhttprequest = 1;
        if (!$request->isXmlHttpRequest()) {
            //if NOT using Ajax
            $is_xmlhttprequest = 0;
            if ($request->isPost()) {
                $form->setData($request->getPost());
                if ($form->isValid()) {
                    //save to db <span class="wp-smiley emoji emoji-wink" title=";)">;)</span>
                    $this->savetodb($form->getData());
                }
            }
        }

        $viewmodel->setVariables(array(
            'form' => $form,
            // is_xmlhttprequest is needed for check this form is in modal dialog or not
            // in view
            'is_xmlhttprequest' => $is_xmlhttprequest
        ));

        return $viewmodel;
    }

    public function validatepostajaxAction() {
        $form = $this->getForm();
        $request = $this->getRequest();
        $response = $this->getResponse();

        $messages = array();
        if ($request->isPost()) {
            $form->setData($request->getPost());
            if (!$form->isValid()) {
                $errors = $form->getMessages();
                foreach ($errors as $key => $row) {
                    if (!empty($row) && $key != 'submit') {
                        foreach ($row as $keyer => $rower) {
                            //save error(s) per-element that
                            //needed by Javascript
                            $messages[$key][] = $rower;
                        }
                    }
                }
            }

            if (!empty($messages)) {
                $response->setContent(\Zend\Json\Json::encode($messages));
            } else {
                //save to db <span class="wp-smiley emoji emoji-wink" title=";)">;)</span>
                $this->savetodb($form->getData());
                $response->setContent(\Zend\Json\Json::encode(array('success' => 1)));
            }
        }

        return $response;
    }

}

【问题讨论】:

  • 尝试添加@Annotation\Type("Zend\Form\Element\-whatever-")
  • 是的,我刚刚添加了,但仍然遇到同样的问题:(

标签: php annotations zend-framework2 zend-form


【解决方案1】:

你的注释应该是

/**
 * @Annotation\Type("Zend\Form\Element\Text")
 * @Annotation\Validator({"type":"Regex","options":{"regex":"/^[a-zA-Z][a-zA-Z0-9_-]{1,19}/"}})
 * @Annotation\Options({"label":"Username:"})
 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多