0

与这个问题Zend_Form - Array based elements?

$form = new Zend_Form();
$subForm = new Zend_Form_SubForm();
$subForm->addElement('Text', '1')
        ->addElement('Text', '2');
$form->addSubForm($subForm, 'element');
$var = '1'; $var2 = '2';
echo $form->getSubForm('element')->$var;
echo $form->getSubForm('element')->$var2;

如果我使用这种方式,输出将是错误的(或至少不是完全预期的)

<input type="text" value="" id="1" name="1">

如果我使用 echo $form 输出将正确

<input type="text" value="" id="element-1" name="element[1]">

但我失去了灵活性

我并不是说这是一个错误或者只是不确定什么是正确的语法。谢谢

4

1 回答 1

2

所以答案相当晚,但我最近遇到了这个问题,虽然我会分享原因和可能的解决方案。

根据我的研究,Zend 的票务系统中至少存在 7 个错误来处理这个问题——尽管描述差异很大。

(所以阻止我粘贴所有链接,所以我将链接一个并给您其他的票证 ID:ZF-9386、ZF-3567、ZF-9451、ZF-7836、ZF-9409、ZF- 7679)

http://framework.zend.com/issues/browse/ZF-10007

最能描述该问题以及可能的修复方法的是 10007 - 然而,ZF 自己莫名其妙地选择在 2.0 之前修复它。

问题源于这样一个事实,即在明确使用时:

$this->form->a->b->c->d 表示法,d 将忘记它的每一个祖先子形式,除了它的直接“c”。当您有一个具有自定义行为的大表单时,这会非常麻烦,因为您可能希望渲染整个子表单“d”而不调用它的特定后代,但您可能希望它在某个位置或 Zend Decoraters 可能无法无需大量工作或根本就可以拉动它。

我应该认为这将是子表单世界中的一个常见问题,因为根据定义,您正在使用复杂的表单,并且除了最通用的表单之外,几乎没有任何表单是线性的或被 dt/dd 或其他干净标记清楚地分开。

我找到了三种方法来处理这个问题。

第一个是在 10007 中贡献的精细补丁——这对我不起作用,因为它只适用于直接打印子表单而不是单个元素——这大约占我用例的 50%。由于对 ZF 的了解不够深入,因此我也没有追求将此功能扩展到元素。

第二个是放弃围绕元素的所有自定义 html,并添加足够的装饰器来满足布局。尽管我的 TRs/TDs 等结构很好,但我无法证明时间和 100% ZF 化我们最复杂形式的决定是合理的——因为有一天 ZF 可能不是最佳选择。

第三个是更直接和干脆的权衡,这是我选择的:我会放弃能够回显 $this->form->a->b->c->d 子表单的便利,而是单独在适当的位置回显我的所有元素(例如 echo $this->form->a->b->c->d->element1 和 echo $this->form->a->b->c-> d->元素2)。这将我的 HTML 排除在有其权衡的装饰器之外,但将我的表单保留在 ZF 中,这正是我想要的。使用此解决方案,您现在可以在 d 子表单上调用 setElementsBelongsTo() 并使用数组表示法使提交行为正常,如下所示:

$objSubFormD->setElementsBelongTo('[a][b][c]')。

请注意,我已经将这些示例简化为几乎超出实用性的范围,因此每个示例的(缺点)优点可能不会立即清楚,我只给出了我认为是选项和我选择作为解决方案的内容。我也觉得我的解决方案为我提供了升级到 ZF 2.0 的最佳途径。

于 2010-08-24T16:31:35.350 回答