我正在使用Symphony 2.8.9的Sonata Admin。在Sonata Admin中,如何在sonata_type_collection中获取未映射的字段Embedded Admins
两个实体:Skill and SkillStep。技能与SkillSteps有一对多的关系。
技能管理员有一个sonata_type_collection字段,嵌入多个SkillStep管理员。
每个SkillStep管理员都有一个名为“data”的未映射文本字段。它不直接映射到SkillStep实体中的任何值。
当用户保存或更新技能时,我想根据输入到sonata_type_collection中每个SkillStep管理员的“数据”字段的输入运行任意代码。
在SkillStep管理员中,明显的位置是prePersist()
和preUpdate()
。然而,
当使用
sonata_type_admin
字段类型中嵌入另一个管理员,例如,孩子管理的挂钩不会被触发。
我怎样才能拯救顶级实体时嵌入sonata_type_collection管理员的映射的领域工作?,这些未映射的字段都与他们所在的管理的对象关联是非常重要的
相关代码:
# Entity/Skill.php
class Skill {
/**
* @ORM\OneToMany(targetEntity="SkillStep", mappedBy="skill")
*/
private $steps;
// ...
}
# Entity/SkillStep.php
class SkillStep {
/**
* @ORM\ManyToOne(targetEntity="Skill")
* @ORM\JoinColumn(name="skill_id", referencedColumnName="id")
**/
protected $skill;
// ..
}
# Admin/SkillAdmin.php
class SkillAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('name')
->add('steps', 'sonata_type_collection',
['required' => false, 'label' => 'Manage the skill steps'],
['edit'=>'inline','inline'=>'standard']
)
;
}
}
# Admin/SkillStepAdmin.php
class SkillStepAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('name')
->add('route')
->add('data', 'textarea', [
'mapped' => false,
'data' => $step_data,
])
;
}
// Before a new skill step is saved
public function prePersist($skill_step) {
// THIS IS NEVER CALLED BECAUSE THIS ADMIN IS EMBEDDED
}
// Before an existing skill step is updated
public function preUpdate($skill_step) {
// THIS IS NEVER CALLED BECAUSE THIS ADMIN IS EMBEDDED
}
}
如果你无法通过更新前的SonataAdmin和更新子实体prePersist听众,也许你可以通过Doctrine prePersist和preUpdate事件做到这一点? http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html。或者,也许你可以在SkillAdmin prePersist和preUpdate方法中做到这一点? –