【问题标题】:How to ajaxify Zend_Form validation如何ajaxify Zend_Form 验证
【发布时间】:2012-08-14 15:53:31
【问题描述】:

我有一个 Zend_Form 子类。一些元素被设置为属于数组。

class My_Form extends Zend_Form {
   public function __construct() {
       $elem = $this->createElement('text','PROJECT_NAME',                
           array(
              'required' => true
       ));
       $elem->setBelongsTo('project');
       $this->addElement($elem);

       $elem = $this->createElement(
                'text','PLANNED_END_DATE',
                array(
                    'required' => true
                )
        );
        $elem->setBelongsTo('project');
        $elem->addValidator(new Zend_Validate_Date(array('format'=>'yyyy-MM-dd')));        
        $this->addElement($elem);     
        //and so on
   }

} 

我有一个通用验证控制器,它确实创建表单并检查错误,并以 json 格式返回它们:

class ValidateController extends Zend_Controller_Action
{

    public function formAction()
    {
         $params = $this->_getAllParams();
         if (isset($params['_frm'])) {
            $formName   = detect_the_form_class($params['_frm']);
            if (class_exists($formName)) {
                $form = new $formName();
                if ($form instanceof Zend_Form) {
                    $result = $form->isValidPartial($params);

                    $messages = $form->getMessages();


                    $this->getResponse()
                            ->setHeader('Content-Type', 'application/json')
                            ->setBody(json_encode(array(
                                'result' => $result,
                                'messages' => $messages
                            )));
                } else {
                    $this->getResponse()->setHttpResponseCode(500);
                }
            }

         }    
    }
}

这个控制器非常适合非数组表单,但是我现在需要验证 hase 数组的表单,例如名称为“project[PROJECT_NAME]”的元素。

但是 $form->getMessages() 返回以元素的基本名称为索引的消息,没有数组前缀。

实际结果是:

{ result: false,
  messages: {
     PROJECT_NAME: {isEmpty: "Value is required"},
     PROJECT_END_DATE: {isEmpty: "Value is required"}
  }
}

我需要的结果是:

{ result: false,
  messages: {
     "project[PROJECT_NAME]": {isEmpty: "Value is required"},
     "project[PROJECT_END_DATE]": {isEmpty: "Value is required"}
  }
}

或类似的东西,所以我可以找到验证消息的元素。

有什么想法吗?

【问题讨论】:

  • 可能对您的问题没有帮助,但您没有在 My_Form 类中调用 parent::construct()。通常你在__construct() 中的代码应该在init() 中。

标签: ajax json zend-framework zend-form


【解决方案1】:

对于子表单,使用Zend_Form_Subform 类:

class My_Form extends Zend_Form
{

    public function init()
    {
        $subForm = new Zend_Form_SubForm();

        $elem = $this->createElement('text', 'PROJECT_NAME', array(
            'required' => true
            ));
        $subForm->addElement($elem);

        $elem = $this->createElement('text', 'PLANNED_END_DATE', array(
            'required' => true
            ));

        $subForm->addElement($elem);
        $this->addSubForm($subForm, 'project');
    }
}

回复:

{
    "project":{
        "PROJECT_NAME":{"isEmpty":"Value is required and can't be empty"},
        "PLANNED_END_DATE":{"isEmpty":"Value is required and can't be empty"}
    }
}
  1. 对于表单配置,建议使用init() 方法。

  2. 对于 json 响应,您可以使用内置操作助手: $this->_helper->json($form->getMessages());

【讨论】:

  • 谢谢。我只是从 Zend_Form 开始,并不是所有的概念我都清楚。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多