我想用Bootstrap的单选按钮组替换Symfony的默认单选按钮小部件。我试图通过为使用createNamedBuilder
函数创建的Symfony表单中的单个字段设置自定义主题来实现这一点。我失败了,因为自定义字段主题需要字段的 ID,在我的情况下是动态的。我知道在 TWIG 中不可能在主题名称中使用变量,但也许我可以使用另一种方法来解决我的问题。
法典
我有一个控制器,它可以在循环中创建一种表单类型的多个实例。表单的名称是通过连接requestform_
和表单的 ID 动态创建的:
public function listAction(Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
$requestForms = $entityManager->getRepository('AppBundle:RequestForm')->findBy(array(), array('id' => 'ASC'));
$forms = array();
foreach ($requestForms as $requestForm) {
$formBuilder = $this->get('form.factory')->createNamedBuilder('requestform_'.$requestForm->getId(), RequestFormType::class, $requestForm);
$form = $formBuilder->getForm()->handleRequest($request);
$forms[] = $form->createView();
}
return $this->render('form/index.html.twig', array('forms' => $forms));
}
RequestFormType
的buildForm
功能准备单选按钮小部件,如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('status', EntityType::class, array(
'class' => 'AppBundle:Status',
'choice_label' => 'name',
'expanded' => true,
'multiple' => false
));
}
控制器呈现以下模板:
{% block content %}
{% for form in forms %}
{{ form_start(form) }}
{{ form_widget(form.status) }}
{{ form_end(form) }}
{% endfor %}
{% endblock %}
其主题是显示 Bootstrap 的按钮组选择器而不是单选按钮:
{% block _requestform_1_status_widget %}
<div id={{ form.vars.id }} class="btn-group" data-toggle="buttons">
{% for status in form.children %}
<label for={{ status.vars.id }} class="btn btn-primary required custom-button-radio">
<input type="radio" id={{ status.vars.id }} name={{ status.vars.full_name }} required="required" value={{ status.vars.value }}>
{{ status.vars.label }}
</label>
{% endfor %}
</div>
{% endblock _requestform_1_status_widget %}
您可能已经注意到,这仅适用于请求表单 ID 1,而不适用于其他 ID 值,因为 TWIG 不允许在块名称中使用变量,即 {% block _requestform_VARIABLE_status_widget %}
.
任何帮助非常感谢!谢谢
我的直觉是,您可能只想有一个表单,其中包含一个包含 CollectionType 字段的 entry_type = RequestFormType::class,然后在树枝中,将表单应用于整个"外部"表单。您仍然应该能够以您想要的方式管理事情。