【问题标题】:Strange behaviour with Zend_Element 'belongsTo' propertyZend_Element 'belongsTo' 属性的奇怪行为
【发布时间】:2012-01-21 22:19:20
【问题描述】:

我已经看到其他线程和错误报告与 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->getValues('user') 时,我期望看到的是一个值数组。 如果您调用,值数组是清晰可见的

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

【问题讨论】:

    标签: zend-framework zend-form


    【解决方案1】:
    $form->getValue('fname') or $form->getValue('sname')
    

    之所以这样工作,是因为 getValue() 只是在寻找元素的名称,而您的元素的名称是 fnamesname.

     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;
    

    希望这会有所帮助。

    【讨论】:

    • 嗨 RockyFord - 感谢您的建议,但它仍然没有意义 - 设置 belongsTo 应该将元素设置为您指定它所属的元素的子元素(或子表单)。否则,如果它只是将其创建为单个元素,那么设置 belongsTo 是没有意义的。
    • 取决于您的观点。 getValue($key) 旨在返回单个元素的值,而不考虑任何其他设置。 getValues() 提供了一种将数据集的所有值作为数组返回的方法。 ZF 最酷的部分是,如果您不同意他们的选择,请更改它们。扩展 Zend/Form 并用您自己的函数覆盖 getValue()。
    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多