我正在尝试创建一个基本的字段集模板。我有这个:
fieldset.html.twig
{% form_theme form _self %}
{% block form_row %}
<fieldset>
<legend></legend>
{{ form_row(form) }}
</fieldset>
{% endblock %}
FieldsetType.php
class FieldsetType extends AbstractType
{
public function __construct($tituloFieldset="")
{
$this->titulo = $tituloFieldset;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr' => array(
'title'=>$this->titulo
),
'mapped'=>false
));
}
public function getParent()
{
return 'form';
}
public function getName()
{
return 'fieldset';
}
private $titulo;
}
当前用法
$builder->add('nestedform', new FieldsetType('legend'));
我已经尝试了所有方法:将标题添加为标签(没有字段渲染的额外标签),模板化整个表单(在这种情况下我无法添加额外的字段集),等等。
我该怎么办?
答案 0 :(得分:6)
我已将此功能提取到一个包中,因为我需要在一些项目中https://github.com/adamquaile/AdamQuaileFieldsetBundle
但基于其他一些答案和想法,它相当于:
class FieldsetType extends AbstractType {
public function setDefaultOptions ( OptionsResolverInterface $resolver )
{
$resolver->setDefaults([
'legend' => '',
'virtual' => true,
'options' => array(),
'fields' => array(),
]);
}
public function buildForm ( FormBuilderInterface $builder, array $options )
{
if ( !empty($options['fields']) ) {
foreach ( $options['fields'] as $field ) {
$builder->add($field['name'], $field['type'], $field['attr']);
}
}
}
public function buildView ( FormView $view, FormInterface $form, array $options )
{
if (false !== $options['legend']) {
$view->vars['legend'] = $options['legend'];
}
}
public function getName()
{
return 'fieldset';
}
}
答案 1 :(得分:4)
你走在正确的轨道上。您可以在此处找到一个简单示例:https://gist.github.com/spcmky/8512371