Forms symfony2标签和字段来自2个不同的DB

Forms symfony2标签和字段来自2个不同的DB,forms,symfony,entity,Forms,Symfony,Entity,更新:我只是想确切地说,我是Symfony2的新手,通常使用框架。我想澄清我的问题:我希望有一个包含许多字段的大表单,并且每个字段的标签来自第二个DB。在没有框架的纯PHP中需要30分钟,但是如何使用Sf2呢 我有一个问题要以一种形式多次显示同一实体。 以下是上下文: 我有一个停车场,有多个停车位。为了最好地管理停车场,决定对每个要占用的停车位给予优先顺序。 停车场经理可以随时更改优先级,但必须有历史记录。 停车位已声明,经理无法编辑。 为此,我创造了许多实体:公园和历史遗迹。历史悠久,有许多公

更新:我只是想确切地说,我是Symfony2的新手,通常使用框架。我想澄清我的问题:我希望有一个包含许多字段的大表单,并且每个字段的标签来自第二个DB。在没有框架的纯PHP中需要30分钟,但是如何使用Sf2呢

我有一个问题要以一种形式多次显示同一实体。
以下是上下文:
我有一个停车场,有多个停车位。为了最好地管理停车场,决定对每个要占用的停车位给予优先顺序。
停车场经理可以随时更改优先级,但必须有历史记录。
停车位已声明,经理无法编辑。
为此,我创造了许多实体:公园和历史遗迹。历史悠久,有许多公园。
我希望对于每个停车位标签,都有一个字段以一种形式输入占用优先级。
实体声明如下:

这就是我希望的结果:


停车场A1
停车位A2
停车场A3
停车场A4
...

我花了很多时间在这上面,但我没有找到任何解决办法。我在堆栈上尝试了许多解决方案,但没有一个能回答我的问题。

我设法回答了这个问题。我更改了数据库体系结构,并在表单中使用了“Collection”字段

我把全部代码留在这里。我希望它能帮助其他人

历史实体

//src/Xxx/YyyBundle/Entity/History.php
namespace Xxx\YyyBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * Xxx\YyyBundle\Entity\History
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\HistoryRepository")
 * @UniqueEntity(
 *      fields="name",
 *      message="Il existe déjà une table ayant ce nom."
 * )
 */
class History
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255, unique=true)
     * @Assert\NotBlank(message="Le nom de la table a été oublié")
     */
    private $name;

    /**
     * @var datetime $date
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var Xxx\ZzzBundle\Entity\User $agent
     *
     * @ORM\ManyToOne(targetEntity="Ratp\AgentBundle\Entity\User")
     * @ORM\JoinColumn(name="agent_id", referencedColumnName="id")
     */
    private $agent;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingPlacePriority $agent
     *
     * @ORM\OneToMany(targetEntity="ParkingPlacePriority", mappedBy="history", cascade={"persist"})
     * @Assert\Valid(traverse=true)
     */
    private $parkingPlacesPriorities;


    /**
     * Constructeur
     *
     * @return string 
     */
    public function __construct()
    {
        $this->parkingPlacesPriorities = new ArrayCollection();
    }

    /**
     * Get History's name
     *
     * @return string 
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set date
     *
     * @param datetime $date
     */
    public function setDate($date)
    {
        $this->date = $date;
    }

    /**
     * Get date
     *
     * @return datetime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set agent
     *
     * @param Xxx\ZzzBundle\Entity\User $agent
     */
    public function setAgent(\Xxx\ZzzBundle\Entity\User $agent)
    {
        $this->agent = $agent;
    }

    /**
     * Get agent
     *
     * @return Xxx\ZzzBundle\Entity\User 
     */
    public function getAgent()
    {
        return $this->agent;
    }

    /**
     * Set parkingPlacesPriorities
     *
     * @param Xxx\YyyBundle\Entity\ParkingPlacePriority $agent
     */
    public function setParkingPlacesPriorities(ArrayCollection $parkingPlacesPriorities)
    {
        $this->parkingPlacesPriorities = $parkingPlacesPriorities;

        foreach($parkingPlacesPriorities as $parkingPlacePriority)
        {
            $parkingPlacePriority->setHistory($this);
        }
    }

    /**
     * Get parkingPlacesPriorities
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlacePriority 
     */
    public function addParkingPlacesPriorities(\Xxx\YyyBundle\Entity\ParkingPlacePriority $parkingPlacesPriorities)
    {
        return $this->parkingPlacesPriorities[] = $parkingPlacesPriorities;

        foreach($parkingPlacesPriorities as $parkingPlacePriority)
        {
            $parkingPlacePriority->setHistory($this);
        }
    }

    /**
     * Get parkingPlacesPriorities
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlacePriority 
     */
    public function getParkingPlacesPriorities()
    {
        return $this->parkingPlacesPriorities;
    }
}
//src/Xxx/YyyBundle/Entity/ParkingPlace.php
namespace Xxx\YyyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Xxx\YyyBundle\Entity\ParkingPlace
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\ParkingPlaceRepository")
 */
