誰かが私を助けてくれることを願って、私はこれを得ることができません。余分なオプションを持つフォームのエンティティフィールド
私は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;
}
}
ホープこのことができますを追加します。