2011-11-09 3 views
6

는이 기사 읽기 : http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/제출에 아약스와 폼에 하위 폼을 추가

매우 흥미로웠다 그리고 그것을 잘 작동합니다.

동일한 작업을 수행해야하지만 SubForm을 사용해야합니다. 사용자가 버튼을 누르면 아약스를 통해 기존 폼에 하위 폼을 추가, 부착 및 표시하는 동작을 호출한다는 것을 의미합니다.

예 :
나는 사용자가 자녀의 이름과 성을 기입해야하는 양식을 가지고 있으므로 "Add Child"버튼이 있습니다. 사용자가 해당 버튼을 누르면 SubForm을 기존 양식에 추가하여 표시해야합니다. 제출시 해당 기사의 예와 똑같이 유효성을 검사합니다. 유일한 차이점은 단일 필드를 추가한다는 것입니다. SubForm을 추가해야하지만 정확히 같은 방식으로해야합니다. 이 거의 작동

public function clonerecursivegroupAction() 
{ 
    $this->_helper->layout->disableLayout(); 
    $ajaxContext = $this->_helper->getHelper('AjaxContext'); 
    $ajaxContext->addActionContext('clonerecursivegroup', 'html')->initContext(); 

    $id = $this->_getParam('id', null); 

    $subform1 = new Zend_Form_SubForm(); 

    $Element1 = $subform1->createElement('text', 'text1'); 
    $Element1->setLabel('text1')->setRequired(true); 
    $Element2 = $subform1->createElement('text', 'text2'); 
    $Element2->setLabel('text2')->setRequired(false); 

    $subform1->addElement($Element1); 
    $subform1->addElement($Element2); 

    $this->view->field = $subform1->__toString(); 
} 

:

은 내가 (아약스 호출) 내 행동에 다음과 같은 노력했다.
이 액션 뷰는 SubForm의 html 코드를 반환하므로 내 아약스 호출 성공시 나는 단지 그것을 표시한다.

문제는 제출시 양식의 유효성을 검사하지만 방금 추가 된 새 하위 양식이 손실되었음을 나타냅니다. 그것은 단지 하나의 요소가있는 기사에서 발생하지 않습니다. 난 그냥 기존 양식에 SubForm을 추가해야한다고 생각하지만 어떻게?

+0

안녕 SAMUELE 를 내가 대부분의 라이브러리가 양식과 ID에 유효성 검증을 추가하는 경우 다른 양식을 추가하는 경우 (양식을 양식에 넣기) 완전한 양식의 유효성을 검증하지 않습니다. –

답변

2

하위 양식의 접두사를 하위 양식 요소에 추가하십시오. 하위 양식을 나타 내기 위해 접두사 "하위"를 사용했습니다. 각 하위 양식은 child1, child2 등으로 작성됩니다.

public function clonerecursivegroupAction() 
{ 
     //.. Other code 

     $subform = new Zend_Form_SubForm(); 
    $subform->setIsArray(true); 
    $subform->setName("child$id"); 
    $Element1 = $subform->createElement('text', "newfield$id"); 
    $Element1->setLabel("newfield$id") 
      ->setRequired(true); 
    $subform->addElement($Element1); 

    $Element1 = $subform->createElement('text', "nextfield$id"); 
    $Element1->setLabel("nextfield$id") 
      ->setRequired(true); 

    $subform->addElement($Element1); 

    $this->view->field = $subform; 
// Rest of your statements 

} 

그리고, preValidation 함수 대신에 필드 명 중, 하위 프리픽스를 사용하여 하위 폼 필터 :

public function preValidation(array $data) { 
     // array_filter callback 
     function findForms($field) { 
     // return field names that include 'child' 
      if (strpos($field, 'child') !== false) { 
       return $field; 
      } 
     } 

     $subForms = array_filter(array_keys($data), 'findForms'); //filter the subform elements 

     $children = array(); 
     foreach ($subForms as $subform) { 

      if (is_array($data[$subform])) { 
     $children[$subform] = $data[$subform]; 
     } 

     } 

     //Iterate the children 
     foreach ($children as $key => $fields) { //$key = subformname, $field=array containing fiend names and values 

     // strip the id number off of the field name and use it to set new order 
     $order = ltrim($key, 'child') + 2; 
     $this->addNewForm($key, $fields, $order); 
    } 

}

새로운 폼 기능 부 형태를 각각 생성 추가 메인 양식에 부착합니다 :

 public function addNewForm($form, $elements, $order) { 

      $subform = new Zend_Form_SubForm(); 
    $subform->setIsArray(true); 
    foreach ($elements as $key => $el) { 
      $Element1 = $subform->createElement('text', $key); 
       $Element1->setLabel($form.$key) 
      ->setValue($el) 
       ->setRequired(true); 
        $subform->addElement($Element1); 
    } 
     $this->addSubForm($subform, $form, $order); 

    } 

[EDIT] 하위 양식 cre에 setIsArray 사용 는 서브 폼의 각 요소를 배열 요소로 가져옵니다. preValidate 함수를 단순화합니다. 이 기능을 활용하도록 코드를 수정했습니다.

다음은 complete code in pastebin

는 서브 폼 요소에 배열 표기법을 제공 belongsTo를 사용하여 다른 솔루션입니다 참조 : 으로, 당신은 JS 검증 라이브러리가 무엇을 보장하기 위해 확인해야 http://www.stephenrhoades.com/?p=364