2017-06-29 17 views
0

我目前工作的用户创建形式。Symfony的3 - 动态表单 - ChoiceType阿贾克斯

用户都有一个配置文件属性:

/** 
    * Many Users have One profile 
    * @ORM\ManyToOne(targetEntity="ProjectBundle\Entity\User\Profile", inversedBy="users") 
    * @ORM\JoinColumn(name="profile_id", referencedColumnName="id") 
    */ 
    private $profile; 

这个图谱是根据另一个选择(变化行动的jQuery)选择:

{% autoescape 'html'%} 
     {{ '<script id="tmpl_user_profile" type="text/x-jquery-tmpl"> 
       <option value="${id}">${libelle}</option> 
     </script>'|raw }} 
{% endautoescape %} 

    <script> 
     $('select#user_organisationMember').on('change',function(){ 
      var value = this.value; 
      if (value == '') { 
       $('#user_profile').empty(); 
      } 
      var urlAjax = "{{ path('admin_user_get_profile', { 'entity': "value" }) }}"; 
      $.ajax({ 
       url: urlAjax.replace("value",value), 
       method: "post" 
      }).done(function(msg){ 
       $('#user_profile').empty(); 
       $('#tmpl_user_profile').tmpl(JSON.parse(msg)).appendTo('#user_profile'); 
      }) ; 
     }); 
    </script> 

在此之前一切运行正常! 根据其他选择,选择标签中的不同配置文件会发生很好的变化。

在页面上的到来,我想配置文件的列表是空的。

所以我使用的Symfony的FormEvent调整自己的状态。

这是我第一次使用FormEvent,我可能犯了一个错误!

我FormType:

/** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('lastname') 
      ->add('firstname') 
      ->add('gender',null,array('required'=>true)) 
      ->add('organisationMember',null,array(
       'required' => true, 
       'choices' => $options['organisation'], 
       'group_by' => 'type_organisation', 
       'placeholder' => 'Choisissez votre organisation' 
      )) 
      ->add('job') 
      ->add('mobile') 
      ->add('phone') 
      ->add('alert_failure') 
      ->add('alert_full') 
      ->add('alert_other') 
      ->add('plainPassword', TextType::class, array('required' => true)) 
      ->add('email') 
      ->add('profile', null, array(
       'required' => true, 
      )); 

     $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
      $entity = $event->getData(); 
      $form = $event->getForm(); 

      if (!$entity || null === $entity->getId()) { 
       $form->remove('profile'); 
       $form->add('profile', ChoiceType::class); 
      } 
     }); 
    } 

默认情况下,我的数据库的所有配置文件被加载在选择不得到错误“这个值是不正确”。

但我不希望用户看到所有的配置文件,所以我在事件中将其删除,并将该字段返回为空。

但我仍然收到错误“此值不正确”,因为实际上,由于基本选择是空的,表单没有找到输入的值。

我想有一个默认为空的选择,它填充在Ajax中,并且不会显示错误“This value is incorrect”。

我怎么能请你呢? 谢谢

+0

是'profile'你的实体的成员与一个外键关系,或者是没有连接到你的数据库? –

+0

有一个外键关系 –

+0

你有没有试过在你的''profile''表单选项中设置'data => null'? –

回答

0

我发现了一个非常简单的解决方案,我不知道它是不是一个好主意,但它不需要很多线条。

我已经交付了默认的形式

/** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('lastname') 
      ->add('firstname') 
      ->add('gender',null,array('required'=>true)) 
      ->add('organisationMember',null,array(
       'required' => true, 
       'choices' => $options['organisation'], 
       'group_by' => 'type_organisation', 
       'placeholder' => 'Choisissez votre organisation' 
      )) 
      ->add('job') 
      ->add('mobile') 
      ->add('phone') 
      ->add('alert_failure') 
      ->add('alert_full') 
      ->add('alert_other') 
      ->add('plainPassword', TextType::class, array('required' => true)) 
      ->add('email') 
      ->add('profile', null, array(
       'required' => true, 
       'placeholder' => 'Choose an organisation !', 
      )); 
    } 

而就我的看法:

<div class="form-group{% if form.profile.vars.errors|length %} has-error{% endif %}"> 
     <label for="{{ form.profile.vars.id }}" class="col-sm-3 control-label no-padding-right required">Profile(s) </label> 
     <div class="col-sm-9"> 
      {% do form.profile.setRendered %} 
      <select name="user[profile]" id="user_profile" required class="form-control"> 
      //We can do a loop if needed 
      </select> 
      {{ form_errors(form.profile) }} 
     </div> 
</div> 

这样,我完全管理是否我想在我的选择信息。

而且它为我工作。

0

不仅在PRE_SET_DATA上,而且在PRE_SUBMIT事件上添加字段。在类似的问题上检查我的answer