#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)
Все еще ждем более чистого решения!
Спасибо!