扩展ChoiceType以获取表单中的新选项

时间:2014-07-18 14:34:25

标签: php symfony symfony-2.3

在表格中,我需要将输入的每个单选按钮与不同的图像相关联。

我会这样称呼这个表单的构造:

$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以及许多其他类都涉及到它使得很难获得全局图片。

否则,如果有人能指出一个架构文档来解释其背后的逻辑,那么它也可以。

1 个答案:

答案 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元素相比,对图像计数进行简单的树枝测试就可以了。