2011-05-18 13 views
6

Me gustaría crear un formulario que permita al usuario ingresar cualquier cantidad de valores, cada uno en un campo de texto separado usando una notación de matriz. El ejemplo esperada salida HTML es:Anotación de matriz Zend_Form sin índices

<dd id="dupa-element"> 
    <input type="text" name="dupa[]" value=""> 
    <input type="text" name="dupa[]" value=""> 
</dd> 

Sin embargo, me parece que no puede encontrar una manera de introducir múltiples elementos de entrada dentro de un solo elemento, usando la notación de matriz sin índices.

Actualmente, hago esto:

$elt1 = new Zend_Form_Element_Text('1'); 
$elt1->setOptions(array('belongsTo' => 'dupa')); 

$elt2 = new Zend_Form_Element_Textarea('2'); 
$elt2->setOptions(array('belongsTo' => 'dupa')); 

Aunque esto funciona, Zend_Form trata a estos como elementos independientes (que pueden tener diferentes conjuntos de validadores y filtros - que es una especie de fresco) y el código HTML resultante es algo a lo largo estas líneas:

<dd id="dupa-1-element"> 
    <input type="text" name="dupa[1]" id="dupa-1" value=""> 
</dd> 
<dd id="dupa-2-element"> 
    <input type="text" name="dupa[2]" id="dupa-2" value=""> 
</dd> 

¿hay alguna manera (preferentemente sencilla) para lograr la matriz indexless notación que busco?

+0

Ver http://stackoverflow.com/questions/5632296/zend-framework-add-new-input-element-using-javascript/5640268#5640268 –

+0

@David, ¿cómo se relaciona esto con mi pregunta? – mingos

+0

Supongo que interpreté que su fraseología "permite al usuario ingresar cualquier cantidad de valores" significa que el número de dichos elementos será desconocido cuando se entregue el formulario. La publicación a la que he vinculado describe una forma de permitir que el usuario agregue dinámicamente estos elementos de formulario en el lado del cliente y la instancia 'Zend_Form' del lado del servidor puede modificarse" mágicamente "para reflejar la realidad del lado del cliente. Si su situación no tiene ese tipo de indeterminación, entonces eliminaré mi comentario. Perdón por la lectura incorrecta –

Respuesta

3

Me gustaría seguir MWOP's tutorial on creating composite elements. Más trabajo, pero es menos Trial & Error que la solución de akond. La idea básica para mí sería extender el Zend_Form_Element_Multi (lo que quiere es cómo funciona Zend_Form_Element_Multiselect/MultiCheckbox).

+0

¿Le importaría proporcionar un enlace? – mingos

+0

Ah, lo siento :) Accidentalmente lo sobreescribí. –

+0

No es exactamente lo que estaba buscando, pero dado que probablemente no haya una solución que haga exactamente lo que me gustaría lograr, su sugerencia se acerca lo suficiente :). Gracias. – mingos

1

Necesita una vista personalizada para eso.

class Zend_View_Helper_FormMySelect extends Zend_View_Helper_Abstract 
{ 
    function formMySelect ($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n") 
    { 
     $result = array(); 
     foreach ($options as $option) 
     { 
      $result [] = sprintf ('<input type="text" name="%s[]" value="">', $name); 
     } 

     return join ($listsep, $result); 
    } 
} 

que tener en su forma algo así:

$form = new Zend_Form(); 
    $form->addElement ('select', 'test', array (
    'label'  => 'Test', 
    'multioptions' => array (
     'test 1', 
     'test 2', 
     'test 3', 
    ), 
    )); 

    $form->test->helper = 'formMySelect'; 
+0

Interesante. Voy a experimentar con esto. – mingos

+0

¿Validará y poblará el elemento seleccionado con dicho trabajo de visualización? – Marcin

+0

No estoy seguro. Acabo de dar una idea. – akond

2

me las arreglé para hacer esto por tener un "subformulario contenedor" y, a continuación, añadir a subformularios que "contenedor" ej .:

$container = new Zend_Form_SubForm(); 
$subform1 = new Zend_Form_SubForm(); 
$container->addSubForm($subform1, '1'); 

$subform2 = new Zend_Form_SubForm(); 
$subform2->addSubForm($subform1, '2'); 

$mainForm = new Zend_Form(); 
$mainForm->addSubform($container,'mysubforms'); 

Espero que ayude.

Cuestiones relacionadas