2013-04-30 40 views
1

我希望这是可能的使用一些内置的库,如窗体生成器。我有以下三个实体。中间的那个几乎只是一个常规的连接表,但它有一个额外的一列额外的数据。奇怪的多对多形式呈现与symfony和教条

式 - < FormulaColor> - 颜色

FormulaColor具有字段:式,颜色和比例。

百分比字段是指某个颜色组成给定公式的百分比。一个非常简单的例子是,一个公式可能是77%的红色和33%的蓝色。我的问题是,我想选择一个公式的颜色,并使用表单手动给他们一个百分比。所以我会添加(或编辑)一个特定的公式,并给出它的颜色紫色(20%)绿色(45%)和黄色(35%)。我不在乎能否在公式添加/编辑视图中添加新的颜色。我只想要能够选择现有的颜色。我用集合和实体类型玩了好几个小时,但没有运气。

有任何提示或技巧给我吗?我是否必须手动执行而不使用表单组件等?

谢谢。

式形式类型

class FormulaAddEditType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('code', null, array(
        'label' => 'Code' 
       )) 
      ->add('name', null, array(
        'label' => 'Name' 
       )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       'data_class' => 'Prism\Portal\CommonBundle\Entity\Formula' 
      )); 
    } 

    public function getName() 
    { 
     return 'prism_portal_adminbundle_formulaaddedittype'; 
    } 
} 

式实体

class Formula 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    * 
    * @Serializer\Expose 
    */ 
    private $id; 

    /** 
    * @var string $code 
    * 
    * @ORM\Column(name="code", type="string", length=50, nullable=true) 
    * 
    * @Serializer\Expose 
    */ 
    private $code; 

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

    /** 
    * @var datetime $createdOn 
    * 
    * @Gedmo\Timestampable(on="create") 
    * @ORM\Column(name="createdOn", type="datetime", nullable=true) 
    */ 
    private $createdOn; 

    /** 
    * @var datetime $updatedOn 
    * 
    * @Gedmo\Timestampable(on="update") 
    * @ORM\Column(name="updatedOn", type="datetime", nullable=true) 
    */ 
    private $updatedOn; 

    /** 
    * @var formulaColors 
    * 
    * @ORM\OneToMany(targetEntity="FormulaColor", mappedBy="formula") 
    */ 
    private $formulaColors; 

    public function __construct() 
    { 
     $this->formulaColors = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 


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

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

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

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

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

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

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

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

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

    /** 
    * Add formulaColor 
    * 
    * @param FormulaColor $formulaColor 
    */ 
    public function addFormulaColor(FormulaColor $formulaColor) 
    { 
     $this->formulaColors[] = $formulaColor; 
    } 

    /** 
    * Get formulaColors 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getFormulaColors() 
    { 
     return $this->formulaColors; 
    } 
} 

FormulaColor实体

/** 
* Prism\Portal\CommonBundle\Entity\FormulaColor 
* 
* @ORM\Table(name="FormulaColor") 
* @ORM\Entity 
* 
* @Serializer\ExclusionPolicy("all") 
*/ 
class FormulaColor 
{ 

    /** 
    * @var integer $formula 
    * 
    * @ORM\ManyToOne(targetEntity="Formula", inversedBy="formulaColors") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="formulaId", referencedColumnName="id") 
    * }) 
    * @ORM\Id 
    */ 
    private $formula; 

    /** 
    * @var integer color 
    * 
    * @ORM\ManyToOne(targetEntity="Color", inversedBy="formulaColors") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="colorId", referencedColumnName="id") 
    * }) 
    * @ORM\Id 
    */ 
    private $color; 

    /** 
    * @var decimal percentage 
    * 
    * @ORM\Column(type="decimal", precision=5, scale=2, nullable=false) 
    */ 
    private $percentage; 


    /** 
    * Set percentage 
    * 
    * @param decimal $percentage 
    */ 
    public function setPercentage($percentage) 
    { 
     $this->percentage = $percentage; 
    } 

    /** 
    * Get percentage 
    * 
    * @return decimal 
    */ 
    public function getPercentage() 
    { 
     return $this->percentage; 
    } 

    /** 
    * Set formula 
    * 
    * @param Prism\Portal\CommonBundle\Entity\Formula $formula 
    */ 
    public function setFormula(\Prism\Portal\CommonBundle\Entity\Formula $formula) 
    { 
     $this->formula = $formula; 
    } 

    /** 
    * Get formula 
    * 
    * @return Prism\Portal\CommonBundle\Entity\Formula 
    */ 
    public function getFormula() 
    { 
     return $this->formula; 
    } 

    /** 
    * Set color 
    * 
    * @param Prism\Portal\CommonBundle\Entity\Color $color 
    */ 
    public function setColor(\Prism\Portal\CommonBundle\Entity\Color $color) 
    { 
     $this->color = $color; 
    } 

    /** 
    * Get color 
    * 
    * @return Prism\Portal\CommonBundle\Entity\Color 
    */ 
    public function getColor() 
    { 
     return $this->color; 
    } 
} 

颜色实体

/** 
* Prism\Portal\CommonBundle\Entity\Color 
* 
* @ORM\Table(name="Color") 
* @ORM\Entity 
* 
* @Serializer\ExclusionPolicy("all") 
*/ 
class Color 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

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

    /** 
    * @var string $hexColor 
    * 
    * @ORM\Column(name="hex_color", type="string", length=50, nullable=true) 
    */ 
    private $hexColor; 

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

    /** 
    * @var integer $sortOrder 
    * 
    * @ORM\Column(name="sortOrder", type="integer", nullable=true) 
    */ 
    private $sortOrder; 

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

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

    /** 
    * @var $formulaColors 
    * 
    * @ORM\OneToMany(targetEntity="FormulaColor", mappedBy="color") 
    */ 
    private $formulaColors; 

    public function __construct() 
    { 
     $this->formulaColors = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 


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

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

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

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

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

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

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

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

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

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

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

    /** 
    * Get formulaColors 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getFormulaColors() 
    { 
     return $this->formulaColors; 
    } 

    /** 
    * addFormulaColors 
    * 
    * @param \Prism\Portal\CommonBundle\Entity\FormulaColor $formulaColor 
    */ 
    public function addFormulaColor(\Prism\Portal\CommonBundle\Entity\FormulaColor $formulaColor) 
    { 
     $this->formulaColors[] = $formulaColor; 
    } 

    /** 
    * Remove formulaColors 
    * 
    * @param \Prism\Portal\CommonBundle\Entity\FormulaColor $formulaColors 
    */ 
    public function removeFormulaColor(\Prism\Portal\CommonBundle\Entity\FormulaColor $formulaColors) 
    { 
     $this->formulaColors->removeElement($formulaColors); 
    } 

    /** 
    * Set hexColor 
    * 
    * @param string $hexColor 
    * @return Color 
    */ 
    public function setHexColor($hexColor) 
    { 
     $this->hexColor = $hexColor; 

     return $this; 
    } 

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

我也有一个ColorAddEditType形式

class ColorAddEditType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('code', null, array(
        'label' => 'Code' 
       )) 
      ->add('name', null, array(
        'label' => 'Name' 
       )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       'data_class' => 'Prism\Portal\CommonBundle\Entity\Color' 
      )); 
    } 

    public function getName() 
    { 
     return 'prism_portal_adminbundle_coloraddedittype'; 
    } 
} 

