Zend_Form数组表示法不带索引

6
我希望创建一个表单,允许用户使用数组符号在单独的文本字段中输入任意数量的值。预期的HTML输出示例如下:
<dd id="dupa-element">
    <input type="text" name="dupa[]" value="">
    <input type="text" name="dupa[]" value="">
</dd>

然而,我似乎找不到一种方法来在单个元素中引入多个输入元素,使用数组符号但不带索引。

目前,我的做法是:

$elt1 = new Zend_Form_Element_Text('1');
$elt1->setOptions(array('belongsTo' => 'dupa'));

$elt2 = new Zend_Form_Element_Textarea('2');
$elt2->setOptions(array('belongsTo' => 'dupa'));

虽然这样可以实现功能,但Zend_Form会将它们视为独立的元素(可以有不同的验证器和过滤器 - 这很酷),生成的HTML大致如下:
<dd id="dupa-1-element">
    <input type="text" name="dupa[1]" id="dupa-1" value="">
</dd>
<dd id="dupa-2-element">
    <input type="text" name="dupa[2]" id="dupa-2" value="">
</dd>

有没有(最好是简单的)方法可以实现我想要的无索引数组表示法?

请看https://dev59.com/Z1bTa4cB1Zd3GeqP7yG2#5640268的内容。 - David Weinraub
@David,这与我的问题有什么关系吗? - mingos
我猜你的措辞“允许用户输入任意数量的值”是指在提交表单时,这些元素的数量是未知的。我链接的帖子概述了一种方法,可以允许用户在客户端动态添加这些表单元素,并且服务器端的Zend_Form实例可以“神奇地”修改以反映客户端的实际情况。如果您的情况没有那种不确定性,那么我会删除我的评论。对于我的误读,很抱歉。 - David Weinraub
哦,不,没关系,你不必删除它。 我猜我本来可以表达得更明确。 我有一个微小的jQuery脚本,可以在客户端上添加或删除元素,并且服务器端没有验证它们,因此只要将所有输入作为数组发送即可。 问题是,当我从数据库中提取数组时,我真的应该在服务器端填充表单,而不是客户端-并且Zend似乎无法本地处理这些内容:)。 - mingos
3个回答

3

我会跟随MWOP关于创建复合元素的教程。虽然工作量更大,但比akond的解决方案少了很多试错。对我来说,基本思路是扩展Zend_Form_Element_Multi(你想要的就是Zend_Form_Element_Multiselect/MultiCheckbox的工作方式)。


啊,抱歉 :) 我不小心覆盖了它。 - Tomáš Fejfar
不完全是我期望的,但鉴于可能没有解决方案完全符合我想要的,你的建议已经足够接近了。谢谢。 - mingos
你对Zend_Form_Element_MultiCheckbox的输出满意吗?如果是的话,模仿它的创建方式。我相信它创建的元素名称为element-name[]... - Tomáš Fejfar
我曾经考虑过创建一个自定义文本元素来代替多选框。但我的最终选择更加平凡:在常规文本元素上使用 setIsArray() + jQuery 来添加更多内容 :D。 - mingos
@Tomáš:好的,由于验证和表单重新填充方面出现了问题(太多依赖于Javascript也是一个问题),我最终改变了我的方法,并重新访问了你建议的链接。基于此,我创建了一个定制元素,正好满足我的需求 :)。谢谢,伙计 :) - mingos

2

我通过创建一个“容器子表单”,然后向该“容器”添加子表单来实现此目的,例如:

$container = new Zend_Form_SubForm();
$subform1 = new Zend_Form_SubForm();
$container->addSubForm($subform1, '1');

$subform2 = new Zend_Form_SubForm();
$subform2->addSubForm($subform1, '2');

$mainForm = new Zend_Form();
$mainForm->addSubform($container,'mysubforms');

希望这可以帮到您。

1
你需要一个自定义视图助手来实现这个功能。
class Zend_View_Helper_FormMySelect extends Zend_View_Helper_Abstract
{
    function formMySelect ($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n")
    {
        $result = array ();
        foreach ($options as $option)
        {
            $result [] = sprintf ('<input type="text" name="%s[]" value="">', $name);
        }

        return join ($listsep, $result);
    }
}

然后在你的表单中添加类似这样的内容:

    $form = new Zend_Form();
    $form->addElement ('select', 'test', array (
    'label'     => 'Test',
    'multioptions' => array (
        'test 1',
        'test 2',
        'test 3',
    ),
    ));

    $form->test->helper = 'formMySelect';

有趣。我会试着做一下。 - mingos
使用这个视图助手来验证和填充选择元素,会起作用吗? - Marcin
不确定。我只是提供了一个想法。 - akond
@Marcin:不幸的是,它似乎并没有起作用。虽然在我个人的情况下我并不真正需要任何验证,但最好不要放弃它。 - mingos
@mingos。这正是我所怀疑的。通常情况下,您无法在ZF中这样做数组元素。我认为您需要创建自己的元素,就像这样。我也认为@Tomáš Fejfar的想法是可行的。 - Marcin
@Marcin:太糟糕了。老实说,这正是我所期望的,尤其是由于“setBelongsTo()”和“setIsArray()”函数似乎不能实现我想要达到的目的,但我仍然希望自己错了:D。 - mingos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接