zend-framework zend-form zend-form-element

Zend Framework: trabajar con elementos de formulario en notación de matriz



zend-framework zend-form (3)

Tienes que usar subformularios para obtener el resultado que buscas. La documentación fue todo un viaje, pero puedes encontrarla aquí

Usando lo que encontré allí construí el siguiente formulario

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

¿Qué salidas este 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 se envía, la publicación se ve así:

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

Así es como puedes crear 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 sobre las entradas ocultas.

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í:

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

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

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

Puedo agregar un elemento oculto a mi formulario y especificar una notación de matriz como esta:

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

Ahora si llento ese elemento con una matriz, espero que almacene los valores como una matriz y represente los elementos como el 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.


Para usar la notación de matriz, debe especificar que el elemento "pertenece a" una matriz primaria:

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


Esto parece ser un error en Zend Framework: el atributo de valor para un elemento se establece correctamente en una matriz, pero se ignora cuando el elemento representa: solo usa $this->view->escape($value) para generar el html del elemento . He resuelto esto implementando un asistente personalizado 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, cuando se usa 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 :)