2012-08-14 41 views
1

我有一個Zend_Form子類。一些元素被設置爲屬於數組。如何ajaxify 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"} 
    } 
} 

或類似的東西,所以我能找到的確認消息的元素。

任何想法?

+0

可能不利於你的問題,但你是不是在'類My_Form'父::結構()調用。通常'__construct()'中的代碼應該放在'init()'中。 – vascowhite 2012-08-14 20:54:58

回答

0

對於子表單使用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());

+0

謝謝。我只是從Zend_Form開始,並不是所有的概念對我都很清楚。 – SWilk 2012-08-16 07:06:24

+0

沒問題,樂意幫忙 – 2012-08-16 11:24:37