次の関係を持つ国、州、都市の 3 つのエンティティがあります。
都市を作成するとき、2 つのセレクターが必要です。1 つは国用で、もう 1 つは都市が属する州用です。これら 2 つのセレクターは連鎖する必要があるため、Country を変更すると、他のセレクターに表示される州が「フィルター処理」されます。
Form Events を使用してこれを行う方法を示すチュートリアルを見つけましたが、その例は私の場合ではありません。私のエンティティ City は、Country エンティティに直接関連していません (State を介して間接的に関連しています)。そのため、City フォーム (クラス CityType 内) で国フィールドを設定すると、ご覧のようにそのフィールドを宣言する'property_path'=>false
必要があります。以下のコードで:
class CityType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('country', 'entity', array(
'class'=>'TestBundle:Country',
'property'=>'name',
'property_path'=>false //Country is not directly related to City
));
$builder->add('name');
$factory = $builder->getFormFactory();
$refreshStates = function ($form, $country) use ($factory)
{
$form->add($factory->createNamed('entity', 'state', null, array(
'class' => 'Test\TestBundle\Entity\State',
'property' => 'name',
'query_builder' => function (EntityRepository $repository) use ($country)
{
$qb = $repository->createQueryBuilder('state')
->innerJoin('state.country', 'country');
if($country instanceof Country) {
$qb->where('state.country = :country')
->setParameter('country', $country);
} elseif(is_numeric($country)) {
$qb->where('country.id = :country')
->setParameter('country', $country);
} else {
$qb->where('country.name = :country')
->setParameter('country', "Venezuela");;
}
return $qb;
}
)));
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates)
{
$form = $event->getForm();
$data = $event->getData();
if($data == null)
return;
if($data instanceof City){
if($data->getId()) { //An existing City
$refreshStates($form, $data->getState()->getCountry());
}else{ //A new City
$refreshStates($form, null);
}
}
});
$builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($refreshStates)
{
$form = $event->getForm();
$data = $event->getData();
if(array_key_exists('country', $data)) {
$refreshStates($form, $data['country']);
}
});
}
public function getName()
{
return 'city';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Test\TestBundle\Entity\City');
}
}
問題は、既存の都市を編集しようとすると、関連する国がフォームでデフォルトで選択されていないことです。行を削除すると、 'property_path'=>false
(当然のことながら) エラー メッセージが表示されます。
クラス「Test\TestBundle\Entity\City」には、プロパティ「country」もメソッド「getCountry()」もメソッド「isCountry()」も存在しません
何か案は?