2010-09-08 67 views
17

我希望能够使用数组表示法向表单中添加一个隐藏表单域。我可以这样跟HTML做到这一点:Zend Framework:使用数组表示法中的表单元素

<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版本中可能存在一个错误。我做对了吗?我应该做什么不同?我怎样才能达到上述结果?如果必须,我愿意创建一个自定义表单元素。请让我知道我需要做什么。

回答

15

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

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

这会产生,但是如果你需要联系人[123]和号码[123] – max4ever 2012-09-20 08:34:32

+0

我有一个需要添加到我的zend分页控件的可变长度数组。我做了以下:'$ this-> formHidden($ key。“[”。$ k。“]”,$ v,array('belongsTo'=> $ key));' – thepriebe 2012-11-29 23:13:28

17

您必须使用子窗体来获得您要查找的结果。该文档是相当兜风,但你可以找到它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'); 
    } 

} 

至极输出这个网站:

<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> 

当submited后看起来像:

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

所以这是你如何创造e您寻求的形式。希望这可以帮助!如果你有问题发表评论!

如果你问我的话,它会很冒险。你基本上创建了子表单,但是在那里禁用了表单装饰器,所以只有元素得到输出。由于相同的contacts []元素是不同的形式对象zend不会覆盖它们,它的工作原理。但是,是的..

编辑:改变了一下,删除标签和垃圾arount隐藏输入。

+1

+1给你的答案。 ;-)但要求ZF为-1。子表单只是为了创建这些隐藏的数组表示法字段?啊。更好的是你可以在元素上设置一个配置键,以便为你启动所有这些子表单的疯狂。猜猜我们可以实现一个这样做的自定义元素。 – 2010-09-10 09:15:49

+1

@DavidW是的,我总是使用viewhelpers或者只是将自己的表单转出来。与装饰者一起工作并利用zend_form的这种痛苦。但ZF 2.0有更好的形式,我认为(希望!)。 Thansk为upvote。 – Iznogood 2010-09-10 12:58:41

8

这确实似乎是Zend框架中的一个错误 - 一个元素属性的值是否正确设置为数组,但在元素呈现时忽略它 - 它仅使用$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); 

生成所需的输出。

如果没有设置数组值(return parent::formHidden($name, $value, $attribs)),则在此处扩展Zend_View_Helper_FormHidden的原因仅仅是为了能够调用默认行为。

希望这可以帮助别人:)

+1

是的,我更喜欢这个答案: )。扩展Zend Framework核心文件对我来说总是很有趣。 – 2014-08-03 14:19:30