Я использую Sonata Admin с Symfony 2.8.9.В Sonata Admin, как получить Unmapped поле в sonata_type_collection Встроенные администраторы
Два объекта: умение и умение. Навыки имеют отношения «один ко многим» с навыками.
Администратор навыка имеет поле 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
}
}
Если и не может обновить дочернюю сущность через SonataAdmin preUpdate и слушатели prePersist, может быть, вы можете сделать это через Doctrine prePersist и события preUpdate? http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html. Или, может быть, вы можете это сделать в методах preAddmin prePersist и preUpdate? –