如何在创建/更新Symfony2表单

时间:2016-12-20 09:02:17

标签: php forms symfony

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

商店实体的组成如下:

<?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);

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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