私は、製品オプションを好きなだけ追加できるフォームを作成しようとしています (つまり、プロトタイプを使用したコレクション)。このためには、1 つのオプション定義と 2 つ目のオプション値の 2 つのフィールドが必要です。
Product、Options、Options Definitions、Product Options Join などのエンティティがあります (1 つの ManyToMany ではなく 2 つの ManyToOne を使用することにしたので、Product Definitions Join では、ManyToMany を Options に、ManyToMany を Products にしました)。
製品にオプションを追加するときは、最初にオプション定義を選択してから、選択ボックスをオプションで更新します。これですべて問題なく動作しますが、問題は、製品を編集しようとすると、デフォルトのオプション定義が表示されることです。たとえば、製品を作成していたときに、オプション定義サイズで製品を追加しましたが、サイズの値は 40 でした。製品を編集しようとすると、オプション定義の色とサイズが 40 になります。
ここに私が意味する写真があります:
2 行目には、Color ではなく Size が必要です。
ここでは、接続されたテーブルを取得する方法も確認できます。
ProductOptionsType クラス
public function buildForm(FormBuilderInterface $builder, array $options)
{
$factory = $builder->getFormFactory();
$builder
->add('optiondefinitions', 'entity', array(
'mapped' => false,
'class' => 'ePOS\ProductsBundle\Entity\OptionsDefinitions',
'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); },
'property' => 'name',
'attr' => array('class' => 'option-definitions')))
;
$refreshOptions = function ($form, $option) use ($factory) {
$form->add($factory->createNamed('options', 'entity', null, array(
'class' => 'ePOS\ProductsBundle\Entity\Options',
'property' => 'value',
'label' => false,
'auto_initialize' => false,
'query_builder' => function ($repository) use ($option) {
$qb = $repository->createQueryBuilder('options')
->innerJoin('options.optionDefinition', 'optionDefinitions');
if($option instanceof OptionsDefinitions) {
$qb = $qb->where('options.optionDefinition = :optiondefinitions')
->setParameter('optiondefinitions', $option);
} elseif(is_numeric($option)) {
$qb = $qb->where('options.id = :option_id')
->setParameter('option_id', $option);
} else {
$qb = $qb->where('options.optionDefinition = 1');
}
return $qb;
}
)));
};
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($refreshOptions, $factory) {
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return ;
}
$refreshOptions($form, $data->getOptions()->getOptionDefinition());
});
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($refreshOptions) {
$form = $event->getForm();
$data = $event->getData();
if($data == null)
$refreshOptions($form, null); //As of beta2, when a form is created setData(null) is called first
if($data instanceof Location) {
$refreshOptions($form, $data->getOptions()->getOptionDefinition());
}
});
$builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($refreshOptions) {
$form = $event->getForm();
$data = $event->getData();
if(array_key_exists('optiondefinitions', $data)) {
$refreshOptions($form, $data['optiondefinitions']);
}
});
}