2016-11-14 8 views
0

誰かが私を助けてくれることを願って、私はこれを得ることができません。余分なオプションを持つフォームのエンティティフィールド

私はSymfony 3.1.6を使用しています。

私は2つのエンティティ、地域と都市を1対多の関係で持っています。私は、領域をロードする選択ボックスを持つフォームを持っています。選択された領域が選択されている場合、この領域の都市が表示されます。それは素晴らしい作品です。

私は都市にリストされていない場合に、このオプションを選択するための機会をユーザに与えるために、finishView()を使用してCitiesコンボボックスにオプションを追加しました。新しい都市。このオプション値は0です。

フォームが送信されると、「この値は無効です」というエラーが表示されます。これは、オプションの価値であるid = 0の地域の都市が存在しないためです。それから、私が必要とするのは、このバリデーションを無効にしたり排除したりすることですが、それをどうやって行うのか分かりません。

$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { 
     $event->stopPropagation(); 
    }, 900); 

をしかし、働いていなかった....

は明らかに私は、代わりにEntityTypeのChoiceTypeを行く実体かに他ではないので、エレガントな方法との関係を解消することができます

私がしようと試みてきましたこれを解決する。しかし、私は確かに道があると確信しています、これはSymfonyです。

EDIT 1:LocationType

<?php 
namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Doctrine\ORM\EntityRepository; 
use Symfony\Component\Form\Extension\Core\Type\CountryType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\ChoiceList\View\ChoiceView; 

class LocationType extends AbstractType 
{ 

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

    $region_options = array(
     'class' => 'AppBundle:Region', 
     'choice_label' => 'name', 
     'label' => 'Region', 
     'translation_domain' => 'messages', 
     'required' => true, 
     'mapped' => false, 
    ); 

    $city_options = array(
     'class' => 'AppBundle:City', 
     'choice_label' => 'name', 
     'label' => 'City', 
     'translation_domain' => 'messages', 
     'required' => true, 
     'mapped' => false, 
    ); 

    $alt_city_options = array(
     'required' => false, 
     'mapped' => true, 
     'label' => 'Alternative city', 
     'translation_domain' => 'messages', 
     'attr' => array(
      'placeholder' => 'Enter your city name', 
     ), 
    ); 

    $builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function (FormEvent $event) use ($region_options, $city_options, $alt_city_options) { 
      $form = $event->getForm(); 
      $data = $event->getForm()->getParent()->getData(); 

      $country = '332'; 

      $region_options['query_builder'] = function (EntityRepository $er) use ($country) { 
        return $er->createQueryBuilder('r') 
         ->where('r.country = :country') 
         ->setParameter('country', $country) 
         ->orderBy('r.name', 'ASC'); 
       }; 

       if (!empty($data->getRegion())) { 
        $region_options['data'] = $data->getRegion()->getId(); 
       } 
       $form->add('region', EntityType::class, $region_options); 
      } 

      if (!empty($data->getRegion())) { 
       $region = $data->getRegion(); 
       $city_options['query_builder'] = function (EntityRepository $er) use ($country, $region) { 
        return $er->createQueryBuilder('c') 
         ->where('c.country = :country') 
         ->andWhere('c.region = :region') 
         ->setParameter('country', $country) 
         ->setParameter('region', $region) 
         ->orderBy('c.name', 'ASC'); 
       }; 

       if (!empty($data->getCity())) { 
        $region_options['data'] = $data->getCity()->getId(); 
       } 
       $form->add('city', EntityType::class, $city_options); 
      } 
      $form->add('alt_city', TextType::class, $alt_city_options); 
     } 
    ); 

    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { 
     $event->stopPropagation(); 
    }, 900); 
} 

public function finishView(FormView $view, FormInterface $form, array $options) 
{ 
    $new_choice = new ChoiceView(array(), '0', 'not_in_the_list'); 
    $view->children['city']->vars['choices'][] = $new_choice; 
} 

}

ホープこのことができますを追加します。

答えて

0

EntityTypeフィールド定義を貼り付けることはできますか?

この問題を解決するのに役立ちます。

EntityTypeフィールドを設定するには、次のオプションを指定する必要があります。

  • クラス
  • choice_labelを
(あなたは__toStringエンティティ()関数を持っていない限り)
関連する問題