使用Zend_Element'insateTo'属性的奇怪行为

时间:2012-01-21 22:19:20

标签: zend-framework zend-form

我已经看到其他线程和错误报告与Zend_Element的belongsTo属性有关,但没有任何与我正在经历的内容直接相关的内容。

这是我的(简化的)Zend_Form:

$form = new Zend_Form();

$form->addElement('text', 'fname', array('belongsTo' => 'user'));
$form->addElement('text', 'sname', array('belongsTo' => 'user'));

哪个好,元素渲染如下:

<input type="text" name="user[fname]" />
<input type="text" name="user[sname]" />

......这正是我想要的。

但是,提交表单时,只有在调用

时才能访问元素值
$form->getValue('fname') or $form->getValue('sname')

不,如果你打电话......

$form->getValue('user');

当您致电$ form-&gt; getValues('user')时,我期待看到的是值的数组。 如果您调用

,则数组数组清晰可见
$form->getValues();

如果这是预期的行为,那么将它们放入数组中的意义何在?因为“user [fname]”和“client [fname]”之间没有区别 - 实际上添加名为“fname”的另一个元素,即使它属于另一个项目,也会覆盖前一个。

我已经尝试添加一个子窗体,它确实产生了我想要的东西,但是这样所有的子窗体元素都被渲染在一起,我真正想要的是将'array'元素放在随机的地方,就像这样...

<input type="text" name="user[fname]" />
<input type="text" name="some-other-field" />
<input type="text" name="some-other-field2" />
<input type="text" name="user[sname]" />
<input type="text" name="another-field-too" />

1 个答案:

答案 0 :(得分:2)

$form->getValue('fname') or $form->getValue('sname')

以这种方式工作,因为 getValue()只是在寻找元素的名称,而你的元素名称是 fname sname

 Excerpt: Zend/Form.php
 public function getValue($name)
{
    if ($element = $this->getElement($name)) {
        return $element->getValue();
    }

从我看到的应该访问 belongsTo 数据的方式应该是:

$data = $form->getValues();
$user=$data['user'];

这应该做你想要的。基于此:

Excerpt: Zend/Form.php  
public function getValues($suppressArrayNotation = false)
    {
        $values = array();
        $eBelongTo = null;

        if ($this->isArray()) {
            $eBelongTo = $this->getElementsBelongTo();
        }

        foreach ($this->getElements() as $key => $element) {
            if (!$element->getIgnore()) {
                $merge = array();
                if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
                    if ('' !== (string)$belongsTo) {
                        $key = $belongsTo . '[' . $key . ']';
                    }
                }
                $merge = $this->_attachToArray($element->getValue(), $key);
                $values = $this->_array_replace_recursive($values, $merge);
            }
        }
//...Code continues
return $values;

希望这有帮助。