Symfony2:在另一个formType中覆盖一个formType引用addAction()方法的外键(多表单类型)
Symfony2: imbricate a formType in another formType refer to the foreign key for addAction() method (multiple form Type)
在我的Symfony项目中,我需要include/imbricate一个formType在另一个一个,参考外键。
事实上,当我在我的控制器中执行 addAction()
方法 时,我必须同时在两个表中添加我的数据,并且它必须与外键匹配并且我的两个表之间的关系。
这是我的第一个 class/entity:
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
这个实体与外键所在的另一个实体链接,看我的第二个 entity/class:
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
是外键。这些实体通过 ManyToOne 关系链接。
我需要将 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
的标签,但没有添加字段。
看看那里:http://symfony.com/doc/current/cookbook/form/form_collections.html
ZonestechniqueType存储在一个数组中,循环遍历即可。
{% for zonestechnique in form.zonestechniques %}
{{ form_row(zonestechnique.nom) }}
{% endfor %}
我之前也遇到过同样的问题。我想出的解决方法是在我的实体 属性 中添加一个具有空白值的默认数组。在您的情况下,它是您的 "Conformiteszonestechnique"。尝试使用默认初始化值更新 $zonestechnique 属性,例如:
/**
* @var \Zonestechnique
*
* @ORM\ManyToOne(targetEntity="Zonestechnique")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="zonestechnique_id", referencedColumnName="id")
* })
*/
private $zonestechnique = array(1); // or whatever id or name you want to initialize
由您决定是在构造函数中初始化还是内联初始化,但只需确保数据类型符合您的预期。
您之所以没有出现此表单字段,是因为表单类型 "collection" 是动态的。意思是,您可以在客户端和服务器端的表单中添加或删除字段。与固定在一个表单域项上的其他典型表单类型不同。
在我的Symfony项目中,我需要include/imbricate一个formType在另一个一个,参考外键。
事实上,当我在我的控制器中执行 addAction()
方法 时,我必须同时在两个表中添加我的数据,并且它必须与外键匹配并且我的两个表之间的关系。
这是我的第一个 class/entity:
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
这个实体与外键所在的另一个实体链接,看我的第二个 entity/class:
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
是外键。这些实体通过 ManyToOne 关系链接。
我需要将 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
的标签,但没有添加字段。
看看那里:http://symfony.com/doc/current/cookbook/form/form_collections.html
ZonestechniqueType存储在一个数组中,循环遍历即可。
{% for zonestechnique in form.zonestechniques %}
{{ form_row(zonestechnique.nom) }}
{% endfor %}
我之前也遇到过同样的问题。我想出的解决方法是在我的实体 属性 中添加一个具有空白值的默认数组。在您的情况下,它是您的 "Conformiteszonestechnique"。尝试使用默认初始化值更新 $zonestechnique 属性,例如:
/**
* @var \Zonestechnique
*
* @ORM\ManyToOne(targetEntity="Zonestechnique")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="zonestechnique_id", referencedColumnName="id")
* })
*/
private $zonestechnique = array(1); // or whatever id or name you want to initialize
由您决定是在构造函数中初始化还是内联初始化,但只需确保数据类型符合您的预期。
您之所以没有出现此表单字段,是因为表单类型 "collection" 是动态的。意思是,您可以在客户端和服务器端的表单中添加或删除字段。与固定在一个表单域项上的其他典型表单类型不同。