【问题标题】:Zend_Form array notation with no indices没有索引的 Zend_Form 数组表示法
【发布时间】:2011-05-18 08:57:18
【问题描述】:

我想创建一个表单,允许用户输入任意数量的值,每个值都使用数组表示法在单独的文本字段中。预期的 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>

有没有(最好是简单的)方法来实现我所追求的无索引数组表示法?

【问题讨论】:

  • @David,这与我的问题有什么关系?
  • 我想我将您的措辞“允许用户输入任意数量的值”解释为在交付表单时此类元素的数量是未知的。我链接的帖子概述了一种允许用户在客户端动态添加这些表单元素的方法,并且服务器端 Zend_Form 实例可以“神奇地”修改以反映客户端的现实。如果您的情况没有那种不确定性,那么我将删除我的评论。抱歉,误读了。
  • 哦,不,没关系,你不必删除它。我想我可以更明确地表达这一点。我有一个很小的 ​​jQuery 脚本,可以在客户端添加或删除元素,而服务器端没有对它们进行验证,因此只要所有输入都作为数组发送,任何输入都可以。问题是当我从数据库中提取数组时,我真的应该填充表单服务器端,而不是客户端 - 而 Zend 似乎无法在本地处理这些表单:)。

标签: arrays zend-framework zend-form


【解决方案1】:

我会关注MWOP's tutorial on creating composite elements。更多的工作,但它比 akond 的解决方案更少的 Trial&Error 。我的基本想法是扩展Zend_Form_Element_Multi(你想要的是 Zend_Form_Element_Multiselect/MultiCheckbox 的工作方式)。

【讨论】:

  • 啊,对不起 :) 我不小心把它改写了。
  • 不完全是我想要的,但考虑到可能没有完全符合我想要实现的解决方案,你的建议已经足够接近了:)。谢谢。
  • 您对 Zend_Form_Element_MultiCheckbox 的输出满意吗?如果您模仿它的创建方式。我相信它会创建名称为 element-name[]... 的元素
  • 我玩弄了创建自定义文本元素而不是多选框的想法。不过,我的最终选择更加平凡:setIsArray() 在规则文本元素上 + jQuery 添加更多:D.
  • @Tomáš:好的,由于验证和表单重新填充的问题(对 Javascript 的过度依赖也是一个问题),我最终改变了我的方法,并重新访问了您建议的链接。基于它,我创建了一个完全符合我需要的自定义元素:)。谢谢,伙计:)
【解决方案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');

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    为此,您需要一个自定义视图助手。

    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';
    

    【讨论】:

    • 有趣。我将对此进行试验。
    • 使用这种视图助手验证和填充选择元素是否有效?
    • 不确定。我刚刚给出了一个想法。
    • @Marcin:不幸的是,它似乎不需要 :(。虽然在我的特定情况下我真的不需要任何验证,但最好不要放弃它。
    • @mingos。这就是我的怀疑。通常你不能在 ZF 中做这样的数组元素。我认为您必须像这样创建自己的元素。我也认为@Tomáš Fejfar 的想法是一条可行的路。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多