在表格中,我需要将输入的每个单选按钮与不同的图像相关联。
我会这样称呼这个表单的构造:
$builder = $this->formFactory->createBuilder();
$builder->add('input_name', 'my_choice', array(
'data' => 'n',
'choices' => array('c1' => 'choice1', 'c2' => 'choice2'),
'required' => true,
'expanded' => true,
'multiple' => false,
'images' => array('choice1.jpg', 'choice2.jpg')));
$form = $builder->getForm();
意味着radio_button choice1将与choice1.jpg相关联,radio_button choice2将与choice2.jpg相关联。
在plaint HTML中使用Bootstrap我想要这个结果
<form method="post" action="{{ path('my_path')}}" name="myform">
<div class="btn-group btn-group-justified" data-toggle="buttons">
<label id="btn-choice1" class="btn active">
<input type="radio" name="is_choice" id="c1" value="Choice1" checked>
<img id="choice1_img" src="{{ asset('bundles/myBundle/icons/choice1.png') }}" alt="Choice 1">
</label>
<label id="btn-choice2" class="btn">
<input type="radio" name="is_choice" id="c2" value="Choice2"><img id="choice2_img" src="{{ asset('bundles/myBundle/icons/choice2.png') }}" alt="Choice 2">
</label>
</div>
<button class="btn" type="submit" name="submit">Submit</button>
</form>
我阅读了与此相关的官方Symfony文档:http://symfony.com/fr/doc/2.3/cookbook/form/create_custom_field_type.html 但是这个例子非常糟糕。
我需要向Symfony描述在哪里寻找这个新选项,但无法弄清楚如何实现这一目标。我在网上阅读了数百个例子,但没有解释如何做到这一点背后的逻辑。
到目前为止,我的新类型如下所示:
<?php
namespace myProject\Bundle\MyBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
class MyChoiceType extends AbstractType
{
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars = array_replace($view->vars, array(
'images' => $options['images']
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'images' => array()
));
}
public function getParent()
{
return 'choice';
}
public function getName()
{
return 'my_choice';
}
}
您是否能够向我解释如何将此新类型描述为Symfony(使用哪些参数调用哪些方法)。
我打破了几个小时的代码,但Symfony为一个简单的表单创建做了很多,我失去了路径。 FormRegistry,FormType,OptionsResolverInterface,BaseType,FormFactory以及许多其他类都涉及到它使得很难获得全局图片。
否则,如果有人能指出一个架构文档来解释其背后的逻辑,那么它也可以。
答案 0 :(得分:0)
找到了解决方案。
我还需要通过表单主题重新定义来访问images new选项。这是一个困难的部分,因为我不知道如何以及我可以从表单主题模板访问什么。
以下是我成功的方法:
{% block my_choice_widget %}
{% spaceless %}
{% if expanded %}
<ul {{ block('widget_container_attributes') }}>
{% for child in form %}
<li>
{{ form_widget(child) }}
{{ form_label(child) }}
{% if images is defined %} {{images[loop.index-1]}} {% endif %}
</li>
{% endfor %}
</ul>
{% else %}
{# just let the choice widget render the select tag #}
{{ block('choice_widget') }}
{% endif %}
{% endspaceless %}
{% endblock %}
我添加到Symfony中的部分形成了模板:
{% if images is defined %} {{images[loop.index-1]}} {% endif %}
在正确的单选按钮前显示图像名称。 应该进行细化以确保有足够的图像来填充所有循环。 与loop.last元素相比,对图像计数进行简单的树枝测试就可以了。