动态添加输入symfony2

时间:2013-12-31 12:06:13

标签: php symfony twig

您好我是symfony的新手我有使用Ajax的问题 我有这个班级

class categorie extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $categories_choices = array(
            'VEHICULES' => array(
                '101' => 'Voitures',
                '102' => 'Motos',
                '103' => 'Vélos ',
                '104' => 'Pièces auto',
                '105' => 'Utilitaires / Véhicules commerciaux',
                '106' => 'Bateaux / Nautisme',
            ),
            'IMMOBILIER' => array(
                '201' => 'Vente / Achat',
                '202' => 'Location',
                '203' => 'Colocation',
                '204' => 'Location vacances',
                '205' => 'Garages / Parkings',
                '206' => 'Terrains',
                '207' => 'Bureaux / Commerces',

            ),


        );

        $builder->add('Categorie', 'choice',array(
            'choices' =>$categories_choices,
            'required' => true ,
            'required' => 'Le champ est obligatoire.',
            'attr' => array('onchange' => 'FormCategoryAjaxRequest(this.value)')
            ));

        $builder->add('Type', 'choice', array(
            'choices' => array('m' => 'Offre', 'f' => 'demande')
            ));
    }

我的想法是使用javascript,这是我的功能:

FormCategoryAjaxRequest(ref_doc) {
    if (ref_doc==101 || ref_doc==102 {
        var DivToAdd = document.getElementById('registration');
        tempInput = document.createElement('input');
        tempInput.setAttribute("type","text");
        tempInput.setAttribute("id","hamza");
        var newlabel = document.createElement('Label');
        newlabel.setAttribute("for","hamza");
        newlabel.innerHTML = " text";
        DivToAdd.appendChild(newlabel);
        DivToAdd.appendChild(tempInput);
    }
}

我想在用户选择类别类型时添加另一个输入,它对Ajax很简单,但我没有找到任何解决方案吗?

2 个答案:

答案 0 :(得分:0)

我认为如果你用ajax添加一个输入,你的表单将在验证时发送错误。

如果要添加输入(在验证期间),您应该查找表单事件侦听器。 doc:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

另一种方法是使用表单类中的选项'required=>false'初始化所需的所有字段,并在文档准备好的javascript中使用可见性。

答案 1 :(得分:0)

好的,我想我明白你想做什么。所以最好的方法是:

  1. 在表单类型中添加附加输入:

    $builder->add('model', 'text');
    
  2. 用javascript隐藏它(以jQuery为例):

    $(function(){
        $('input[name="model"]').hide();
    });
    
  3. 修改您的FormCategoryAjaxRequest功能,根据您的条件显示您的字段:

    function FormCategoryAjaxRequest(ref_doc) {
        if (ref_doc==101 || ref_doc==102 {
            $('input[name="model"]').show();
        }
    }
    
  4. 有了它,它应该按预期工作。为了完美,您可以在NotBlank事件上根据所选的选项以动态方式添加PostSetData约束。 Look here了解更多信息。