我正在使用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方法中做到這一點? –