フォームビルダーなどの組み込みライブラリを使用してこれが可能になることを願っています。私は次の3つのエンティティを持っています。真ん中にあるものはほとんど通常の結合テーブルですが、追加のデータを含む追加の列があります。
式 --< 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';
}
}
Ryan の応答に従って、コードも更新しました。
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に変更できると表示されます。私がそれをすると、基本的に元に戻すように言われます。このようなもののためにデータトランスフォーマーをセットアップしなければならないのは普通ですか?
ここに私が得ている現在のエラーがあります:
フォームのビュー データはクラス Prism\Portal\CommonBundle\Entity\Color のインスタンスであると予想されますが、クラス Prism\Portal\CommonBundle\Entity\FormulaColor のインスタンスです。このエラーを回避するには、「data_class」オプションを null に設定するか、クラス Prism\Portal\CommonBundle\Entity\FormulaColor のインスタンスを Prism\Portal\CommonBundle\Entity\Color のインスタンスに変換するビュー トランスフォーマーを追加します。