Zend框架:使用数组表示法处理表单元素

19

我想要在表单中使用数组符号添加一个隐藏的表单字段。我可以通过以下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个回答

19

你需要使用子表单来获得想要的结果。文档比较复杂,但你可以在这里找到它。

根据我在那里找到的内容,我构建了以下表单:

 <?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"
}

这就是您可以创建所需表单的方法。希望有所帮助!如果您有问题,请发布评论!

如果你问我,这种方法相当hackish。您基本上创建子表单,但禁用其表单装饰器,以便仅输出元素。由于相同的contacts []元素位于不同的表单对象中,因此zend不会覆盖它们,因此它能够工作。但是,是的..

编辑:稍微修改了一下,以删除隐藏输入框周围的标签和垃圾。


1
对于你的答案加1分,但是对于要求这样做的ZF减1分。为了创建这些数组符号中的隐藏字段而使用子表单?呃。更好的方法是在元素上设置一个配置键,它将为您启动所有这些子表单疯狂的过程。我们可以实现一个自定义元素来完成这个任务。 - David Weinraub
1
@DavidW 是的,我总是使用视图助手或自己创建表单。使用装饰器和利用zend_form真是太麻烦了。但我认为ZF 2.0有更好的表单(希望如此!)。感谢您的点赞。 - Iznogood

16
使用数组符号时,需要指定该元素“属于”哪个父数组:
$form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
$form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));

1
这会生成<input type="hidden" id="contacts-contact123" value="123" name="contacts[contact123]">,但如果你需要contacts[123]和number[123],这样就行不通了。 - max4ever
我有一个变长数组需要添加到我的Zend分页控件中。我做了以下操作:$this->formHidden($key . "[" . $k . "]", $v, array('belongsTo' => $key)); - PREEB

8

看起来这确实是Zend Framework中的一个bug - 元素的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))。

希望这对某人有所帮助 :)


1
是的,我喜欢这个答案 :)。扩展Zend Framework核心文件对我来说总是很有趣的。 - php-dev


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接