Нотация массива Zend_Form без индексов - PullRequest
6 голосов
/ 18 мая 2011

Я хотел бы создать форму, которая позволяет пользователю вводить любое количество значений, каждое в отдельном текстовом поле, используя обозначение массива.Пример ожидаемого вывода HTML:

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

Однако я не могу найти способ ввести несколько элементов ввода в один элемент, используя нотацию массива без индексов.

В настоящее время, Я делаю это:

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

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

Хотя это работает, Zend_Form обрабатывает их как независимые элементы (которые могут иметь разные наборы валидаторов и фильтров - это круто), и в результате HTML выглядит примерно так:

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

Есть ли (желательно простой) способ получения безиндексной нотации массива, за которой я слежу?

Ответы [ 3 ]

3 голосов
/ 18 мая 2011

Я бы следовал учебнику MWOP по созданию составных элементов .Больше работы, но это меньше проб и ошибок, чем решение Akond.Основной идеей для меня было бы расширение Zend_Form_Element_Multi (что вы хотите, это как работает Zend_Form_Element_Multiselect / MultiCheckbox)

2 голосов
/ 17 ноября 2011

Мне удалось сделать это, имея «подчиненную форму контейнера», а затем добавив подчиненные формы в этот «контейнер», например:

$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');

Надеюсь, что это поможет.

1 голос
/ 18 мая 2011

Для этого вам нужен специальный помощник вида.

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

Чем в вашей форме есть что-то вроде этого:

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

    $form->test->helper = 'formMySelect';
...