【发布时间】:2015-02-12 10:17:45
【问题描述】:
在我的 Symfony 项目中,我需要在另一个 one 中包含/覆盖一个 formType,请参阅 外键。
确实,当我在控制器中执行addAction() 方法 时,我必须同时将我的数据添加到两个表中,并且它必须与外键和我的两个表之间的关系匹配表格。
这是我的第一个班级/实体:
class Zonestechnique
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=150, nullable=false)
*/
private $nom;
//getters and setters
这个实体与另一个外键所在的实体链接,看看我的第二个实体/类:
class Conformiteszonestechnique
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="precision", type="text", nullable=true)
*/
private $precision;
/**
* @var \Zonestechnique
*
* @ORM\ManyToOne(targetEntity="Zonestechnique")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="zonestechnique_id", referencedColumnName="id")
* })
*/
private $zonestechnique;
/**
* Constructor
*/
public function __construct()
{
$this->zonestechnique = new \Doctrine\Common\Collections\ArrayCollection();
}
//getters and setters
如您所见,$zonestechnique 是外键。这些实体通过多对一关系链接。
我需要将 ZonestechniqueType 表单包含到 ConformiteszonestechniqueType。
看看我的代码:
class ZonestechniqueType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom')
->add('localisation')
->add('commentaire')
->add('batiments')
->add('categorieszonestechnique')
;
}
这个表单生成器接口必须包含在ConformiteszonestechniqueType中:
class ConformiteszonestechniqueType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('precision')
->add('dateverification')
->add('typesetatsconformite')
->add('typesconformitezonestechnique')
->add('zonestechnique')
;
}
所以我需要将ZonestechniqueType formBuilder 包含在另一个ConformiteszonestechniqueType 中,用于我的控制器中的addAction() 方法。因此,当我在 ConformiteszonestechniqueType 中添加数据时,我在 ZonestechniqueType 中有数据,这样我的两个实体之间的关系与我的数据库保持一致。
这是我的controller:
public function addAction() {
$em=$this->getDoctrine()->getManager();
$zoneconformite = new Conformiteszonestechnique;
$form = $this->createForm(new ConformiteszonestechniqueType(), $zoneconformite);
$request = $this->getRequest();
if ($request->isMethod('POST') | ($form->isValid()) ) {
$form->bind($request);
$zoneconformite = $form->getData();
$em->persist($zoneconformite);
$em->flush();
return $this->redirect($this->generateUrl('myRoute'));
我该如何继续?这是正确的方法吗?
我想我必须使用formType中的集合字段。
更新
我将我的ConformiteszonestechniqueType 更改为:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('precision')
->add('dateverification')
->add('typesetatsconformite')
->add('typesconformitezonestechnique')
->add('zonestechnique', 'collection', array('type' =>new ZonestechniqueType() ) )
;
}
我没有发生错误,但是当我在浏览器上显示表单时,我没有zonestechnique 的表单。事实上,zonestechnique 的字段有一个名为 zonestechnique 的标签,但没有添加字段。
【问题讨论】:
标签: php forms symfony doctrine-orm controller