class ParkingPlace
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $orderSequence
     *
     * @ORM\Column(name="orderSequence", type="integer")
     * @Assert\Min(
     *      limit="1",
     *      message="L'ordre d'affichage ne peux être inférieure à 1",
     *      invalidMessage="L'ordre d'affichage doit être un chiffre"
     * )
     */
    private $orderSequence;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\MinLength(
     *      limit=1,
     *      message="Le nom SAET doit comporter au minimum 1 caractère"
     * )
     * @Assert\MaxLength(
     *      limit=255,
     *      message="Le nom SAET doit comporter au maximum 255 caractères"
     * )
     * @Assert\Regex(
     *      pattern="/^[a-z0-9-]+$/i",
     *      message="Le nom d'exploitation contient des caractères invalides (seul les caractères alphanumériques et le tiret '-' sont acceptés)"
     * )
     */
    private $name;

    /**
     * @var string $saetName
     *
     * @ORM\Column(name="saetName", type="string", length=255, unique=true)
     * @Assert\MinLength(
     *      limit=5,
     *      message="Le nom SAET doit comporter au minimum 5 caractères"
     * )
     * @Assert\MaxLength(
     *      limit=255,
     *      message="Le nom SAET doit comporter au maximum 255 caractères"
     * )
     * @Assert\Regex(
     *      pattern="/^prk_/i",
     *      message="Le nom SAET ne commence pas par 'PRK_'"
     * )
     * @Assert\Regex(
     *      pattern="/^[a-z0-9_]+$/i",
     *      message="Le nom SAET  contient des caractères invalides (seul les caractères alphanumériques et le trait de soulignemet '_' sont acceptés)"
     * )
     */
    private $saetName;

    /**
     * @var string $rail
     *
     * @ORM\Column(name="rail", type="string", length=5)
     * @Assert\NotBlank()
     * @Assert\MinLength(
     *      limit=1,
     *      message="Le nom SAET doit comporter au minimum 1 caractères"
     * )
     * @Assert\MaxLength(
     *      limit=5,
     *      message="Le nom SAET doit comporter au maximum 5 caractères"
     * )
     */
    private $rail;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingZone $parkingZone
     *
     * @ORM\ManyToOne(targetEntity="ParkingZone")
     * @ORM\JoinColumn(name="parkingzone_id", referencedColumnName="id")
     */
    private $parkingZone;


    /**
     * Get ParkingPlace's name
     *
     * @return string 
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set orderSequence
     *
     * @param integer $orderSequence
     */
    public function setOrderSequence($orderSequence)
    {
        $this->orderSequence = $orderSequence;
    }

    /**
     * Get orderSequence
     *
     * @return integer 
     */
    public function getOrderSequence()
    {
        return $this->orderSequence;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = strtoupper($name);
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set saetName
     *
     * @param string $saetName
     */
    public function setSaetName($saetName)
    {
        $this->saetName = strtoupper($saetName);
    }

    /**
     * Get saetName
     *
     * @return string 
     */
    public function getSaetName()
    {
        return $this->saetName;
    }

    /**
     * Set rail
     *
     * @param string $rail
     */
    public function setRail($rail)
    {
        $this->rail = strtoupper($rail);
    }

    /**
     * Get rail
     *
     * @return string 
     */
    public function getRail()
    {
        return $this->rail;
    }

    /**
     * Set parkingZone
     *
     * @param Xxx\YyyBundle\Entity\ParkingZone $parkingZone
     */
    public function setParkingZone(\Xxx\YyyBundle\Entity\ParkingZone $parkingZone)
    {
        $this->parkingZone = $parkingZone;
    }

    /**
     * Get parkingZone
     *
     * @return Xxx\YyyBundle\Entity\ParkingZone 
     */
    public function getParkingZone()
    {
        return $this->parkingZone;
    }
}
//src/Xxx/YyyBundle/Entity/ParkingPlacePriority.php
namespace Xxx\YyyBundle\Entity;

use Xxx\YyyBundle\RatpGarageL1Bundle;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * Xxx\YyyBundle\Entity\ParkingPlacePriority
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\ParkingPlacePriorityRepository")
 */
class ParkingPlacePriority
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace
     *
     * @ORM\ManyToOne(targetEntity="ParkingPlace")
     * @ORM\JoinColumn(name="parkingplace_id", referencedColumnName="id")
     */
    private $parkingPlace;

    /**
     * @var Xxx\YyyBundle\Entity\History $history
     *
     * @ORM\ManyToOne(targetEntity="History", cascade={"persist"})
     * @ORM\JoinColumn(name="history_id", referencedColumnName="id")
     */
    private $history;

    /**
     * @var integer $priorityIn
     *
     * @ORM\Column(name="priorityIn", type="integer")
     * @Assert\NotBlank(message="La priorité de garage n'as pas été donné")
     * @Assert\Min(
     *      limit="1",
     *      message="La priorité de garage ne peux être inférieure à 1",
     *      invalidMessage="La priorité doit être un chiffre"
     * )
     */
    private $priorityIn;

    /**
     * @var integer $priorityOut
     *
     * @ORM\Column(name="priorityOut", type="integer")
     * @Assert\NotBlank(message="La priorité de dégarage n'as pas été donné")
     * @Assert\Min(
     *      limit="1",
     *      message="La priorité de dégarage ne peux être inférieure à 1",
     *      invalidMessage="La priorité doit être un chiffre"
     * )
     */
    private $priorityOut;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set priorityIn
     *
     * @param integer $priorityIn
     */
    public function setPriorityIn($priorityIn)
    {
        $this->priorityIn = $priorityIn;
    }

    /**
     * Get priorityIn
     *
     * @return integer 
     */
    public function getPriorityIn()
    {
        return $this->priorityIn;
    }

    /**
     * Set priorityOut
     *
     * @param integer $priorityOut
     */
    public function setPriorityOut($priorityOut)
    {
        $this->priorityOut = $priorityOut;
    }

    /**
     * Get priorityOut
     *
     * @return integer 
     */
    public function getPriorityOut()
    {
        return $this->priorityOut;
    }

    /**
     * Set parkingPlace
     *
     * @param Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace
     */
    public function setParkingPlace(\Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace)
    {
        $this->parkingPlace = $parkingPlace;
    }

    /**
     * Get parkingPlace
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlace 
     */
    public function getParkingPlace()
    {
        return $this->parkingPlace;
    }

    /**
     * Set history
     *
     * @param Xxx\YyyBundle\Entity\History $history
     */
    public function setHistory(\Xxx\YyyBundle\Entity\History $history)
    {
        $this->history = $history;
    }

    /**
     * Get history
     *
     * @return Xxx\YyyBundle\Entity\History 
     */
    public function getHistory()
    {
        return $this->history;
    }
}
停车场实体

//src/Xxx/YyyBundle/Entity/History.php
namespace Xxx\YyyBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * Xxx\YyyBundle\Entity\History
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\HistoryRepository")
 * @UniqueEntity(
 *      fields="name",
 *      message="Il existe déjà une table ayant ce nom."
 * )
 */
