Symfony 2 使用一对多数据库关系的嵌入式表单
Posted
技术标签:
【中文标题】Symfony 2 使用一对多数据库关系的嵌入式表单【英文标题】:Symfony 2 Embedded forms using one to many db relationship 【发布时间】:2011-11-22 07:55:12 【问题描述】:我在一个表单中嵌入来自不同实体的表单时遇到问题,我的表单显示时带有 firstname [input] lastname [input] 地址 - 但地址旁边没有输入。
基本上我想创建一个表单,用户可以在其中添加名字、姓氏、地址1、地址2、城市、国家等,并将其作为一个提交,尽管它是不同的表。
主表单没问题,我唯一遇到的问题是第二个嵌入表单。任何帮助将不胜感激。
这是我的代码:
会员等级:
namespace Pomc\MembersBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Pomc\MembersBundle\Entity\Member
*/
class Member
/**
* @var integer $id
*/
private $id;
/**
* @var string $firstName
*/
private $firstName;
/**
* @var string $lastName
*/
private $lastName;
/**
* @var Pomc\MembersBundle\Entity\Address
*/
private $address;
/**
* @var Pomc\MembersBundle\Entity\Telephone
*/
private $telephone;
public function __construct()
$this->address = new \Doctrine\Common\Collections\ArrayCollection();
$this->telephone = new \Doctrine\Common\Collections\ArrayCollection();
/**
* Get id
*
* @return integer
*/
public function getId()
return $this->id;
/**
* Set firstName
*
* @param string $firstName
*/
public function setFirstName($firstName)
$this->firstName = $firstName;
/**
* Get firstName
*
* @return string
*/
public function getFirstName()
return $this->firstName;
/**
* Set lastName
*
* @param string $lastName
*/
public function setLastName($lastName)
$this->lastName = $lastName;
/**
* Get lastName
*
* @return string
*/
public function getLastName()
return $this->lastName;
/**
* Add address
*
* @param Pomc\MembersBundle\Entity\Address $address
*/
public function addAddress(\Pomc\MembersBundle\Entity\Address $address)
$this->address[] = $address;
/**
* Get address
*
* @return Doctrine\Common\Collections\Collection
*/
public function getAddress()
return $this->address;
/**
* Add telephone
*
* @param Pomc\MembersBundle\Entity\Telephone $telephone
*/
public function addTelephone(\Pomc\MembersBundle\Entity\Telephone $telephone)
$this->telephone[] = $telephone;
/**
* Get telephone
*
* @return Doctrine\Common\Collections\Collection
*/
public function getTelephone()
return $this->telephone;
这里是地址类:
namespace Pomc\MembersBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Pomc\MembersBundle\Entity\Address
*/
class Address
/**
* @var integer $id
*/
private $id;
/**
* @var string $addressType
*/
private $addressType;
/**
* @var string $firstLine
*/
private $firstLine;
/**
* @var string $secondLine
*/
private $secondLine;
/**
* @var string $city
*/
private $city;
/**
* @var string $postCode
*/
private $postCode;
/**
* @var string $country
*/
private $country;
/**
* @var Pomc\MembersBundle\Entity\Member
*/
private $member;
/**
* Get id
*
* @return integer
*/
public function getId()
return $this->id;
/**
* Set addressType
*
* @param string $addressType
*/
public function setAddressType($addressType)
$this->addressType = $addressType;
/**
* Get addressType
*
* @return string
*/
public function getAddressType()
return $this->addressType;
/**
* Set firstLine
*
* @param string $firstLine
*/
public function setFirstLine($firstLine)
$this->firstLine = $firstLine;
/**
* Get firstLine
*
* @return string
*/
public function getFirstLine()
return $this->firstLine;
/**
* Set secondLine
*
* @param string $secondLine
*/
public function setSecondLine($secondLine)
$this->secondLine = $secondLine;
/**
* Get secondLine
*
* @return string
*/
public function getSecondLine()
return $this->secondLine;
/**
* Set city
*
* @param string $city
*/
public function setCity($city)
$this->city = $city;
/**
* Get city
*
* @return string
*/
public function getCity()
return $this->city;
/**
* Set postCode
*
* @param string $postCode
*/
public function setPostCode($postCode)
$this->postCode = $postCode;
/**
* Get postCode
*
* @return string
*/
public function getPostCode()
return $this->postCode;
/**
* Set country
*
* @param string $country
*/
public function setCountry($country)
$this->country = $country;
/**
* Get country
*
* @return string
*/
public function getCountry()
return $this->country;
/**
* Set member
*
* @param Pomc\MembersBundle\Entity\Member $member
*/
public function setMember(\Pomc\MembersBundle\Entity\Member $member)
$this->member = $member;
/**
* Get member
*
* @return Pomc\MembersBundle\Entity\Member
*/
public function getMember()
return $this->member;
这是会员表格:
namespace Pomc\MembersBundle\Form\Type;
use \Symfony\Component\Form\AbstractType;
use \Symfony\Component\Form\FormBuilder;
class MemberType extends AbstractType
public function buildForm(FormBuilder $builder, array $options)
$builder->add('firstName');
$builder->add('lastName');
$builder->add('address','collection', array( 'type' => new AddressType(),
'allow_add' => true,
'prototype' => true,
'by_reference' => false,
));
public function getDefaultOptions(array $options)
return array('data_class' => 'Pomc\MembersBundle\Entity\Member');
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
function getName()
return 'member';
这是地址表格:
namespace Pomc\MembersBundle\Form\Type;
use \Symfony\Component\Form\AbstractType;
use \Symfony\Component\Form\FormBuilder;
class AddressType extends AbstractType
public function buildForm(Formbuilder $builder, array $options)
$builder->add('firstLine');
public function getDefaultOptions(array $options)
return array('data_class' => 'Pomc\MembersBundle\Entity\Address');
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
function getName()
return 'address';
function getIdentifier()
return 'address';
这里是控制器:
namespace Pomc\MembersBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use \Pomc\MembersBundle\Entity\Member;
use \Symfony\Component\HttpFoundation\Request;
use \Pomc\MembersBundle\Form\Type\MemberType;
class DefaultController extends Controller
public function indexAction($name)
return $this->render('PomcMembersBundle:Default:index.html.twig', array('name' => $name));
public function newAction(Request $request)
$member = new Member();
$form = $this->get('form.factory')->create(new MemberType());
if($request->getMethod() == 'POST')
$form->bindRequest($request);
if($form->isValid())
$em = $this->getDoctrine()->getEntityManager();
$em->persist($member);
$em->flush();
return $this->render('PomcMembersBundle:Default:new.html.twig', array( 'form'=> $form->createView(),));
这是模板:
<form action=" path('member_new') " method="post" form_enctype(form)>
form_widget(form)
<div>
form_row(form.address)
</div>
<input type="submit" />
</form>
我是这个网站的长期用户,但这是我的第一个问题。
谢谢
【问题讨论】:
如何嵌入表单集合可能会有所帮助。 symfony.com/doc/2.3/cookbook/form/form_collections.html 【参考方案1】:哦,我遇到了同样的问题,但我找到了解决方案,希望这对你有帮助:-)
您忘记将地址对象添加到成员实体。
在您的操作中,您需要执行以下操作:
$member = new Member();
$member->addAddress(new Address());
$form = $this->createForm(new MemberType(), $member);
然后在你的模板中:
% for address in form.address %
form_widget(address.firstLine)
% endfor %
顺便说一句,您的“第一行”小部件与实体属性无关。
顺便说一句,如果您调用 addAddress 两次,您当然会在表单中获得两个“第一行”小部件。
希望这可行。祝你好运。
【讨论】:
感谢您的帮助,我仍在努力让它工作,一定是哪里出了问题。很快就会让它工作。谢谢 这仅在您创建新实体时有效,而不是编辑【参考方案2】:Llewellyn,你的意思是这样的吗:
公共函数editAction($id) $em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('imBundle:Inspecciones')->find($id);
$entity_valores = $em->getRepository('imBundle:ValoresInspecciones')->findByInspecciones($id);
if (!$entity)
throw $this->createNotFoundException('Unable to find Inspecciones entity.');
$entity->setValoresInspecciones($entity_valores);
$editForm = $this->createEditForm($entity);
$deleteForm = $this->createDeleteForm($id);
return $this->render('imBundle:Inspecciones:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
【讨论】:
以上是关于Symfony 2 使用一对多数据库关系的嵌入式表单的主要内容,如果未能解决你的问题,请参考以下文章