是否可以在集合创建的字段集中设置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()');
我的问题是我的user64set中有多个集合。因此,当我想动态添加一些地址时(我使用的示例: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。请帮忙
答案 0 :(得分: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的属性。我决定将我的fieldset属性放在一个名为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
时检查自定义属性,如果找到任何属性则附加它们。为此,我们会将行121修改为125,如下所示:
$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">
!
希望有所帮助!
答案 1 :(得分:1)
只需将其添加到您的元素的attributes
下:
$this->add(array(
'attributes' => array(
'id' => 'someId',
'onclick' => 'return add_address()';
),
// your other stuff, type, name, options, etc...
));
答案 2 :(得分:0)
不知道为什么ZF1的表单装饰器已被丢弃在ZF2 ......
IMO最有效的装饰表单元素的方法是&#34;否则&#34; 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);
}
}