У меня есть три сущности, Блок, BlockPlacement, BlockPosition:Symfony Форма ManyToOne OneToMany
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;
}
Таким образом, вы можете видеть отношения: Блок < OneToMany> Размещение < ManyToOne> Положение.
Теперь я пытаюсь построить форму создания/редактирования блока:
$builder
->add($builder->create('placements', 'entity', [
'class' => 'Zikula\BlocksModule\Entity\BlockPositionEntity',
'choice_label' => 'name',
'multiple' => true,
'required' => false
]))
;
Это дает мне хорошее поле выбора с выбора нескольких возможных с надлежащей список позиций на выбор. Но он не показывает предыдущие варианты размещения (я использую существующие данные), например. маркировка позиций как «выбрана». Я еще не пробовал создавать новый блок, только редактируя существующие данные.
Я подозреваю, что мне нужно будет использовать addModelTransformer()
или addViewTransformer()
, но попробовали некоторые из них, и он не может заставить его работать.
Я просмотрел тип формы collection
, и мне не нравится это решение, потому что оно не является полем с несколькими выборами. Он требует JS и не настолько интуитивно понятен, как простой элемент select.
Это похоже на такую общую проблему для людей. Я искал и не нашел общего ответа, и ничего не помогло.
Почему вы думаете о DataTransformers для этой проблемы? Они используются, когда вам необходимо преобразовать данные модели. И да, поле сбора намного сложнее для этого случая. Я добавлю ссылки на мой ответ ниже, чтобы показать вам рабочий код для одного и того же случая из моего проекта –