class History
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255, unique=true)
     * @Assert\NotBlank(message="Le nom de la table a été oublié")
     */
    private $name;

    /**
     * @var datetime $date
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var Xxx\ZzzBundle\Entity\User $agent
     *
     * @ORM\ManyToOne(targetEntity="Ratp\AgentBundle\Entity\User")
     * @ORM\JoinColumn(name="agent_id", referencedColumnName="id")
     */
    private $agent;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingPlacePriority $agent
     *
     * @ORM\OneToMany(targetEntity="ParkingPlacePriority", mappedBy="history", cascade={"persist"})
     * @Assert\Valid(traverse=true)
     */
    private $parkingPlacesPriorities;


    /**
     * Constructeur
     *
     * @return string 
     */
    public function __construct()
    {
        $this->parkingPlacesPriorities = new ArrayCollection();
    }

    /**
     * Get History's name
     *
     * @return string 
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set date
     *
     * @param datetime $date
     */
    public function setDate($date)
    {
        $this->date = $date;
    }

    /**
     * Get date
     *
     * @return datetime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set agent
     *
     * @param Xxx\ZzzBundle\Entity\User $agent
     */
    public function setAgent(\Xxx\ZzzBundle\Entity\User $agent)
    {
        $this->agent = $agent;
    }

    /**
     * Get agent
     *
     * @return Xxx\ZzzBundle\Entity\User 
     */
    public function getAgent()
    {
        return $this->agent;
    }

    /**
     * Set parkingPlacesPriorities
     *
     * @param Xxx\YyyBundle\Entity\ParkingPlacePriority $agent
     */
    public function setParkingPlacesPriorities(ArrayCollection $parkingPlacesPriorities)
    {
        $this->parkingPlacesPriorities = $parkingPlacesPriorities;

        foreach($parkingPlacesPriorities as $parkingPlacePriority)
        {
            $parkingPlacePriority->setHistory($this);
        }
    }

    /**
     * Get parkingPlacesPriorities
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlacePriority 
     */
    public function addParkingPlacesPriorities(\Xxx\YyyBundle\Entity\ParkingPlacePriority $parkingPlacesPriorities)
    {
        return $this->parkingPlacesPriorities[] = $parkingPlacesPriorities;

        foreach($parkingPlacesPriorities as $parkingPlacePriority)
        {
            $parkingPlacePriority->setHistory($this);
        }
    }

    /**
     * Get parkingPlacesPriorities
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlacePriority 
     */
    public function getParkingPlacesPriorities()
    {
        return $this->parkingPlacesPriorities;
    }
}
//src/Xxx/YyyBundle/Entity/ParkingPlace.php
namespace Xxx\YyyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Xxx\YyyBundle\Entity\ParkingPlace
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\ParkingPlaceRepository")
 */
class ParkingPlace
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $orderSequence
     *
     * @ORM\Column(name="orderSequence", type="integer")
     * @Assert\Min(
     *      limit="1",
     *      message="L'ordre d'affichage ne peux être inférieure à 1",
     *      invalidMessage="L'ordre d'affichage doit être un chiffre"
     * )
     */
    private $orderSequence;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\MinLength(
     *      limit=1,
     *      message="Le nom SAET doit comporter au minimum 1 caractère"
     * )
     * @Assert\MaxLength(
     *      limit=255,
     *      message="Le nom SAET doit comporter au maximum 255 caractères"
     * )
     * @Assert\Regex(
     *      pattern="/^[a-z0-9-]+$/i",
     *      message="Le nom d'exploitation contient des caractères invalides (seul les caractères alphanumériques et le tiret '-' sont acceptés)"
     * )
     */
    private $name;

    /**
     * @var string $saetName
     *
     * @ORM\Column(name="saetName", type="string", length=255, unique=true)
     * @Assert\MinLength(
     *      limit=5,
     *      message="Le nom SAET doit comporter au minimum 5 caractères"
     * )
     * @Assert\MaxLength(
     *      limit=255,
     *      message="Le nom SAET doit comporter au maximum 255 caractères"
     * )
     * @Assert\Regex(
     *      pattern="/^prk_/i",
     *      message="Le nom SAET ne commence pas par 'PRK_'"
     * )
     * @Assert\Regex(
     *      pattern="/^[a-z0-9_]+$/i",
     *      message="Le nom SAET  contient des caractères invalides (seul les caractères alphanumériques et le trait de soulignemet '_' sont acceptés)"
     * )
     */
    private $saetName;

    /**
     * @var string $rail
     *
     * @ORM\Column(name="rail", type="string", length=5)
     * @Assert\NotBlank()
     * @Assert\MinLength(
     *      limit=1,
     *      message="Le nom SAET doit comporter au minimum 1 caractères"
     * )
     * @Assert\MaxLength(
     *      limit=5,
     *      message="Le nom SAET doit comporter au maximum 5 caractères"
     * )
     */
    private $rail;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingZone $parkingZone
     *
     * @ORM\ManyToOne(targetEntity="ParkingZone")
     * @ORM\JoinColumn(name="parkingzone_id", referencedColumnName="id")
     */
    private $parkingZone;


    /**
     * Get ParkingPlace's name
     *
     * @return string 
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set orderSequence
     *
     * @param integer $orderSequence
     */
    public function setOrderSequence($orderSequence)
    {
        $this->orderSequence = $orderSequence;
    }

    /**
     * Get orderSequence
     *
     * @return integer 
     */
    public function getOrderSequence()
    {
        return $this->orderSequence;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = strtoupper($name);
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set saetName
     *
     * @param string $saetName
     */
    public function setSaetName($saetName)
    {
        $this->saetName = strtoupper($saetName);
    }

    /**
     * Get saetName
     *
     * @return string 
     */
    public function getSaetName()
    {
        return $this->saetName;
    }

    /**
     * Set rail
     *
     * @param string $rail
     */
    public function setRail($rail)
    {
        $this->rail = strtoupper($rail);
    }

    /**
     * Get rail
     *
     * @return string 
     */
    public function getRail()
    {
        return $this->rail;
    }

    /**
     * Set parkingZone
     *
     * @param Xxx\YyyBundle\Entity\ParkingZone $parkingZone
     */
    public function setParkingZone(\Xxx\YyyBundle\Entity\ParkingZone $parkingZone)
    {
        $this->parkingZone = $parkingZone;
    }

    /**
     * Get parkingZone
     *
     * @return Xxx\YyyBundle\Entity\ParkingZone 
     */
    public function getParkingZone()
    {
        return $this->parkingZone;
    }
}
//src/Xxx/YyyBundle/Entity/ParkingPlacePriority.php
namespace Xxx\YyyBundle\Entity;

use Xxx\YyyBundle\RatpGarageL1Bundle;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * Xxx\YyyBundle\Entity\ParkingPlacePriority
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\ParkingPlacePriorityRepository")
 */
