установите данные в поле сущности с query_builder и несколькими true

У меня есть следующее поле

        ->add('specialProduct' , 'entity', array(
            'class' => 'BSSmartDistributionBundle:Product',
            'expanded' => true,
            'multiple' => true,
            'required' => true,
            'label' => false,
            'mapped' => false,
            'query_builder' => function(ProductRepository $er) {
                return $er->createQueryBuilder('p')
                    ->where('p.active = :active')
                    ->andWhere('p.type = :type')
                    ->setParameter('type', 1)
                    ->setParameter('active', 1);
            },
            'data' => $this->specialProduct # not working
        ))

Я получаю данные и сохраняю их в сеансе

$specialProduct = $form->get('specialProduct')->getData();
$request->getSession()->set('specialProduct', $specialProduct);

данные :

DoctrineCommonCollectionsArrayCollection Object
(
[elements:DoctrineCommonCollectionsArrayCollection:private] =>   Array
    (
        [0] => BSSmartDistributionBundleEntityProduct Object
            (
                [id:BSSmartDistributionBundleEntityProduct:private] => 6
                [type:BSSmartDistributionBundleEntityProduct:private] => 1
                [name:BSSmartDistributionBundleEntityProduct:private] => Starter Pack
                [duration:BSSmartDistributionBundleEntityProduct:private] => 1
                [description:BSSmartDistributionBundleEntityProduct:private] => Tout de suite
                [full_description:BSSmartDistributionBundleEntityProduct:private] => blabla
                [price:BSSmartDistributionBundleEntityProduct:private] => 39
                [picture:BSSmartDistributionBundleEntityProduct:private] => /tmp/php6h3rXK
                [active:BSSmartDistributionBundleEntityProduct:private] => 1
            )

        [1] => BSSmartDistributionBundleEntityProduct Object
            (
                [id:BSSmartDistributionBundleEntityProduct:private] => 15
                [type:BSSmartDistributionBundleEntityProduct:private] => 1
                [name:BSSmartDistributionBundleEntityProduct:private] => asdsd
                [duration:BSSmartDistributionBundleEntityProduct:private] => 2
                [description:BSSmartDistributionBundleEntityProduct:private] => asdasd
                [full_description:BSSmartDistributionBundleEntityProduct:private] => adsd
                [price:BSSmartDistributionBundleEntityProduct:private] => 12
                [picture:BSSmartDistributionBundleEntityProduct:private] => uploads/product/d978b90215d06fbf569203e7cf2d5aef.png
                [active:BSSmartDistributionBundleEntityProduct:private] => 1
            )

    )

)

теперь я хотел бы проверить соответствующие флажки !?

То же поле с несколькими false я могу установить значение с

'data' => $this->value

Я пытался

'data' => $this->specialProduct # not working (contains $specialProduct above)

Как установить эти значения ?
Нужно ли передавать массив ?

Спасибо!

2 ответа

  1. Установка значений по умолчанию для формы всегда выполняется на экземпляре FormInterfaceusingsetData, а не как dataв массиве options для каждого поля формы. The docs says:

    Значения по умолчанию для полей формы берутся непосредственно из базовой структуры данных (например, сущности или массива). Параметр data переопределяет это значение по умолчанию.

    Если вы использовали dataопцию, чем форма всегда будет иметь предварительно выбран, что находится вdata, а не из сущности.

    Поэтому, если я правильно понимаю ваш код, это будет:

    $form->setData([
        specialProduct => $request->getSession()->get('specialProduct')
    ]);
    

    Поскольку хранимые данные в сеансе являются коллекцией Products.

  2. Я закончил делать это таким образом :

    Я сохранял и передавал в форму коллекцию arrayCollection

    controller :
    $specialProduct = $form->get('specialProduct')->getData();
    $request->getSession()->set('specialProduct', $specialProduct);
    
    form :
    $this->specialProduct  = $options['specialProduct'];
    
    'data' => $this->specialProduct
    

    вместо этого я использую массив только с идентификаторами

    foreach ($specialProduct as $product) {
        $specialProductIds[] = $product->getId();
    }
    
    $request->getSession()->set('specialProductIds', $specialProductIds);
    

    передайте его в форму с помощью entity manager

    $this->specialProductIds  = $options['specialProductIds'];
    $this->em                 = $options['em'];
    

    в форме

    public function availablespcialProduct($ids) {
    
        if ($this->em) {
            return $this->em
            ->getRepository('BS\SmartDistributionBundle\Entity\Product')
            ->findById(
                $ids
            );
        }
    }
    

    и, наконец,

    'data'     => $this->availablespcialProduct($this->specialProductIds)
    

    Все еще жду более чистого решения !

    Спасибо!