2010-09-08 10 views
17

Me gustaría poder agregar un campo de formulario oculto utilizando la notación de matriz a mi formulario. Puedo hacer esto con HTML así:Zend Framework: Trabajar con elementos de formulario en la notación de matriz

<input type="hidden" name="contacts[]" value="123" /> 
<input type="hidden" name="contacts[]" value="456" /> 

Cuando el formulario se presentó, la matriz $_POST contendrá los valores de los elementos ocultos agrupados como una matriz:

array(
    'contacts' => array(
     0 => '123' 
     1 => '456' 
    ) 
) 

puedo añadir un elemento oculto a mi forma, y ​​especificar notación de matriz de esta manera:

$form->addElement('hidden', 'contacts', array('isArray' => true)); 

Ahora bien, si me pueblan ese elemento con una matriz, espero que debería almacenar los valores como una matriz, y hacer que la elementos como el código HTML que se muestra arriba:

$form->populate($_POST); 

Sin embargo, esto no funciona. Puede haber un error en la versión de Zend Framework que estoy usando. ¿Lo estoy haciendo bien? ¿Qué debería hacer de manera diferente? ¿Cómo puedo lograr el resultado anterior? Estoy dispuesto a crear un elemento de formulario personalizado si es necesario. Solo déjame saber lo que necesito hacer.

Respuesta

15

Para utilizar notación de matriz, es necesario especificar que el elemento "pertenece a" una matriz padres:

$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123')); 
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456')); 
+1

esto genera , sin embargo si necesita contactos [123] y número [123] esto no funcionará – max4ever

+0

Tengo una matriz de longitud variable que se debe agregar a mis controles de paginación Zend. Hice lo siguiente: '$ this-> formHidden ($ key." [". $ K."] ", $ V, array ('belongsTo' => $ key));' – thepriebe

17

Tienes que usar subformularios para obtener el resultado que buscas. La documentación fue todo un viaje, pero se puede encontrar here

Usando lo que encontré allí construyó la siguiente forml

<?php 

class Form_Test extends Zend_Form { 

    public function init() { 
     $this->setMethod('post'); 
     $this->setIsArray(true); 

     $this->setSubFormDecorators(array(
      'FormElements', 
      'Fieldset' 
     )); 

     $subForm = new Zend_Form(array('disableLoadDefaultDecorators' => true)); 

     $subForm->setDecorators(array(
      'FormElements', 
     )); 

     $subForm->addElement('hidden', 'contacts', array(
      'isArray' => true, 
      'value' => '237', 
      'decorators' => Array(
       'ViewHelper', 
      ), 
     )); 

     $subForm2 = new Zend_Form(array('disableLoadDefaultDecorators' => true)); 

     $subForm2->setDecorators(array(
      'FormElements', 
     )); 

     $subForm2->addElement('hidden', 'contacts', array(
      'isArray' => true, 
      'value' => '456', 'decorators' => Array(
       'ViewHelper', 
      ), 
     )); 

     $this->addSubForm($subForm, 'subform'); 
     $this->addSubForm($subForm2, 'subform2'); 


     $submit = new Zend_Form_Element_Submit('submit'); 
     $submit->setValue('Submit'); 

     $this->addElement('submit', 'submit'); 
    } 

} 

Wich emite este código HTML:

<form enctype="application/x-www-form-urlencoded" method="post" action=""><dl class="zend_form"> 
<input type="hidden" name="contacts[]" value="237" id="contacts"> 

<input type="hidden" name="contacts[]" value="456" id="contacts"> 

<dt id="submit-label">&nbsp;</dt><dd id="submit-element"> 

<input type="submit" name="submit" id="submit" value="submit"></dd></dl></form> 

Y cuando submited el puesto se parece a:

array(2) { 
    ["contacts"] => array(2) { 
    [0] => string(3) "237" 
    [1] => string(3) "456" 
    } 
    ["submit"] => string(6) "submit" 
} 

Así que eso es cómo se puede crear e el tipo de formas que buscas. ¡Espero que esto ayude! si tienes una pregunta publica un comentario!

Es bastante hackish si me preguntas. Básicamente se crean subformularios pero se desactivan los decoradores de forma, solo se obtiene el resultado del elemento. Dado que los elementos de contactos idénticos [] están en objetos de formas diferentes, zend no los sobrescribe y funciona. Pero sí ...

Editar: lo cambié un poco para eliminar etiquetas y basura en las entradas ocultas.

+1

+1 a usted por la respuesta. ;-) Pero -1 a ZF por requerir esto. ¿Subformular solo para crear estos campos ocultos en la notación de matriz? Ugh. Mejor sería una clave de configuración que podría establecer en el elemento que iniciaría toda esta locura de subformulario para usted. Supongo que podríamos implementar un elemento personalizado que haga esto. –

+1

@DavidW Sí, siempre uso viewhelpers o simplemente extiendo mis propios formularios. Tal dolor para trabajar con decoradores y aprovechar zend_form. Pero ZF 2.0 tiene formas mucho mejores, creo (¡espero!). Thansk para el voto popular. – Iznogood

8

De hecho, esto parece ser un error en Zend Framework - el atributo de valor para un elemento está correctamente se establece en matriz, pero se ignora cuando el elemento se renderiza; solo usa $this->view->escape($value) para generar el html del elemento. He resuelto esto mediante la implementación de un ayudante a medida para tales elementos:

class My_View_Helper_HiddenArray extends Zend_View_Helper_FormHidden 
{ 
    public function hiddenArray($name, $value = null, array $attribs = null) 
    { 
     if (is_array($value)) { 
      $elementXHTML = ''; 
      // do not give element an id due to the possibility of multiple values 
      if (isset($attribs) && is_array($attribs) && array_key_exists('id', $attribs)) { 
       unset($attribs['id']); 
      } 

      foreach ($value as $item) { 
       $elementXHTML .= $this->_hidden($name, $item, $attribs); 
      } 
      return $elementXHTML; 

     } else { 
      return $this->formHidden($name, $value, $attribs); 
     } 
    } 
} 

que, utilizados de la siguiente manera:

$contacts = $form->createElement('hidden', 'contacts') 
->setIsArray(true) 
->setDecorators(array(
    array('ViewHelper', array('helper' => 'HiddenArray')), 
)); 
$form->addElement($contacts); 

genera la salida necesaria.

La razón para extender Zend_View_Helper_FormHidden aquí es solo para poder llamar al comportamiento predeterminado si no se establece un valor de matriz (return parent::formHidden($name, $value, $attribs)).

Espero que esto ayude a alguien :)

+1

Sí, prefiero esta respuesta:) Extender los archivos centrales de Zend Framework siempre fue divertido para mí. –

Cuestiones relacionadas