установка данных в поле сущности с помощью query_builder и множественного значения true

#php #symfony #symfony-forms

#php #symfony #symfony-forms

Вопрос:

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

         ->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)
  

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

Спасибо!

Ответ №1:

Установка значений по умолчанию для формы всегда выполняется в экземпляре FormInterface using setData , а не как data в массиве параметров для каждого поля формы. В документах говорится:

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

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

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

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

Поскольку сохраненные данные в сеансе представляют собой набор Product s.

Комментарии:

1. итак, я удалил данные в форме, добавил setData в контроллер, флажки не установлены. В любом случае спасибо 🙂

2. Вам нужно показать свой код, иначе вам невозможно помочь.

3. это контроллер на 1200 строк:( (да, я знаю)! позвольте мне попробовать поиграть с setData. Спасибо!

Ответ №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('BSSmartDistributionBundleEntityProduct')
        ->findById(
            $ids
        );
    }
}
  

и, наконец,

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

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

Спасибо!