我已经看到其他线程和错误报告与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" />
答案 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;
希望这有帮助。