我希望能够使用数组表示法将隐藏的表单字段添加到我的表单中。我可以像这样用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版本中可能有一个bug。我这样做对吗?我应该采取不同的做法吗?我如何才能达到上面的结果?如果有必要,我愿意创建自定义表单元素。只要让我知道我需要做什么。
发布于 2011-08-15 12:26:48
要使用数组表示法,需要指定元素“属于”父数组:
$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));
发布于 2010-09-09 08:53:27
你必须使用子表单才能得到你想要的结果。文档非常丰富,但您可以在here中找到它
使用我在那里找到的内容,我构造了以下formL
<?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');
}
}
Wich输出此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不会覆盖它们,因此它可以正常工作。但是是的.。
编辑:稍微修改了一下,删除了隐藏输入的标签和垃圾。
发布于 2012-01-31 23:56:44
这似乎确实是Zend Framework中的一个错误-元素的值属性被正确地设置为数组,但当元素呈现时它被忽略了-它只使用$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)
)。
希望这对某些人有帮助:)
https://stackoverflow.com/questions/3672689
复制相似问题