使用 query_builder 和多个 true 将数据设置为实体字段
set data to entity field with query_builder and multiple 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);
数据:
Doctrine\Common\Collections\ArrayCollection Object
(
[elements:Doctrine\Common\Collections\ArrayCollection:private] => Array
(
[0] => BS\SmartDistributionBundle\Entity\Product Object
(
[id:BS\SmartDistributionBundle\Entity\Product:private] => 6
[type:BS\SmartDistributionBundle\Entity\Product:private] => 1
[name:BS\SmartDistributionBundle\Entity\Product:private] => Starter Pack
[duration:BS\SmartDistributionBundle\Entity\Product:private] => 1
[description:BS\SmartDistributionBundle\Entity\Product:private] => Tout de suite
[full_description:BS\SmartDistributionBundle\Entity\Product:private] => blabla
[price:BS\SmartDistributionBundle\Entity\Product:private] => 39
[picture:BS\SmartDistributionBundle\Entity\Product:private] => /tmp/php6h3rXK
[active:BS\SmartDistributionBundle\Entity\Product:private] => 1
)
[1] => BS\SmartDistributionBundle\Entity\Product Object
(
[id:BS\SmartDistributionBundle\Entity\Product:private] => 15
[type:BS\SmartDistributionBundle\Entity\Product:private] => 1
[name:BS\SmartDistributionBundle\Entity\Product:private] => asdsd
[duration:BS\SmartDistributionBundle\Entity\Product:private] => 2
[description:BS\SmartDistributionBundle\Entity\Product:private] => asdasd
[full_description:BS\SmartDistributionBundle\Entity\Product:private] => adsd
[price:BS\SmartDistributionBundle\Entity\Product:private] => 12
[picture:BS\SmartDistributionBundle\Entity\Product:private] => uploads/product/d978b90215d06fbf569203e7cf2d5aef.png
[active:BS\SmartDistributionBundle\Entity\Product:private] => 1
)
)
)
现在我要勾选相应的复选框!?
同一字段有多个 false 我可以设置值
'data' => $this->value
我试过了
'data' => $this->specialProduct # not working (contains $specialProduct above)
如何设置这些值?
我需要传递数组吗?
谢谢!
表单的默认值设置总是在 FormInterface
的实例上使用 setData
而不是在每个表单字段的选项数组中作为 data
完成。 The docs says:
The default values for form fields are taken directly from the underlying data structure (e.g. an entity or an array). The data option overrides this default value.
如果您使用 data
选项,那么表单将始终预选 data
中的内容,而不是实体中的内容。
因此,如果我正确理解您的代码,它将是:
$form->setData([
specialProduct => $request->getSession()->get('specialProduct')
]);
因为session中存储的数据是Product
个集合。
我这样结束了:
我正在存储数组集合并将其传递给表单
controller :
$specialProduct = $form->get('specialProduct')->getData();
$request->getSession()->set('specialProduct', $specialProduct);
form :
$this->specialProduct = $options['specialProduct'];
'data' => $this->specialProduct
相反,我使用了一个只有 ID 的数组
foreach ($specialProduct as $product) {
$specialProductIds[] = $product->getId();
}
$request->getSession()->set('specialProductIds', $specialProductIds);
通过实体管理器将其传递给表单
$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)
仍在等待更清洁的解决方案!
谢谢!
我有以下字段
->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);
数据:
Doctrine\Common\Collections\ArrayCollection Object
(
[elements:Doctrine\Common\Collections\ArrayCollection:private] => Array
(
[0] => BS\SmartDistributionBundle\Entity\Product Object
(
[id:BS\SmartDistributionBundle\Entity\Product:private] => 6
[type:BS\SmartDistributionBundle\Entity\Product:private] => 1
[name:BS\SmartDistributionBundle\Entity\Product:private] => Starter Pack
[duration:BS\SmartDistributionBundle\Entity\Product:private] => 1
[description:BS\SmartDistributionBundle\Entity\Product:private] => Tout de suite
[full_description:BS\SmartDistributionBundle\Entity\Product:private] => blabla
[price:BS\SmartDistributionBundle\Entity\Product:private] => 39
[picture:BS\SmartDistributionBundle\Entity\Product:private] => /tmp/php6h3rXK
[active:BS\SmartDistributionBundle\Entity\Product:private] => 1
)
[1] => BS\SmartDistributionBundle\Entity\Product Object
(
[id:BS\SmartDistributionBundle\Entity\Product:private] => 15
[type:BS\SmartDistributionBundle\Entity\Product:private] => 1
[name:BS\SmartDistributionBundle\Entity\Product:private] => asdsd
[duration:BS\SmartDistributionBundle\Entity\Product:private] => 2
[description:BS\SmartDistributionBundle\Entity\Product:private] => asdasd
[full_description:BS\SmartDistributionBundle\Entity\Product:private] => adsd
[price:BS\SmartDistributionBundle\Entity\Product:private] => 12
[picture:BS\SmartDistributionBundle\Entity\Product:private] => uploads/product/d978b90215d06fbf569203e7cf2d5aef.png
[active:BS\SmartDistributionBundle\Entity\Product:private] => 1
)
)
)
现在我要勾选相应的复选框!?
同一字段有多个 false 我可以设置值
'data' => $this->value
我试过了
'data' => $this->specialProduct # not working (contains $specialProduct above)
如何设置这些值? 我需要传递数组吗?
谢谢!
表单的默认值设置总是在 FormInterface
的实例上使用 setData
而不是在每个表单字段的选项数组中作为 data
完成。 The docs says:
The default values for form fields are taken directly from the underlying data structure (e.g. an entity or an array). The data option overrides this default value.
如果您使用 data
选项,那么表单将始终预选 data
中的内容,而不是实体中的内容。
因此,如果我正确理解您的代码,它将是:
$form->setData([
specialProduct => $request->getSession()->get('specialProduct')
]);
因为session中存储的数据是Product
个集合。
我这样结束了:
我正在存储数组集合并将其传递给表单
controller :
$specialProduct = $form->get('specialProduct')->getData();
$request->getSession()->set('specialProduct', $specialProduct);
form :
$this->specialProduct = $options['specialProduct'];
'data' => $this->specialProduct
相反,我使用了一个只有 ID 的数组
foreach ($specialProduct as $product) {
$specialProductIds[] = $product->getId();
}
$request->getSession()->set('specialProductIds', $specialProductIds);
通过实体管理器将其传递给表单
$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)
仍在等待更清洁的解决方案!
谢谢!