class ParkingPlacePriority
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace
     *
     * @ORM\ManyToOne(targetEntity="ParkingPlace")
     * @ORM\JoinColumn(name="parkingplace_id", referencedColumnName="id")
     */
    private $parkingPlace;

    /**
     * @var Xxx\YyyBundle\Entity\History $history
     *
     * @ORM\ManyToOne(targetEntity="History", cascade={"persist"})
     * @ORM\JoinColumn(name="history_id", referencedColumnName="id")
     */
    private $history;

    /**
     * @var integer $priorityIn
     *
     * @ORM\Column(name="priorityIn", type="integer")
     * @Assert\NotBlank(message="La priorité de garage n'as pas été donné")
     * @Assert\Min(
     *      limit="1",
     *      message="La priorité de garage ne peux être inférieure à 1",
     *      invalidMessage="La priorité doit être un chiffre"
     * )
     */
    private $priorityIn;

    /**
     * @var integer $priorityOut
     *
     * @ORM\Column(name="priorityOut", type="integer")
     * @Assert\NotBlank(message="La priorité de dégarage n'as pas été donné")
     * @Assert\Min(
     *      limit="1",
     *      message="La priorité de dégarage ne peux être inférieure à 1",
     *      invalidMessage="La priorité doit être un chiffre"
     * )
     */
    private $priorityOut;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set priorityIn
     *
     * @param integer $priorityIn
     */
    public function setPriorityIn($priorityIn)
    {
        $this->priorityIn = $priorityIn;
    }

    /**
     * Get priorityIn
     *
     * @return integer 
     */
    public function getPriorityIn()
    {
        return $this->priorityIn;
    }

    /**
     * Set priorityOut
     *
     * @param integer $priorityOut
     */
    public function setPriorityOut($priorityOut)
    {
        $this->priorityOut = $priorityOut;
    }

    /**
     * Get priorityOut
     *
     * @return integer 
     */
    public function getPriorityOut()
    {
        return $this->priorityOut;
    }

    /**
     * Set parkingPlace
     *
     * @param Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace
     */
    public function setParkingPlace(\Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace)
    {
        $this->parkingPlace = $parkingPlace;
    }

    /**
     * Get parkingPlace
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlace 
     */
    public function getParkingPlace()
    {
        return $this->parkingPlace;
    }

    /**
     * Set history
     *
     * @param Xxx\YyyBundle\Entity\History $history
     */
    public function setHistory(\Xxx\YyyBundle\Entity\History $history)
    {
        $this->history = $history;
    }

    /**
     * Get history
     *
     * @return Xxx\YyyBundle\Entity\History 
     */
    public function getHistory()
    {
        return $this->history;
    }
}
停车场优先实体

//src/Xxx/YyyBundle/Entity/History.php
namespace Xxx\YyyBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * Xxx\YyyBundle\Entity\History
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\HistoryRepository")
 * @UniqueEntity(
 *      fields="name",
 *      message="Il existe déjà une table ayant ce nom."
 * )
 */
class History
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255, unique=true)
     * @Assert\NotBlank(message="Le nom de la table a été oublié")
     */
    private $name;

    /**
     * @var datetime $date
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
     * @var Xxx\ZzzBundle\Entity\User $agent
     *
     * @ORM\ManyToOne(targetEntity="Ratp\AgentBundle\Entity\User")
     * @ORM\JoinColumn(name="agent_id", referencedColumnName="id")
     */
    private $agent;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingPlacePriority $agent
     *
     * @ORM\OneToMany(targetEntity="ParkingPlacePriority", mappedBy="history", cascade={"persist"})
     * @Assert\Valid(traverse=true)
     */
    private $parkingPlacesPriorities;


    /**
     * Constructeur
     *
     * @return string 
     */
    public function __construct()
    {
        $this->parkingPlacesPriorities = new ArrayCollection();
    }

    /**
     * Get History's name
     *
     * @return string 
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set date
     *
     * @param datetime $date
     */
    public function setDate($date)
    {
        $this->date = $date;
    }

    /**
     * Get date
     *
     * @return datetime 
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * Set agent
     *
     * @param Xxx\ZzzBundle\Entity\User $agent
     */
    public function setAgent(\Xxx\ZzzBundle\Entity\User $agent)
    {
        $this->agent = $agent;
    }

    /**
     * Get agent
     *
     * @return Xxx\ZzzBundle\Entity\User 
     */
    public function getAgent()
    {
        return $this->agent;
    }

    /**
     * Set parkingPlacesPriorities
     *
     * @param Xxx\YyyBundle\Entity\ParkingPlacePriority $agent
     */
    public function setParkingPlacesPriorities(ArrayCollection $parkingPlacesPriorities)
    {
        $this->parkingPlacesPriorities = $parkingPlacesPriorities;

        foreach($parkingPlacesPriorities as $parkingPlacePriority)
        {
            $parkingPlacePriority->setHistory($this);
        }
    }

    /**
     * Get parkingPlacesPriorities
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlacePriority 
     */
    public function addParkingPlacesPriorities(\Xxx\YyyBundle\Entity\ParkingPlacePriority $parkingPlacesPriorities)
    {
        return $this->parkingPlacesPriorities[] = $parkingPlacesPriorities;

        foreach($parkingPlacesPriorities as $parkingPlacePriority)
        {
            $parkingPlacePriority->setHistory($this);
        }
    }

    /**
     * Get parkingPlacesPriorities
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlacePriority 
     */
    public function getParkingPlacesPriorities()
    {
        return $this->parkingPlacesPriorities;
    }
}
//src/Xxx/YyyBundle/Entity/ParkingPlace.php
namespace Xxx\YyyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Xxx\YyyBundle\Entity\ParkingPlace
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\ParkingPlaceRepository")
 */
