【问题标题】:Symfony\Component\Form\Exception\TransformationFailedExceptionSymfony\Component\Form\Exception\TransformationFailedException
【发布时间】:2016-03-19 09:44:10
【问题描述】:

我正在尝试设置一个 ajax 调用来填充用户的选择选项。

1/ 您选择位置

2/ 新的下拉菜单出现在区域中

一切正常,直到:

3/ 验证表不通过

Unable to reverse value for property path "zone":

The choice "13e Arrondissement" does not exist or is not unique

表单类型:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...

     ->add('location', EntityType::class, ['class' => 'PagesBundle:City'])
     ->add('zone', CoreType\ChoiceType::class, ['choices_as_values' => true, 'mapped' => false]);

    $builder->get('zone')->addEventListener( FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $form = $event->getForm()->getParent();
            $data = $event->getData();
            $city[$data] = $data;

            $form->add('zone', CoreType\ChoiceType::class, ['choices' => $city,'choices_as_values' => true]);

        //...     

我的阿贾克斯:

$("document").ready(function() { 
$('#zone').addClass('uk-hidden');
$("#cityName").change(function() {
    var city = $( "#owner_location option:selected" ).text();

       $.ajax({
          type: 'GET',
          url: 'http://locavip.dev/app_dev.php/owner/city/' + city,

          beforeSend: function(){
            $('#owner_zone option').remove();
          },

          success: function(data) {

             $.each(data.zone, function(index, value){
                $('#zone').removeClass('uk-hidden');
                $("#owner_zone").append($('<option>', { value : value, text: value }));
             });
          }
       });

}); });

AjaxController:

$em = $this->getDoctrine()->getManager();
        $database = 'PagesBundle:'.$city;
        $cityName = $em->getRepository($database)->findAll();   

        foreach ($cityName as $value) {
                $cities[] = $value->getZone();
        }
        $response = new JsonResponse();

        return $response->setData(array('zone' => $cities));

谢谢

【问题讨论】:

    标签: ajax forms validation symfony


    【解决方案1】:

    我找到了解决办法。

    对于我的 ajax 字段“ZONE”,我首先使用 ChoiceType::class,然后在 PRE_SUBMIT 上,我从“ZONE”检索用户数据,并将我的字段修改为 TextType::class,然后我使用“getData()”选项在插入数据库之前设置正确的数据。

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('type', ApxType\TypeType::class, ['expanded' => true, 'multiple' => false,'label' => false])
            ->add('room', ApxType\NbRoomType::class,['expanded' => true, 'multiple' => false,'label' => false])
            ->add('rent', CoreType\NumberType::class,['label' => false])
            ->add('area', CoreType\NumberType::class,['label' => false])
            ->add('images', CoreType\CollectionType::class, [
                                'entry_type' => ImagesFlatType::class,
                                'allow_add' => true,
                                'required' => false,
                                'allow_delete' => true,
                                'label' => false,
                                'by_reference' => false,
                                ])
    
            ->add('transport', CoreType\TextType::class,['label' => false, 'required' => false])
            ->add('furnished', ApxType\FurnishedType::class, ['expanded' => true, 'multiple' => false,'label' => false])
            ->add('vip', ApxType\LesVipType::class, ['expanded' => true, 'multiple' => true,'label' => false])
            ->add('feature', ApxType\FeatureType::class, ['expanded' => true, 'multiple' => true,'label' => false])
            ->add('description', CoreType\TextareaType::class,['label' => false, 'required' => false])
    
            // City with ajax call  in register.js
            ->add('location', EntityType::class, ['class' => 'PagesBundle:City', 'placeholder' => 'Selectionner une ville'])
            ->add('zone', CoreType\ChoiceType::class, ['mapped' => false, 'choices_as_values' => true]);
    
        // Add listeners
        $builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));
        $builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmit'));
    
        $builder->getForm();
    }
    /**
     * Check if user is login
     * Add field accordingly 
     * 
     */
    public function onPreSetData(FormEvent $event)
    {
        $user = $this->tokenStorage->getToken()->getUser();
        $form = $event->getForm();
    
        if (!is_object($user)) 
        {
            $form->add('user', UsersType::class, ['label' => false])
                    ->add('corporate', ApxType\CorporateType::class, ['expanded' => true,
                                                                        'multiple' => false,
                                                                        'label' => false])
                    ->add('fee', CoreType\NumberType::class, ['label' => false, 'required' => false]);
        }
    
        if(is_object($user))
        {
            foreach($user->getOwner() as $value)
            {
                if($value->getCorporate() === 'agence')
                {
                    $form->add('fee', CoreType\NumberType::class, ['label' => false, 'required' => false]);
                }
            }   
        }
    }
    
    /**
     * Change field type and populate database 
     * 
     */
    public function onPreSubmit(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();
    
        if(!array_key_exists('zone', $data))
        {
            foreach($user->getOwner() as $value)
            {
                $data['zone'] = $value->getZone();
            }
    
        }
    
        $city = $data['zone'];
    
        $form->add('zone', CoreType\TextType::class, ['data' => $city]);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2019-08-02
      • 2021-05-28
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多