【问题标题】:Zend Framework: Working with Form elements in array notationZend Framework:以数组表示法处理表单元素
【发布时间】:2010-09-08 23:30:03
【问题描述】:

我希望能够使用数组表示法向我的表单添加一个隐藏的表单字段。我可以用这样的 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 版本中可能存在错误。我这样做对吗?我应该怎么做?我怎样才能达到上述结果?如果必须,我愿意创建一个自定义表单元素。请让我知道我需要做什么。

【问题讨论】:

    标签: zend-framework zend-form zend-form-element


    【解决方案1】:

    您必须使用子表单来获得您想要的结果。文档很方便,但你可以找到它here

    使用我在那里找到的内容,我构建了以下表格

     <?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">&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 给你答案。 ;-) 但是对于 ZF 的要求是 -1。子表单只是为了以数组表示法创建这些隐藏字段?啊。更好的是您可以在元素上设置一个配置键,它会为您启动所有这些疯狂的子表单。猜猜我们可以实现一个自定义元素来做到这一点。
    • @DavidW 是的,我总是使用 viewhelpers 或者只是推出我自己的表单。使用装饰器并利用 zend_form 真是太痛苦了。但是我认为 ZF 2.0 有更好的形式(希望!)。感谢您的支持。
    【解决方案2】:

    要使用数组表示法,您需要指定元素“属于”父数组:

    $form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
    $form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));
    

    【讨论】:

    • 这会生成,但是如果你需要contacts[123]和number[ 123]这行不通
    • 我有一个可变长度数组,需要添加到我的 zend 分页控件中。我做了以下事情:$this-&gt;formHidden($key . "[" . $k . "]", $v, array('belongsTo' =&gt; $key));
    【解决方案3】:

    这确实似乎是 Zend 框架中的一个错误 - 元素的 value 属性被正确设置为数组,但在元素呈现时它被忽略了 - 它只是使用$this-&gt;view-&gt;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))。

    希望这对某人有帮助:)

    【讨论】:

    • 是的,我更喜欢这个答案:)。扩展 Zend Framework 核心文件对我来说总是很有趣。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多