Я использую Sonata Admin с Symfony 2.8.9.
Две сущности: Skill и SkillStep. Навыки имеют отношения «один ко многим» с SkillSteps.
У администратора Skill есть поле sonata_type_collection, которое включает несколько администраторов SkillStep.
У каждого администратора SkillStep есть несопоставленное текстовое поле под названием «данные». Он не сопоставляется напрямую ни с каким значением в сущности SkillStep.
Когда пользователь сохраняет или обновляет навык, я хочу запустить произвольный код на основе ввода в поле «данные» каждого администратора SkillStep в sonata_type_collection.
Очевидным местом для этого будут prePersist()
и preUpdate()
в админке SkillStep. Однако,
При встраивании одного администратора в другого, например, с использованием типа поля
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
}
}