【发布时间】:2016-02-28 07:09:32
【问题描述】:
我有三个实体,Block、BlockPlacement、BlockPosition:
class BlockEntity
{
private $bid;
/**
* @ORM\OneToMany(
* targetEntity="BlockPlacementEntity",
* mappedBy="block",
* cascade={"remove"})
*/
private $placements;
}
class BlockPlacementEntity
{
/**
* The id of the block postion
*
* @ORM\Id
* @ORM\ManyToOne(targetEntity="BlockPositionEntity", inversedBy="placements")
* @ORM\JoinColumn(name="pid", referencedColumnName="pid", nullable=false)
*/
private $position;
/**
* The id of the block
*
* @var BlockEntity
* @ORM\Id
* @ORM\ManyToOne(targetEntity="BlockEntity", inversedBy="placements")
* @ORM\JoinColumn(name="bid", referencedColumnName="bid", nullable=false)
*/
private $block;
private $sortorder;
}
class BlockPositionEntity
{
private $pid;
/**
* @ORM\OneToMany(
* targetEntity="BlockPlacementEntity",
* mappedBy="position",
* cascade={"remove"})
* @ORM\OrderBy({"sortorder" = "ASC"})
*/
private $placements;
}
所以,你可以看到关系:Block Placement Position。
现在我正在尝试构建一个表单来创建/编辑一个块:
$builder
->add($builder->create('placements', 'entity', [
'class' => 'Zikula\BlocksModule\Entity\BlockPositionEntity',
'choice_label' => 'name',
'multiple' => true,
'required' => false
]))
;
这为我提供了一个很好的选择框,可以进行多项选择,并有适当的位置列表可供选择。但它没有显示以前的放置选择(我正在使用现有数据),例如将位置标记为“已选择”。我还没有尝试创建新块,只编辑现有数据。
我怀疑我需要使用addModelTransformer() 或addViewTransformer(),但我尝试了其中一些,但无法使其正常工作。
我查看了collection 表单类型,但我不喜欢该解决方案,因为它不是多选框。它需要 JS 并且不像简单的选择元素那样直观。
这对人们来说似乎是一个普遍的问题。我搜索并发现没有共同的答案,也没有任何帮助。
【问题讨论】:
-
你为什么会想到 DataTransformers 来解决这个问题?当您需要转换模型数据时使用它们。是的,在这种情况下,收集字段要复杂得多。我将在下面添加指向我的答案的链接,以向您展示我的项目中同一案例的工作代码
标签: symfony doctrine-orm entity-relationship symfony-forms zikula