2016-03-19 28 views
1

Kullanıcı için seçme seçeneğini doldurmak için ajax çağrısı kurmaya çalışıyorum.Symfony Component Form Exception TransformationFailedException

3/Doğrulama formu

Unable to reverse value for property path "zone": 

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

FormType geçmez:

1/Sen gayet güzel dek bölge görünür

Her şey iş konumunuzu

2/yeni açılan belirleyin:

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]); 

     //...  

Benim Ajax:

$("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: Ben çözüm bulduk

cevap

1

$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)); 

teşekkürler.

Ajax alanımda "ZONE" için önce ChoiceType :: class'ı kullanıyorum, sonra PRE_SUBMIT üzerinde "ZONE" kullanıcı verilerini alıyorum ve alanımı TextType :: class olarak değiştirdim, sonra "getData()" seçeneğini kullanıyorum DB'ye eklemeden önce doğru verileri ayarlamak için.

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]); 
} 
İlgili konular