class ParkingPlace
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $orderSequence
     *
     * @ORM\Column(name="orderSequence", type="integer")
     * @Assert\Min(
     *      limit="1",
     *      message="L'ordre d'affichage ne peux être inférieure à 1",
     *      invalidMessage="L'ordre d'affichage doit être un chiffre"
     * )
     */
    private $orderSequence;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\MinLength(
     *      limit=1,
     *      message="Le nom SAET doit comporter au minimum 1 caractère"
     * )
     * @Assert\MaxLength(
     *      limit=255,
     *      message="Le nom SAET doit comporter au maximum 255 caractères"
     * )
     * @Assert\Regex(
     *      pattern="/^[a-z0-9-]+$/i",
     *      message="Le nom d'exploitation contient des caractères invalides (seul les caractères alphanumériques et le tiret '-' sont acceptés)"
     * )
     */
    private $name;

    /**
     * @var string $saetName
     *
     * @ORM\Column(name="saetName", type="string", length=255, unique=true)
     * @Assert\MinLength(
     *      limit=5,
     *      message="Le nom SAET doit comporter au minimum 5 caractères"
     * )
     * @Assert\MaxLength(
     *      limit=255,
     *      message="Le nom SAET doit comporter au maximum 255 caractères"
     * )
     * @Assert\Regex(
     *      pattern="/^prk_/i",
     *      message="Le nom SAET ne commence pas par 'PRK_'"
     * )
     * @Assert\Regex(
     *      pattern="/^[a-z0-9_]+$/i",
     *      message="Le nom SAET  contient des caractères invalides (seul les caractères alphanumériques et le trait de soulignemet '_' sont acceptés)"
     * )
     */
    private $saetName;

    /**
     * @var string $rail
     *
     * @ORM\Column(name="rail", type="string", length=5)
     * @Assert\NotBlank()
     * @Assert\MinLength(
     *      limit=1,
     *      message="Le nom SAET doit comporter au minimum 1 caractères"
     * )
     * @Assert\MaxLength(
     *      limit=5,
     *      message="Le nom SAET doit comporter au maximum 5 caractères"
     * )
     */
    private $rail;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingZone $parkingZone
     *
     * @ORM\ManyToOne(targetEntity="ParkingZone")
     * @ORM\JoinColumn(name="parkingzone_id", referencedColumnName="id")
     */
    private $parkingZone;


    /**
     * Get ParkingPlace's name
     *
     * @return string 
     */
    public function __toString()
    {
        return $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set orderSequence
     *
     * @param integer $orderSequence
     */
    public function setOrderSequence($orderSequence)
    {
        $this->orderSequence = $orderSequence;
    }

    /**
     * Get orderSequence
     *
     * @return integer 
     */
    public function getOrderSequence()
    {
        return $this->orderSequence;
    }

    /**
     * Set name
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = strtoupper($name);
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set saetName
     *
     * @param string $saetName
     */
    public function setSaetName($saetName)
    {
        $this->saetName = strtoupper($saetName);
    }

    /**
     * Get saetName
     *
     * @return string 
     */
    public function getSaetName()
    {
        return $this->saetName;
    }

    /**
     * Set rail
     *
     * @param string $rail
     */
    public function setRail($rail)
    {
        $this->rail = strtoupper($rail);
    }

    /**
     * Get rail
     *
     * @return string 
     */
    public function getRail()
    {
        return $this->rail;
    }

    /**
     * Set parkingZone
     *
     * @param Xxx\YyyBundle\Entity\ParkingZone $parkingZone
     */
    public function setParkingZone(\Xxx\YyyBundle\Entity\ParkingZone $parkingZone)
    {
        $this->parkingZone = $parkingZone;
    }

    /**
     * Get parkingZone
     *
     * @return Xxx\YyyBundle\Entity\ParkingZone 
     */
    public function getParkingZone()
    {
        return $this->parkingZone;
    }
}
//src/Xxx/YyyBundle/Entity/ParkingPlacePriority.php
namespace Xxx\YyyBundle\Entity;

use Xxx\YyyBundle\RatpGarageL1Bundle;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * Xxx\YyyBundle\Entity\ParkingPlacePriority
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Xxx\YyyBundle\Entity\ParkingPlacePriorityRepository")
 */
class ParkingPlacePriority
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace
     *
     * @ORM\ManyToOne(targetEntity="ParkingPlace")
     * @ORM\JoinColumn(name="parkingplace_id", referencedColumnName="id")
     */
    private $parkingPlace;

    /**
     * @var Xxx\YyyBundle\Entity\History $history
     *
     * @ORM\ManyToOne(targetEntity="History", cascade={"persist"})
     * @ORM\JoinColumn(name="history_id", referencedColumnName="id")
     */
    private $history;

    /**
     * @var integer $priorityIn
     *
     * @ORM\Column(name="priorityIn", type="integer")
     * @Assert\NotBlank(message="La priorité de garage n'as pas été donné")
     * @Assert\Min(
     *      limit="1",
     *      message="La priorité de garage ne peux être inférieure à 1",
     *      invalidMessage="La priorité doit être un chiffre"
     * )
     */
    private $priorityIn;

    /**
     * @var integer $priorityOut
     *
     * @ORM\Column(name="priorityOut", type="integer")
     * @Assert\NotBlank(message="La priorité de dégarage n'as pas été donné")
     * @Assert\Min(
     *      limit="1",
     *      message="La priorité de dégarage ne peux être inférieure à 1",
     *      invalidMessage="La priorité doit être un chiffre"
     * )
     */
    private $priorityOut;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set priorityIn
     *
     * @param integer $priorityIn
     */
    public function setPriorityIn($priorityIn)
    {
        $this->priorityIn = $priorityIn;
    }

    /**
     * Get priorityIn
     *
     * @return integer 
     */
    public function getPriorityIn()
    {
        return $this->priorityIn;
    }

    /**
     * Set priorityOut
     *
     * @param integer $priorityOut
     */
    public function setPriorityOut($priorityOut)
    {
        $this->priorityOut = $priorityOut;
    }

    /**
     * Get priorityOut
     *
     * @return integer 
     */
    public function getPriorityOut()
    {
        return $this->priorityOut;
    }

    /**
     * Set parkingPlace
     *
     * @param Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace
     */
    public function setParkingPlace(\Xxx\YyyBundle\Entity\ParkingPlace $parkingPlace)
    {
        $this->parkingPlace = $parkingPlace;
    }

    /**
     * Get parkingPlace
     *
     * @return Xxx\YyyBundle\Entity\ParkingPlace 
     */
    public function getParkingPlace()
    {
        return $this->parkingPlace;
    }

    /**
     * Set history
     *
     * @param Xxx\YyyBundle\Entity\History $history
     */
    public function setHistory(\Xxx\YyyBundle\Entity\History $history)
    {
        $this->history = $history;
    }

    /**
     * Get history
     *
     * @return Xxx\YyyBundle\Entity\History 
     */
    public function getHistory()
    {
        return $this->history;
    }
}
历史控制器

//src/Xxx/YyyBundle/Controller/HistoryController.php
namespace Xxx\YyyBundle\Controller;

use Xxx\YyyBundle\Entity\ParkingPlacePriority;
use Xxx\YyyBundle\Entity\ParkingPlace;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Xxx\YyyBundle\Entity\History;
use Xxx\YyyBundle\Form\HistoryType;

/**
 * History controller.
 *
 * @Route("")
 */
class HistoryController extends Controller
{
    /**
     * Lists all History entities.
     *
     * @Route("/", name="history")
     * @Template()
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entities = $em->getRepository('XxxYyyBundle:History')->findAll();

        return array('entities' => $entities);
    }

    /**
     * Displays a form to create a new History entity.
     *
     * @Route("/new", name="history_new")
     * @Template()
     */
    public function newAction()
    {
        $em = $this->getDoctrine()->getEntityManager();
        $entities = $em->getRepository('XxxYyyBundle:ParkingPlace')->findAllOrdered();
        $parkingZones = $em->getRepository('XxxYyyBundle:ParkingZone')->findAllOrdered();

        $history = new History();
        foreach ($entities as $entity)
        {
            $parkingPlacePriority = new ParkingPlacePriority();
            $parkingPlacePriority->setParkingPlace($entity);
            $history->addParkingPlacesPriorities($parkingPlacePriority);
        }
        $form   = $this->createForm(new HistoryType(), $history);

        return array(
            'entity' => $history,
            'parkingPlaces' => $entities,
            'parkingZones' => $parkingZones,
            'form'   => $form->createView()
        );
    }

