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 使用一对多数据库关系的嵌入式表单的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 与 Doctrine 中的一对多关系

Symfony2 映射一对多多音

一对多还是多对多?

Symfony2 和 Doctrine:一对多关系

一对多、自引用关系 Symfony

Symfony:如何为与 Voryx REST Bundle 的一对多关系创建 POST 请求