所以答案相当晚,但我最近遇到了这个问题,虽然我会分享原因和可能的解决方案。
根据我的研究,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 的最佳途径。