    /**
     * Creates a new History entity.
     *
     * @Route("/create", name="history_create")
     * @Method("post")
     * @Template("XxxYyyBundle:History:new.html.twig")
     */
    public function createAction()
    {
        $em = $this->getDoctrine()->getEntityManager();
        $entities = $em->getRepository('XxxYyyBundle:ParkingPlace')->findAllOrdered();
        $parkingZones = $em->getRepository('XxxYyyBundle:ParkingZone')->findAllOrdered();

        $history  = new History();
        foreach ($entities as $entity)
        {
            $parkingPlacePriority = new ParkingPlacePriority();
            $parkingPlacePriority->setParkingPlace($entity);
            $history->addParkingPlacesPriorities($parkingPlacePriority);
        }
        $history->setDate(new \DateTime());
        $history->setAgent($this->container->get('security.context')->getToken()->getUser());

        $request = $this->getRequest();
        $form   = $this->createForm(new HistoryType(), $history);
        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($history);
            $em->flush();

            return $this->redirect($this->generateUrl('parkingplacepriority_export', array('id' => $history->getId())));

        }

        return array(
            'entity' => $history,
            'parkingPlaces' => $entities,
            'parkingZones' => $parkingZones,
            'form'   => $form->createView()
        );
    }

    /**
     * Displays a form to edit an existing History entity.
     *
     * @Route("/{id}/edit", name="history_edit")
     * @Template("XxxYyyBundle:History:new.html.twig")
     */
    public function editAction($id)
    {
        $em = $this->getDoctrine()->getEntityManager();
        $parkingPlaces = $em->getRepository('XxxYyyBundle:ParkingPlace')->findAllOrdered();
        $parkingZones = $em->getRepository('XxxYyyBundle:ParkingZone')->findAllOrdered();

        $entity = $em->getRepository('XxxYyyBundle:History')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find History entity.');
        }

        $entity->setName('');
        $editForm = $this->createForm(new HistoryType(), $entity);

        return array(
            'entity'      => $entity,
            'parkingPlaces' => $parkingPlaces,
            'parkingZones' => $parkingZones,
            'form'        => $editForm->createView(),
        );
    }

    /**
     * Edits an existing History entity.
     *
     * @Route("/{id}/update", name="history_update")
     * @Method("post")
     * @Template("XxxYyyBundle:History:new.html.twig")
     */
    public function updateAction($id)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('XxxYyyBundle:History')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find History entity.');
        }

        $editForm   = $this->createForm(new HistoryType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        $request = $this->getRequest();

        $editForm->bindRequest($request);

        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('parkingplacepriority_export', array('id' => $id)));
        }

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
        );
    }
}
历史表单类型

//src/Xxx/YyyBundle/Form/HistoryType.php
namespace Xxx\YyyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class HistoryType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name', 'text', array(
                    'max_length' => 255,
                    'trim' => true,
                    )
                )
            ->add('parkingPlacesPriorities', 'collection', array(
                    'type' => new ParkingPlacePriorityType(),
                    'by_reference' => false,
                    )
                )
        ;
    }

    public function getName()
    {
        return 'xxx_yyybundle_historytype';
    }
}
//src/Xxx/YyyBundle/Form/ParkingPlacePriorityType.php
namespace Xxx\YyyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ParkingPlacePriorityType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('priorityIn', 'number', array(
                    'precision' => 0,
                    )
                )
            ->add('priorityOut', 'number', array(
                    'precision' => 0,
                    )
                )
            ->add('parkingPlace', 'entity', array(
                    'class' => 'RatpGarageL1Bundle:ParkingPlace',
                    'read_only' => true,
                    )
                )
        ;
    }

    public function getName()
    {
        return 'xxx_yyybundle_parkingplaceprioritytype';
    }
}
// src/Xxx/YyyBundle/Resources/views/History/new.html.twig
{% extends '::base.html.twig' %}

{% block title %}
    {{ parent() }} | Historique | Nouvelle table
{%  endblock %}

{% block zoneMenu %}
    <li class="">
        <a href="" id="save">Enregistrer</a>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            Zone de garage
            <b class="caret"></b>
        </a>
        <ul class="dropdown-menu">
        {% for parkingZone in parkingZones %}
            <li class="">
                <a href="#{{ parkingZone.id }}">{{ parkingZone.name }}</a>
            </li>
        {% endfor %}
        </ul>
    </li>
{% endblock %}

{% block content %}

<h1>Nouvelle table de garage/dégarage</h1>

