2016-03-04 57 views
0

我有一個問題,不知道解決它的最佳做法。小枝與額外的列關係

我想爲我的核心數據提供一個表單。核心數據都是可版本化的。 我用一個GUID解決了它,知道版本的一致性。

所以現在我有兩個可版本化的實體AgeClassHighscoreList可以有多對多的關係。該關係也必須是可版本化的,所以我創建了一個ReferenceEntityRefAgeClassHighscoreList。現在我有一個額外的列

起始有效[和]
關係有效至

但現在我不知道我應該怎麼建立自己的狀態。 當我編輯AgeClass時,所有當前(有效)HighscoreList項目應顯示爲複選框。 但是,當我建立編輯表單時,這些值必須與RefAgeClassHighscoreList實體綁定。

我希望你能理解我的問題。

AgeClass:

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\DSV\Core\BaseDSVCoreDataRepository") 
* */ 
class AgeClass extends BaseDSVCoreData 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @NotBlank() 
    * @var int 
    */ 
    protected $minAge; 

    /** 
    * @ORM\Column(type="integer") 
    * @NotBlank() 
    * @var int 
    */ 
    protected $maxAge; 

    /** 
    * @ORM\OneToMany(targetEntity="RefAgeClassHighscoreList", mappedBy="ageClass", cascade={"persist"}) 
    * @var PersistentCollection 
    */ 
    private $ageClassHighscoreLists; 

    /** 
    * AgeClass constructor. 
    */ 
    function __construct() 
    { 
     $this->setGuid(GuidHelper::generateGuid()); 
     $this->setValidFrom(new \DateTime()); 
    } 

    /** 
    * @return int 
    */ 
    public function getMinAge() 
    { 
     return $this->minAge; 
    } 

    /** 
    * @param int $minAge 
    * @return AgeClass 
    */ 
    public function setMinAge($minAge) 
    { 
     $this->minAge = $minAge; 
     return $this; 
    } 

    /** 
    * @return int 
    */ 
    public function getMaxAge() 
    { 
     return $this->maxAge; 
    } 

    /** 
    * @param int $maxAge 
    * @return AgeClass 
    */ 
    public function setMaxAge($maxAge) 
    { 
     $this->maxAge = $maxAge; 
     return $this; 
    } 

    /** 
    * @return array 
    */ 
    public function getAgeClassHighscoreLists() 
    { 
     if($this->ageClassHighscoreLists == null) 
      return array(); 
     return $this->ageClassHighscoreLists->toArray(); 
    } 

    /** 
    * @param PersistentCollection $valuationClasses 
    * @return AgeClass 
    */ 
    public function seAgeClassHighscoreLists($valuationClasses) 
    { 
     $this->ageClassHighscoreLists = $valuationClasses; 
     return $this; 
    } 

    /** 
    * @return HighscoreList[] 
    */ 
    public function getHighscoreLists() 
    { 
     return array_map(
      function ($ageClassHighscoreList) { 
       /** @var RefAgeClassHighscoreList $ageClassHighscoreList */ 
       return $ageClassHighscoreList->getHighscoreList(); 
      }, 
      $this->getAgeClassHighscoreLists() 
     ); 
    } 

    /** 
    * @param RefAgeClassHighscoreList $ageClassHighscoreList 
    * @return $this 
    */ 
    public function addAgeClassHighscoreList($ageClassHighscoreList) 
    { 
     if (!$this->ageClassHighscoreLists->contains($ageClassHighscoreList)) { 
      $this->ageClassHighscoreLists->add($ageClassHighscoreList); 
      $ageClassHighscoreList->setAgeClass($this); 
     } 

     return $this; 
    } 
} 

