Zend Framework: Работа с элементами Form в нотации массива
Я хотел бы иметь возможность добавить скрытое поле формы, используя обозначение массива к моей форме. Я могу сделать это с помощью 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, которую я использую. Я делаю это правильно? Что я должен делать по-другому? Как я могу достичь результата выше? Я готов создать пользовательский элемент формы, если мне нужно. Просто дай мне знать, что мне нужно сделать.
3 ответа
Чтобы использовать нотацию массива, необходимо указать, что элемент "принадлежит" родительскому массиву:
$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));
Вы должны использовать подчиненные формы, чтобы получить результат, который вы ищете. Документация подвела, но вы можете найти ее здесь
Используя то, что я нашел там, я построил следующую форму
<?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"> </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 не перезаписывает их, и это работает. Но да..
Изменить: немного изменил, чтобы удалить метки и мусор вокруг скрытых входов.
Это действительно кажется ошибкой в 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)
).
Надеюсь, это поможет кому-то:)
Для более новых версий ZF вы должны использовать https://framework.zend.com/manual/2.1/en/modules/zend.form.elements.html