如何处理子表单中的特定元素并使用 [] 正确显示

Posted

技术标签:

【中文标题】如何处理子表单中的特定元素并使用 [] 正确显示【英文标题】:Howto address specific element from subform and have it displayed correctly with [] 【发布时间】:2010-05-17 14:31:40 【问题描述】:

与这个问题有关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]">

但我会失去灵活性

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

【问题讨论】:

【参考方案1】:

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

根据我的研究,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 的最佳途径。

【讨论】:

以上是关于如何处理子表单中的特定元素并使用 [] 正确显示的主要内容,如果未能解决你的问题,请参考以下文章

在 MVVM + Coordinator 中,如何处理子视图?

在 HTMX 中,如何为选择表单元素中的每个选项请求特定的 URL?

Android - 如何处理单个 ListViewItem 中的多个元素?

使用jquery mobile时如何处理手机中的表单导航后退按钮

如何处理组件中的 isDirty?

Delphi Seattle 中运行时 DPI 更改后如何处理菜单缩放