与此问题相关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]">
但我放松了灵活性
我并不是说这是一个错误,或者只是不确定正确的语法是什么。 感谢
答案 0 :(得分:2)
所以答案很晚,但我最近碰到了这个问题,虽然我分享了原因和可能的解决方案。
根据我的研究,Zend的票务系统中至少存在7个处理此问题的错误 - 尽管描述有很大差异。
(SO阻止我粘贴所有链接,所以我会链接一个,并为其他人提供门票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-&gt; form-&gt; a-&gt; b-&gt; c-&gt; d表示法,d将忘记它的每个祖先子表格,除了它的直接“c”。当你有一个带有自定义行为的大表单时,这是非常麻烦的,因为你可能想要渲染整个子表单“d”而不调用它的特定后代,但你可能想要它在某个位置或Zend Decoraters可能无法无需大量工作就可以完成任务。
我认为这将是子表单世界中的一个常见问题,因为根据定义,您使用的是复杂的表单,除了最通用的表单外,几乎没有任何表单是线性的或者由dt / dd或其他明显分隔的干净的标记。
我发现有三种方法可以解决这个问题。
第一个是在10007中提供的精细补丁 - 这对我不起作用,因为它只适用于直接打印子表单而不是单个元素 - 这大约是我用例的50%。我不太了解ZF,我也没有将这个功能扩展到元素。
第二种是放弃元素周围的所有自定义html并添加足够的装饰来满足布局。虽然我的TRs / TDs等结构很好,但我无法证明时间和100%ZFify我们最复杂形式的决定 - 因为有一天ZF可能不是最好的选择。
第三个是更加切割和干燥的权衡,这是我选择的:我会放弃能够回应$ this-&gt; form-&gt; a-&gt; b-&gt; c-的能力&gt; d子表单,而是单独回显所有元素在其适当的位置(如echo $ this-&gt; form-&gt; a-&gt; b-&gt; c-&gt; d-&gt; element1和echo $ this - &GT;形状配合&GT; A-&GT; B-&GT; C-&GT; D-&GT;在element2)。这使我的HTML不受具有权衡的装饰者的影响,但是我的表格保留在ZF中,这就是我想要的。使用此解决方案,您现在可以在d子表单上调用setElementsBelongsTo()并使用数组表示法来使提交行为正常,如下所示:
$ objSubFormD-&GT; setElementsBelongTo( '[A] [B] [C]')
请注意,我已经将这些例子愚蠢地超出实际范围,因此(dis)优势可能不会立即清楚,我只给出了我认为的选项以及我选择的解决方案。我也觉得我的解决方案为我提供了ZF 2.0的最佳升级途径。