我根据瑞安的回应也更新了我的代码。

FormulaColorType

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('color', new ColorAddEditType()); 
    $builder->add('percent', 'number'); 
} 

FormulaAddEditType

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('code', null, array(
       'label' => 'Code' 
      )) 
     ->add('name', null, array(
       'label' => 'Name' 
      )); 

    $builder->add('formulaColors', 'collection', array(
      'type' => new FormulaColorType(), 
      'allow_add' => true, 
      'allow_delete' => true, 
      'prototype' => true, 
     )); 
} 

,现在我得到使用变压器/套data_class为null例外。当我将其中一个更改为null时,它说我可以将另一个更改为null。当我这样做时,它基本上说要改回它。我应该为这样的事情建立一个数据转换器是否正常?

这是当前的错误我得到:

表单的视图数据预计将类 棱镜\门户\ CommonBundle \实体\颜色的实例,但 类的一个实例棱镜\门户\ CommonBundle \实体\ FormulaColor。您可以通过将“data_class”选项设置为null或添加视图 转换器将类 Prism \ Portal \ CommonBundle \ Entity \ FormulaColor的实例转换为 Prism \ Portal \ CommonBundle \ Entity的实例来避免此错误 \颜色。

+1

显示您的实体和公式的形式。记住你可以创建子表单和复合表单。使用集合类型应该有诀窍。表单组件是非常强大的,没有什么你不能做的。 – mpm 2013-04-30 05:13:24

+0

好的感谢您的反馈意见。我用我的实体和公式表单类型更新了我的帖子。我知道你可以嵌入窗体,但我一直无法弄清楚。 – 2013-04-30 05:25:58

回答

1

你应该可以做这样的事情。这是一个相当常见的模式。棘手的一点是Javascript,但不会太糟糕。您可能需要使用JavaScript将您的数字加到100。

FormulaType

public function buildForm(FormBuilder $builder, array $options) { 
    $builder->add('formulaColors', 'collection', array(
     'type' => new FormularColorType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'prototype' => true, 
    )); 
} 

FormulaColorType

public function buildForm(FormBuilder $builder, array $options) { 
    $builder->add('color', new ColorType()); // Or similar 
    $builder->add('percent', 'number'); 
} 
+0

谢谢。我更新了我的帖子。这就是我首先想到的,但是当我玩弄它时,我总是会犯错误。无论是将data_class设置为null或使用数据转换器,还是期待某种实例类型,但获得持久性收集。现在,我收到了一个我添加到原始帖子的异常。 – 2013-04-30 06:04:00

+0

啊,事实证明我有data_class设置为颜色实体,而不是FormulaColor实体。虽然它不是渲染我现在真正想要的,但它实际上是渲染了一些表单元素,所以这是一个好的开始。 – 2013-04-30 06:13:04

+0

我想要做的是显示百分比的数字字段。我明白了。但是,我想将每个百分比的颜色名称显示为标签,而不是可编辑字段。什么会是一个很好的方法来做到这一点? – 2013-05-02 10:26:12