如何ajaxify Zend_Form验证

时间:2012-08-14 15:53:31

标签: ajax json zend-framework zend-form

我有一个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"}
  }
}

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

对于子表单,请使用Zend_Form_Subform class:

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());

相关问题