2011-11-09 38 views
6

que lea este artículo: http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/Añadir un subformulario a un formulario con ajax en enviar

Eso fue muy interesante y funciona bien.

Necesito hacer lo mismo pero con un Subformulario. Quiero decir que cuando un usuario presiona un botón, llamo, a través de ajax, una acción que agrega, adjunta y muestra un subformulario a mi formulario existente.

Por ejemplo:
Tengo un formulario donde un usuario debe completar el nombre y el apellido de sus hijos, por lo que hay un botón "Agregar niño". Cuando el usuario presiona ese botón, se debe agregar un Subformulario a mi formulario existente y se debe mostrar. En el envío se validará exactamente como el ejemplo en ese artículo. La única diferencia es que allí solo agrega un solo campo. Necesito agregar un Subformulario, pero exactamente de la misma manera.

He intentado lo siguiente en mi acción (llamada por Ajax):

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

Esto casi funciona.
La vista de esta acción devuelve el código html del Subformulario, por lo que cuando tenga éxito mi llamada ajax solo la mostraré.

El problema es que al enviarlo valida el formulario pero ha perdido el nuevo subformulario recién agregado. Eso no sucede en el artículo con solo un elemento. Creo que solo necesito agregar el Subformulario al Formulario existente, pero ¿cómo?

+0

Hola Samuele debe comprobar la biblioteca de validación js para asegurar lo que hace, Como i saber que la mayoría de las bibliotecas añaden validación al formulario y al ID si añades un formulario diferente (Formulario dentro del formulario) No validará la forma completa –

Respuesta

2

Agregue un prefijo del subformulario a los elementos del subformulario. Usé el prefijo "niño" para representar los subformularios. Cada subformulario se creará como child1, child2 y así sucesivamente.

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 

} 

Luego, en la función de prevalidación, filtrar los subformularios utilizando el prefijo de subformulario, en lugar del nombre del campo:

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

}

Agregar función Nuevo formulario crea cada uno de los sub formularios y se une a la forma principal:

 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] Usando setIsArray para un cre subformulario ates cada elemento del subformulario como un elemento de matriz. Simplifica la función preValidate. Editó el código para utilizar esta función.

Véase el complete code in pastebin

Aquí hay otra solución utilizando belongsTo, proporcionando notación de matriz a los elementos de formulario substitución: http://www.stephenrhoades.com/?p=364

Cuestiones relacionadas