Передача значения объекта Entity во вложенные CollectionTypes в форме Symfony4 - PullRequest
0 голосов
/ 16 декабря 2018

Обзор : Foreach VariantGroup в Products VariantSets Мне нужно создать раскрывающийся список, сообщающий, что VariantGroups Variants в форме Symfony

Детали : у меня есть объект Product, который связан как отношение ManyToMany с несколькими VariantSet объектами.VariantSet объекты содержат несколько VariantGroup объектов, каждый из которых должен генерировать раскрывающийся список для отображения их Variant вариантов.

Для вложенных CollectionTypes мне нужно только сделать доступными опции, относящиеся к родительскому элементу.CollectionType.

Таким образом, единственные доступные Variants должны быть связаны с VariantGroups, которые относятся только к имеющимся VariantSets, которые связаны с первоначально проанализированным Product.

Есть некоторая информация, которая указывает на использование конструктора запросов для получения только соответствующих элементов, но мне интересно, является ли это наилучшей практикой.Кроме того - как мне пройти предыдущие формы (таким образом, получая верхний уровень Product во вложенном CollectionType для VariantGroup, когда VariantSets находится между этими двумя).

Возможно ли это даже достичьиспользование лучших практик в формах Symfony?

Пример желаемого вывода здесь

1 Ответ

0 голосов
/ 17 декабря 2018

Да.Ответом были вложенные CollectionType формы и пользовательский конструктор запросов в окончательной форме (по какой-то причине он вызывал все Variant объекты в БД, а не использовал объекты, связанные с проанализированным VariantGroup объектом:

Основная форма продукта

class ComplexProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        // Render the variant sets based on the parsed product
        $builder
            ->add('variantSets', CollectionType::class, [
                'entry_type' => VariantSetComplexProductType::class,
                'label'=> false,
                'by_reference' => true,


            ] );
        ;
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            "data_class" => Product::class,
        ));
    }

}

Отобразить продукты Наборы вариантов: (чтобы получить правильный VariantGroups, связанный с основнымпродукты VarianSet объекты)

class VariantSetComplexProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        // Render the groups based on the Variant sets
        $builder
            ->add( 'label' )
            ->add( 'variantGroups', CollectionType::class, [
                'entry_type' => VariantGroupComplexProductType::class,
                'label'=> false,
                'by_reference' => true
            ] )
        ;
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults( [
            'data_class' => VariantSet::class,
        ] )
        ;
    }
}

Отображение наборов вариантов VariantGroups с его Variants в выпадающем списке:

Выпадающий списокVariant объекты должны быть выполнены в FromEvent с использованием параметров query_builder, так как в противном случае у меня возникла проблема, когда все объекты Variant вызывались в БД.

Там должно бытьпроверка, чтобы убедиться, что только правильные Variant объекты были вызваны на основе проанализированного VariantGroup.

class VariantGroupComplexProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        // Render the drop downs based on the Parsed variant group
        $builder
            ->add( 'label' )
            // Rendering of the drop down must be done after the previous form data is available
            ->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'preSetData']);
        ;
    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults( [
            'data_class' => VariantGroup::class,
        ] );
    }

    public function preSetData(FormEvent $event)
    {
        $form = $event->getForm();

        /** @var VariantGroup $child */
        $child = $event->getData();


        $form
            ->add('variants', EntityType::class, array(
                'class' => Variant::class,
                'by_reference' => true,
                'query_builder' => function (EntityRepository $er) use ( $child ) {
                    return $er->createQueryBuilder('u')
                        ->where('u.variant_group = :variant_group')
                        ->setParameter('variant_group', $child )
                        ->orderBy('u.label', 'DESC');
                },
'choice_label' => 'label',
            ));

    }
}
...