HighscoreList

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\DSV\Core\BaseDSVCoreDataRepository") 
* */ 
class HighscoreList extends BaseDSVCoreData 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="RefAgeClassHighscoreList", mappedBy="highscoreList", cascade={"persist"}) 
    * @var PersistentCollection 
    */ 
    private $ageClassHighscoreLists; 

    function __construct() 
    { 
     $this->setGuid(GuidHelper::generateGuid()); 
    } 

    /** 
    * @return PersistentCollection 
    */ 
    public function getAgeClassReferences() 
    { 
     return $this->ageClassHighscoreLists; 
    } 

    /** 
    * @param PersistentCollection $valuationClasses 
    * @return AgeClass 
    */ 
    public function setAgeClassReferences($valuationClasses) 
    { 
     $this->ageClassReferences = $valuationClasses; 
     return $this; 
    } 

    /** 
    * @return AgeClass[] 
    */ 
    public function getAgeClasses() 
    { 
     return array_map(
      function ($ageClassHighscoreList) { 
       /** @var RefAgeClassHighscoreList $ageClassHighscoreList */ 
       return $ageClassHighscoreList->getAgeClass(); 
      }, 
      $this->ageClassHighscoreLists->toArray() 
     ); 
    } 

    /** 
    * @param RefAgeClassHighscoreList $ageClassHighscoreList 
    * @return HighscoreList 
    */ 
    public function addAgeClassReference($ageClassHighscoreList) 
    { 
     if (!$this->ageClassHighscoreLists->contains($ageClassHighscoreList)) { 
      $this->ageClassHighscoreLists->add($ageClassHighscoreList); 
      $ageClassHighscoreList->setHighscoreList($this); 
     } 

     return $this; 
    } 
} 

}

RefAgeClassHighscoreList

/** 
* @ORM\Entity() 
* */ 
class RefAgeClassHighscoreList implements IVersionable 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $validFrom; 

    /** 
    * @ORM\Column(type="datetime", nullable=true) 
    */ 
    protected $validTo; 

    /** 
    * @ORM\ManyToOne(targetEntity="AgeClass", inversedBy="highscoreListReferences") 
    * @ORM\JoinColumn(name="ageclass_id", referencedColumnName="id", nullable=FALSE) 
    */ 
    protected $ageClass; 

    /** 
    * @ORM\ManyToOne(targetEntity="highscoreList", inversedBy="ageClassReferences") 
    * @ORM\JoinColumn(name="highscorelist_id", referencedColumnName="id", nullable=FALSE) 
    */ 
    protected $highscoreList; 

    protected $hasChanges = false; 

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

    /** 
    * @see IVersionable 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 
     return $this; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function getGuid() 
    { 
     return null; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function setGuid($guid) 
    { 
     return $this; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function getValidFrom() 
    { 
     return $this->validFrom; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function setValidFrom($validFrom) 
    { 
     $this->validFrom = $validFrom; 
     return $this; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function getValidTo() 
    { 
     return $this->validTo; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function setValidTo($validTo) 
    { 
     $this->validTo = $validTo; 
     return $this; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function isValid() 
    { 
     return ($this->validTo == null); 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function createNewVersion() 
    { 
     $newVersion = clone $this; 
     $newVersion->setValidFrom(new \DateTime()); 

     return $newVersion; 
    } 

    /** 
    * @see IVersionable 
    */ 
    public function hasChanges() 
    { 
     return $this->hasChanges; 
    } 

    /** 
    * @return AgeClass 
    */ 
    public function getAgeClass() 
    { 
     return $this->ageClass; 
    } 

    /** 
    * @param AgeClass $ageClass 
    * @return RefAgeClassHighscoreList 
    */ 
    public function setAgeClass($ageClass) 
    { 
     $this->ageClass = $ageClass; 
     return $this; 
    } 

    /** 
    * @return HighscoreList 
    */ 
    public function getHighscoreList() 
    { 
     return $this->highscoreList; 
    } 

    /** 
    * @param HighscoreList $highscoreList 
    * @return RefAgeClassHighscoreList 
    */ 
    public function setHighscoreList($highscoreList) 
    { 
     $this->gighscoreList = $highscoreList; 
     return $this; 
    } 
} 

回答

0

好了,你有一個非常反覆和繁瑣的問題。您可以使用AgeClass執行embed form並嵌入RefAgeClassHighscoreList類型的表單。在該嵌入式表單中,您可以擁有HighscoreList類型的屬性,問題在於,您需要的默認呈現組件是HighscoreList的多選列表,您可以看到它將屬性multiple = true置於HighscoreList屬性。

要將該列表轉換爲複選框列表,您需要創建一個自定義的theme擴展或添加新的塊到symfony提供的默認塊。我的建議是使用表單名稱爲您的特定表單創建新的小部件和行。你可以找到很多關於我所提及的內容的文檔,並且需要讓每個人的一小部分能夠完成你所要求的內容。

希望這一切的線索能幫助你。