【问题标题】:How to manage linked entities in a create/update Symfony2 form如何在创建/更新 Symfony2 表单中管理链接实体
【发布时间】:2016-12-20 09:02:17
【问题描述】:

我的 Symfony2 网络应用程序中有一个用于管理商店的表单。我希望能够使用此表单创建和编辑我的商店。 我的问题是我的商店实体有一个地址,这是我需要在创建商店的同时创建的另一个实体

店铺实体的组成如下:

<?php
//src/appBundle/Entity/Shop
namespace AppBundle\Entity;    
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
 * Shop
 *
 * @ORM\Table(name="app_shop")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ShopRepository")
 */
class Shop
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(name="shopName", type="string", length=255)
     */
    private $shopName;

    /**
     * @var string
     * @ORM\Column(name="description", type="text", nullable=true)
     */
    private $description;

    /**
     * @var string
     * @ORM\Column(name="ownerName", type="string", length=255)
     */
    private $ownerName;

    /**
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\Seller", cascade={"refresh"}, fetch="EAGER")
     * @ORM\JoinColumn(nullable=false, onDelete="NO ACTION")
     * @Assert\Valid()
     */
    private $owner;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Address", cascade={"refresh"}, fetch="EAGER")
     * @ORM\JoinColumn(nullable=true, onDelete="NO ACTION")
     * @Assert\Valid()
     */
    private $address;

   //..getters&setters
}

一家商店有一个Adress,每次我在此表单中时都需要创建或编辑此地址实体。我的地址实体是这样组成的:

//src/appBundle/Entity/Address
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Adress
 *
 * @ORM\Table(name="app_address")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\AddressRepository")
 */
class Address
{
    /**
     * @var int
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(name="street", type="string", length=255)
     * 
     */
    private $street;

    /**
     * @ORM\Column(type="string", length=5)
     */
    private $postalCode;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $city;

    /**
     * @var string
     * @ORM\Column(name="country", type="string", length=255)
     */
    private $country;

    //..getters&setters

    public function __toString() {
        return $this->street." ".$this->getPostalCode()." ".$this->getCity();
    }
}

我在注册过程中创建了一个表单来管理商店。我的问题是 我无法像我的商店实体那样显示地址字段。我只有一个选择列表,其中显示了我的数据库中已经存在的地址。

<?php
namespace UserBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use AppBundle\Entity\Address;

class ShopType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('shopName', TextType::class, array('label' => 'Nom du magasin*', 'required' => true, 'error_bubbling' => true))
            ->add('ownerName', TextType::class, array('label' => 'Nom du gérant*', 'required' => true, 'error_bubbling' => true))

            ->add('address', EntityType::class , array('class' => 'AppBundle:Address'))
        ;
    } 
}

在我的控制器中,我将我的表单实例化如下:

    $shop = $em->getRepository('AppBundle:Shop')->findOneByOwner($user);
    if ($shop == null){
        $shop = new Shop();
    }
    $form = $this->createForm(ShopType::class , $shop);

在此示例中,我有一个包含现有地址的选择列表,如下所示:

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

    您希望在您的商店表单中嵌入一个地址表单,因此您需要为地址实体创建一个表单,然后您将在您的 ShopType 中添加一个 AddressType,如下所述: http://symfony.com/doc/current/form/embedded.html

    如果您使用 EntityType,您将从数据库中选择一个实体进行链接(例如,如果郊区/国家/地区是一个单独的实体,请考虑在您的地址中设置郊区/国家/地区)。

    【讨论】:

    • 谢谢,这正是我要找的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2016-02-10
    相关资源
    最近更新 更多