<form action="{{ path('history_create') }}" method="post" {{ form_enctype(form) }} class="form-horizontal">
    <div class="row-fluid">
    <div class="control-group offset7 {% if form_errors(form.name) | length > 0 %}error{% endif %}">
        {{ form_label(form.name, 'Nom de la table', { 'attr': {'class': 'control-label'} } ) }}
        <div class="controls error">
            {{ form_widget(form.name, { 'attr': {'class': ''} } ) }}
            <span class="help-inline">{{ form_errors(form.name) }}</span>
        </div>
    </div>
    </div>
    {% set voie = '0' %}
    {% set zone = '0' %}
    {% set i = 0 %}
    {% for pkPl in form.parkingPlacesPriorities %}
        {% if voie != parkingPlaces[i].rail %}
            {% if voie != '0' %}
        </fieldset>
            {% endif %}
            {% if zone != parkingPlaces[i].parkingZone %}
                {% if zone != '0' %}
    </div>
                {% endif %}
    <div id="{{ parkingPlaces[i].parkingZone.id }}" class="zone row-fluid">
        <h3 class="">{{ parkingPlaces[i].parkingZone.name }}</h3>
        <div class="synoptique">
            <span>{{ asset('bundles/xxxyyy/images/' ~ parkingPlaces[i].parkingZone.image) }}</span>
        </div>
            {% endif %}
            {% set zone = parkingPlaces[i].parkingZone %}
        <fieldset class="voie">
            {% set voie = parkingPlaces[i].rail %}
            <legend class=""><strong>Voie {{ parkingPlaces[i].rail }}</strong></legend>
        {% endif %}
            <fieldset name="{{ parkingPlaces[i].name }}" class="place_garage span5">
                <legend>{{ parkingPlaces[i].name }}</legend>
                <div class="control-group  {% if form_errors(pkPl.priorityIn) | length > 0 %}error{% endif %}">
                    {{ form_label(pkPl.priorityIn, 'Garage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls error">
                        {{ form_widget(pkPl.priorityIn, { 'attr': {'class': 'garage'} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.priorityIn) }}</span>
                    </div>
                </div>
                <div class="control-group  {% if form_errors(pkPl.priorityOut) | length > 0 %}error{% endif %}">
                    {{ form_label(pkPl.priorityOut, 'Dégarage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls">
                        {{ form_widget(pkPl.priorityOut, { 'attr': {'class': 'degarage'} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.priorityOut) }}</span>
                    </div>
                </div>
                <div class="control-group">
                    {{ form_label(pkPl.parkingPlace, 'Place de garage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls error">
                        {{ form_widget(pkPl.parkingPlace, { 'attr': {'class': ''} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.parkingPlace) }}</span>
                    </div>
                </div>
            </fieldset>
        {% set i = i + 1 %}
    {% endfor %}
        </fieldset>
    </div>
    {{ form_rest(form) }}
    <div class="form-actions">
        <button type="submit" class="btn btn-primary">Enregistrer</button>
        <a href="{{ path('history') }}" class="btn">Annuler</a>
    </div>
</form>

{% endblock %}

{% block javascript %}
        <script src="{{ asset('bundles/xxxyyy/js/script.js') }}"></script>
{% endblock %}
停车场优先表单类型

//src/Xxx/YyyBundle/Form/HistoryType.php
namespace Xxx\YyyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class HistoryType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name', 'text', array(
                    'max_length' => 255,
                    'trim' => true,
                    )
                )
            ->add('parkingPlacesPriorities', 'collection', array(
                    'type' => new ParkingPlacePriorityType(),
                    'by_reference' => false,
                    )
                )
        ;
    }

    public function getName()
    {
        return 'xxx_yyybundle_historytype';
    }
}
//src/Xxx/YyyBundle/Form/ParkingPlacePriorityType.php
namespace Xxx\YyyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ParkingPlacePriorityType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('priorityIn', 'number', array(
                    'precision' => 0,
                    )
                )
            ->add('priorityOut', 'number', array(
                    'precision' => 0,
                    )
                )
            ->add('parkingPlace', 'entity', array(
                    'class' => 'RatpGarageL1Bundle:ParkingPlace',
                    'read_only' => true,
                    )
                )
        ;
    }

    public function getName()
    {
        return 'xxx_yyybundle_parkingplaceprioritytype';
    }
}
// src/Xxx/YyyBundle/Resources/views/History/new.html.twig
{% extends '::base.html.twig' %}

{% block title %}
    {{ parent() }} | Historique | Nouvelle table
{%  endblock %}

{% block zoneMenu %}
    <li class="">
        <a href="" id="save">Enregistrer</a>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            Zone de garage
            <b class="caret"></b>
        </a>
        <ul class="dropdown-menu">
        {% for parkingZone in parkingZones %}
            <li class="">
                <a href="#{{ parkingZone.id }}">{{ parkingZone.name }}</a>
            </li>
        {% endfor %}
        </ul>
    </li>
{% endblock %}

{% block content %}

<h1>Nouvelle table de garage/dégarage</h1>

<form action="{{ path('history_create') }}" method="post" {{ form_enctype(form) }} class="form-horizontal">
    <div class="row-fluid">
    <div class="control-group offset7 {% if form_errors(form.name) | length > 0 %}error{% endif %}">
        {{ form_label(form.name, 'Nom de la table', { 'attr': {'class': 'control-label'} } ) }}
        <div class="controls error">
            {{ form_widget(form.name, { 'attr': {'class': ''} } ) }}
            <span class="help-inline">{{ form_errors(form.name) }}</span>
        </div>
    </div>
    </div>
    {% set voie = '0' %}
    {% set zone = '0' %}
    {% set i = 0 %}
    {% for pkPl in form.parkingPlacesPriorities %}
        {% if voie != parkingPlaces[i].rail %}
            {% if voie != '0' %}
        </fieldset>
            {% endif %}
            {% if zone != parkingPlaces[i].parkingZone %}
                {% if zone != '0' %}
    </div>
                {% endif %}
    <div id="{{ parkingPlaces[i].parkingZone.id }}" class="zone row-fluid">
        <h3 class="">{{ parkingPlaces[i].parkingZone.name }}</h3>
        <div class="synoptique">
            <span>{{ asset('bundles/xxxyyy/images/' ~ parkingPlaces[i].parkingZone.image) }}</span>
        </div>
            {% endif %}
            {% set zone = parkingPlaces[i].parkingZone %}
        <fieldset class="voie">
            {% set voie = parkingPlaces[i].rail %}
            <legend class=""><strong>Voie {{ parkingPlaces[i].rail }}</strong></legend>
        {% endif %}
            <fieldset name="{{ parkingPlaces[i].name }}" class="place_garage span5">
                <legend>{{ parkingPlaces[i].name }}</legend>
                <div class="control-group  {% if form_errors(pkPl.priorityIn) | length > 0 %}error{% endif %}">
                    {{ form_label(pkPl.priorityIn, 'Garage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls error">
                        {{ form_widget(pkPl.priorityIn, { 'attr': {'class': 'garage'} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.priorityIn) }}</span>
                    </div>
                </div>
                <div class="control-group  {% if form_errors(pkPl.priorityOut) | length > 0 %}error{% endif %}">
                    {{ form_label(pkPl.priorityOut, 'Dégarage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls">
                        {{ form_widget(pkPl.priorityOut, { 'attr': {'class': 'degarage'} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.priorityOut) }}</span>
                    </div>
                </div>
                <div class="control-group">
                    {{ form_label(pkPl.parkingPlace, 'Place de garage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls error">
                        {{ form_widget(pkPl.parkingPlace, { 'attr': {'class': ''} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.parkingPlace) }}</span>
                    </div>
                </div>
            </fieldset>
        {% set i = i + 1 %}
    {% endfor %}
        </fieldset>
    </div>
    {{ form_rest(form) }}
    <div class="form-actions">
        <button type="submit" class="btn btn-primary">Enregistrer</button>
        <a href="{{ path('history') }}" class="btn">Annuler</a>
    </div>
</form>

{% endblock %}

{% block javascript %}
        <script src="{{ asset('bundles/xxxyyy/js/script.js') }}"></script>
{% endblock %}
历史记录新实体表单模板

//src/Xxx/YyyBundle/Form/HistoryType.php
namespace Xxx\YyyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class HistoryType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name', 'text', array(
                    'max_length' => 255,
                    'trim' => true,
                    )
                )
            ->add('parkingPlacesPriorities', 'collection', array(
                    'type' => new ParkingPlacePriorityType(),
                    'by_reference' => false,
                    )
                )
        ;
    }

    public function getName()
    {
        return 'xxx_yyybundle_historytype';
    }
}
//src/Xxx/YyyBundle/Form/ParkingPlacePriorityType.php
namespace Xxx\YyyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ParkingPlacePriorityType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('priorityIn', 'number', array(
                    'precision' => 0,
                    )
                )
            ->add('priorityOut', 'number', array(
                    'precision' => 0,
                    )
                )
            ->add('parkingPlace', 'entity', array(
                    'class' => 'RatpGarageL1Bundle:ParkingPlace',
                    'read_only' => true,
                    )
                )
        ;
    }

    public function getName()
    {
        return 'xxx_yyybundle_parkingplaceprioritytype';
    }
}
// src/Xxx/YyyBundle/Resources/views/History/new.html.twig
{% extends '::base.html.twig' %}

{% block title %}
    {{ parent() }} | Historique | Nouvelle table
{%  endblock %}

{% block zoneMenu %}
    <li class="">
        <a href="" id="save">Enregistrer</a>
    </li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            Zone de garage
            <b class="caret"></b>
        </a>
        <ul class="dropdown-menu">
        {% for parkingZone in parkingZones %}
            <li class="">
                <a href="#{{ parkingZone.id }}">{{ parkingZone.name }}</a>
            </li>
        {% endfor %}
        </ul>
    </li>
{% endblock %}

{% block content %}

<h1>Nouvelle table de garage/dégarage</h1>

<form action="{{ path('history_create') }}" method="post" {{ form_enctype(form) }} class="form-horizontal">
    <div class="row-fluid">
    <div class="control-group offset7 {% if form_errors(form.name) | length > 0 %}error{% endif %}">
        {{ form_label(form.name, 'Nom de la table', { 'attr': {'class': 'control-label'} } ) }}
        <div class="controls error">
            {{ form_widget(form.name, { 'attr': {'class': ''} } ) }}
            <span class="help-inline">{{ form_errors(form.name) }}</span>
        </div>
    </div>
    </div>
    {% set voie = '0' %}
    {% set zone = '0' %}
    {% set i = 0 %}
    {% for pkPl in form.parkingPlacesPriorities %}
        {% if voie != parkingPlaces[i].rail %}
            {% if voie != '0' %}
        </fieldset>
            {% endif %}
            {% if zone != parkingPlaces[i].parkingZone %}
                {% if zone != '0' %}
    </div>
                {% endif %}
    <div id="{{ parkingPlaces[i].parkingZone.id }}" class="zone row-fluid">
        <h3 class="">{{ parkingPlaces[i].parkingZone.name }}</h3>
        <div class="synoptique">
            <span>{{ asset('bundles/xxxyyy/images/' ~ parkingPlaces[i].parkingZone.image) }}</span>
        </div>
            {% endif %}
            {% set zone = parkingPlaces[i].parkingZone %}
        <fieldset class="voie">
            {% set voie = parkingPlaces[i].rail %}
            <legend class=""><strong>Voie {{ parkingPlaces[i].rail }}</strong></legend>
        {% endif %}
            <fieldset name="{{ parkingPlaces[i].name }}" class="place_garage span5">
                <legend>{{ parkingPlaces[i].name }}</legend>
                <div class="control-group  {% if form_errors(pkPl.priorityIn) | length > 0 %}error{% endif %}">
                    {{ form_label(pkPl.priorityIn, 'Garage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls error">
                        {{ form_widget(pkPl.priorityIn, { 'attr': {'class': 'garage'} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.priorityIn) }}</span>
                    </div>
                </div>
                <div class="control-group  {% if form_errors(pkPl.priorityOut) | length > 0 %}error{% endif %}">
                    {{ form_label(pkPl.priorityOut, 'Dégarage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls">
                        {{ form_widget(pkPl.priorityOut, { 'attr': {'class': 'degarage'} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.priorityOut) }}</span>
                    </div>
                </div>
                <div class="control-group">
                    {{ form_label(pkPl.parkingPlace, 'Place de garage', { 'attr': {'class': 'control-label'} } ) }}
                    <div class="controls error">
                        {{ form_widget(pkPl.parkingPlace, { 'attr': {'class': ''} } ) }}
                        <span class="help-inline">{{ form_errors(pkPl.parkingPlace) }}</span>
                    </div>
                </div>
            </fieldset>
        {% set i = i + 1 %}
    {% endfor %}
        </fieldset>
    </div>
    {{ form_rest(form) }}
    <div class="form-actions">
        <button type="submit" class="btn btn-primary">Enregistrer</button>
        <a href="{{ path('history') }}" class="btn">Annuler</a>
    </div>
</form>

{% endblock %}

{% block javascript %}
        <script src="{{ asset('bundles/xxxyyy/js/script.js') }}"></script>
{% endblock %}
//src/Xxx/YyyBundle/Resources/views/History/new.html.twig
{%extends':base.html.twig%}
{%block title%}
{{parent()}}| Historique | Nouvelle表
{%endblock%}
{%block zonemu%}
    • {parkingZones%中的parkingZone为%1}
    • {%endfor%}
  • {%endblock%} {%block content%} 新车库表/dégarage {form_label(form.name,'Nom de la table',{'attr':{'class':'control label'}}}} {{form_小部件(form.name,{'attr':{'class':''}}}} {{form_errors(form.name)}} {%set voie='0%} {%set区域='0'%} {%set i=0%} {form.parkingPlacesPriorities%} {%if voie!=parkingPlaces[i].rail%} {%if voie!=“0”} {%endif%} {%if zone!=parkingPlaces[i].parkingZone%} {%if区域!=“0”} {%endif%} {{parkingPlaces[i].parkingZone.name} {{asset('bundles/xxxyyy/images/'~parkingPlaces[i].parkingZone.image)} {%endif%} {%set zone=parkingPlaces[i]。parkingZone%} {%set voie=parkingPlaces[i].rail%} Voie{{{parkingPlaces[i].rail} {%endif%} {{parkingPlaces[i].name} {form_label(pkPl.priorityIn,'Garage',{'attr':{'class':'control label'}}}} {{form_小部件(pkPl.priorityIn,{'attr':{'class':'garage'}}}} {{form_errors(pkPl.priorityIn)} {form_标签(pkPl.priorityOut,'Dégarage',{'attr':{'class':'control label'}}}}} {{form_小部件(pkPl.priorityOut,{'attr':{'class':'degarage'}}}}} {{form_errors(pkPl.priorityOut)} {form_标签(pkPl.parkingPlace,'Place de garage',{'attr':{'class':'control label'}}}}} {{form_小部件(pkPl.parkingPlace,{'attr':{'class':''}}}} {{form_errors(pkPl.parkingPlace)} {%set i=i+1%} {%endfor%} {{form_rest(form)} 登记员 {%endblock%} {%block javascript%} {%endblock%}