2

是否可以在由集合创建的字段集中设置 id?我有几个实体(用户、地址、附件等),在我的用户实体中,我有几个由集合组成的字段集。所以一个用户可以有多个地址或附件。我的收藏是这样建立的:

$addressFieldset = new AddressFieldset($serviceManager);

$this->add(array(
   'type' => 'Zend\Form\Element\Collection',
   'name' => 'addresses',
   'options' => array(
       'label' => 'Choose address for user',
       'count' => 1,
       'should_create_template' => true,
       //'template_placeholder' => '__placeholder__',
       'allow_add' => true,
       'target_element' => $addressFieldset
       ),
   ));

$this->add(array(
     'name' => 'addAddress',
     'type' => 'button',
     'options' => array('label' => 'Add Address',
            ),
      ));
$this->get('addAddress')->setAttribute('onclick', 'return add_address()');

我的问题是我的用户字段集中有多个集合。因此,当我想动态添加一些地址时(我使用的示例:http: //zf2.readthedocs.org/en/latest/modules/zend.form.collections.html),该示例具有以下 javascript:

function add_address() {
    var currentCount = $('form > fieldset > fieldset').length;
    var template = $('form > fieldset > span').data('template');

    template = template.replace(/__index__/g, currentCount);

    $('form > fieldset').append(template);

    return false;
}

但是,我的问题是,如果我使用该示例,它还会在附件下添加地址字段集。我想要的是这样的:

function add_address() {
    var currentCount = $('form > #addressFieldset > fieldset').length;
    var template = $('form > #addressFieldset > span').data('template');

    template = template.replace(/__index__/g, currentCount);

    $('form > #addressFieldset').append(template);

    return false;
}

有了这个,我只能访问addressFieldset,但是如何在AddressFieldset中设置一个ID?我的树应该是这样的:

<form>
    <fieldset id="addressFieldset">
        <legend>Choose addresses</legend>
        <fieldset>
            //Data
        </fieldset>
    </fieldset>
    <fieldset id="attachmentFieldset">
        <legend>Choose attachments</legend>
        <fieldset>
            //Data
        </fieldset>
    </fieldset>
</form>

我不知道如何在字段集中设置 id。请帮忙

4

3 回答 3

2

一种可能的方法是扩展Zend\Form\View\Helper\FormCollection和注册扩展作为默认formCollection助手的替代品。

出于本示例的目的,我假设您的模块名为Application.

首先,您需要定义一个扩展上述 Zend 助手的自定义类。对于我的扩展/覆盖,我通常保持与 Zend 相同的目录结构,除了我将“Zend”替换为我的模块的名称,因此,在我的情况下,该类将驻留在module/Application/src/Application/Form/View/Helper/FormCollection.php.

完成后,您可以通过在module/Application/config/module.config.php文件中添加以下行来替换帮助程序:

'view_helpers' => array(
    'invokables' => array(
        'formCollection' => 'Application\Form\View\Helper\FormCollection',
    ),
),

这告诉 Zend 每当formCollection调用视图助手时,使用这个类而不是默认类。

接下来,您需要重写该render方法。不幸的是,您必须将原始方法的内容复制/粘贴到您的类中(因为fieldset标签的生成是硬编码的),但如果您想要该功能,这是一个很小的代价。

在返回结果之前,您需要修改将$markup变量包装在标签中的位。

在我们这样做之前,我们需要在工厂数组中定义字段集的属性。我决定将我的字段集属性放在一个名为fieldset_attributes这样的键中:

$this->add(array(
    'type'    => 'Collection',
    'name'    => 'addresses',
    'options' => array(
        'label'                  => 'Choose address for user',
        'count'                  => 1,
        'allow_add'              => true,
        'allow_remove'           => true,
        'create_new_objects'     => true,
        'should_create_template' => true,
        'target_element'         => $addressFieldset,
        'attributes'             => array(
            'id' => 'addressFieldset',
        ),
    ),
));

当然,如果您想要或重组数组,您可以以不同的方式命名键,这完全取决于您。只要确保您更新render我们将要相应修改的方法。

因此,最后要做的就是在包装时检查自定义属性,$markup如果找到的话就追加它们。为此,我们将修改第121125行,如下所示:

$attributeString = '';
$options = $element->getOptions();
if (!empty($options['attributes'])) {
    $attributeString = ' ' . $this->createAttributesString($options['attributes']);
}

$markup = sprintf(
    '<fieldset%s><legend>%s</legend>%s</fieldset>',
    $attributeString,
    $label,
    $markup
);

如果您现在刷新页面,您会看到<fieldset>已更改为<fieldset id="addressFieldset">!

希望有帮助!

于 2013-10-04T14:00:20.697 回答
1

只需将其添加到attributes您的元素下:

$this->add(array(
    'attributes' => array(
        'id' => 'someId',
        'onclick' => 'return add_address()';
    ),
    // your other stuff, type, name, options, etc...
));
于 2013-05-07T16:15:48.427 回答
0

不知道为什么 ZF1 的表单装饰器在 ZF2 中被删除了……

IMO 装饰表单元素的最有效方法是“否决”ZF2 的表单视图助手......即使我这样做很野蛮......

    <?php
    namespace Application\Helpers\View;

    use Zend\Form\ElementInterface;
    use Zend\Form\View\Helper\FormCollection as BaseFormCollection;

    class FormCollection extends BaseFormCollection
    {
        public function render(ElementInterface $element)
        {
            if($element->getAttribute('name') == 'usertype')
                return str_replace('<fieldset>', '<fieldset class="noborder">', parent::render($element));
            else
                return parent::render($element);
        }
    }
于 2014-03-21T12:34:49.463 回答