Zend Framework: Работа с элементами Form в нотации массива - PullRequest
18 голосов
/ 09 сентября 2010

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

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

Когда форма будет отправлена, массив $_POST будет содержать значения скрытых элементов, сгруппированных в массив:

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

Я могу добавить скрытый элемент в мою форму и указать обозначение массива следующим образом:

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

Теперь, если я заполню этот элемент массивом, я ожидаю, что он должен хранить значения в виде массива и отображать элементы в виде HTML, показанного выше:

$form->populate($_POST);

Однако это не работает. Может быть ошибка в версии Zend Framework, которую я использую. Я делаю это правильно? Что я должен делать по-другому? Как я могу достичь результата выше? Я готов создать пользовательский элемент формы, если мне нужно. Просто дай мне знать, что мне нужно делать.

Ответы [ 4 ]

18 голосов
/ 09 сентября 2010

Вы должны использовать подчиненные формы, чтобы получить результат, который вы ищете.Документация была очень интересной, но вы можете найти ее здесь

Используя то, что я там нашел, я построил следующую форму L

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

}

, которая выводит этот 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>

А при представлении пост выглядит так:

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

Так вот, как вы можете создавать формы, которые вы ищете.Надеюсь это поможет!если у вас есть вопрос, оставьте комментарий!

Довольно хакерски, если вы спросите меня.Вы в основном создаете подчиненные формы, но отключаете там декораторы форм, чтобы только элемент получал выходные данные.Поскольку идентичные элементы contacts [] находятся в разной форме, объект Zend не перезаписывает их, и это работает.Но да ..

Редактировать: немного изменил, чтобы убрать метки и мусор вокруг скрытых входных данных.

16 голосов
/ 15 августа 2011

Чтобы использовать нотацию массива, необходимо указать, что элемент «принадлежит» родительскому массиву:

$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));
8 голосов
/ 31 января 2012

Это действительно кажется ошибкой в ​​Zend Framework - атрибут value для элемента правильно установлен в массив, но он игнорируется при отображении элемента - он просто использует $this->view->escape($value) для вывода html элемента. Я решил это путем реализации пользовательского помощника для таких элементов:

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

Который, когда используется следующим образом:

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

генерирует необходимый вывод.

Причина расширения Zend_View_Helper_FormHidden здесь заключается в том, чтобы просто вызывать поведение по умолчанию, если не установлено значение массива (return parent::formHidden($name, $value, $attribs)).

Надеюсь, это кому-нибудь поможет:)

0 голосов
/ 06 марта 2019

Для более новых версий ZF вы должны использовать https://framework.zend.com/manual/2.1/en/modules/zend.form.elements.html#multicheckbox

...