gpt4 book ai didi

javascript - 如何在集合字段集中设置属性(id)(原则 2,zend 框架 2)

转载 作者:行者123 更新时间:2023-11-29 19:54:21 25 4
gpt4 key购买 nike

是否可以在由集合创建的字段集中设置一个 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。请帮忙

最佳答案

一种可能的方法是扩展 Zend\Form\View\Helper\FormCollection并将扩展注册为默认 formCollection 的替代品 helper 。

出于本示例的目的,我假设您的模块名为 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,无论何时 View 助手调用 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"> !

希望对您有所帮助!

关于javascript - 如何在集合字段集中设置属性(id)(原则 2,zend 框架 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com