Zend framework Zend#u元素的奇怪行为';属于';财产

Zend framework Zend#u元素的奇怪行为';属于';财产,zend-framework,zend-form,Zend Framework,Zend Form,我见过其他线程和bug报告与Zend_元素的belongsTo属性有关,但与我的体验没有直接关系 这是我的(简化)Zend_表格: $form = new Zend_Form(); $form->addElement('text', 'fname', array('belongsTo' => 'user')); $form->addElement('text', 'sname', array('belongsTo' => 'user')); 这很好,元素渲染如下: &

我见过其他线程和bug报告与Zend_元素的belongsTo属性有关,但与我的体验没有直接关系

这是我的(简化)Zend_表格:

$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('user');
当调用$form->getValues('user')时,我希望看到的是一个值数组。 如果调用

$form->getValue('fname') or $form->getValue('sname')
$form->getValues();
如果这是预期的行为,那么将它们放入数组有什么意义?因为“user[fname]”和“client[fname]”之间没有区别——事实上,添加另一个名为“fname”的元素,即使它属于另一个项目,也会覆盖上一个项目

我已经尝试添加一个子表单,它确实会产生我想要的结果,但这样所有子表单元素都会一起渲染,我真正想要的是将“数组”元素放置在随机的位置,就像这样

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

这样做是因为getValue()只是查找元素的名称,而元素的名称是fname和sname

从我所看到的内容中访问您的个人数据的方法应该是:

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

希望这能有所帮助。

Hi RockyFord-谢谢你的建议,但还是没有意义-设置一个belongs应该将元素设置为指定它所属的元素的子(或子表单)。否则,如果它只是将其创建为单个元素,那么将belongsTo设置为没有意义。这取决于您的观点。getValue($key)用于返回单个元素的值,而不考虑任何其他设置。getValues()提供了一种将数据集的所有值作为数组返回的方法。ZF的酷之处在于,如果你不同意他们的选择,就改变他们。扩展Zend/Form并用自己的函数重写getValue()。
$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;