我用的是奏鸣曲管理和Symfony 2.8.9。
两个实体:技能和SkillStep。技能与SkillSteps有一对多的关系。
技能管理有一个sonata_type_collection字段,它嵌入多个SkillStep管理员。
每个SkillStep管理员都有一个名为"data“的未映射文本字段。它不直接映射到SkillStep实体中的任何值。
当用户保存或更新技能时,我希望基于sonata_type_collection中每个sonata_type_collection管理员的"data“字段的输入来运行任意代码。
这样做的最明显的地方是prePersist()和preUpdate()在SkillStep管理中。然而,
当将一个Admin嵌入到另一个Admin中时,例如使用
sonata_type_admin字段类型时,子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
}
}发布于 2016-09-22 13:55:19
你需要手动处理这个问题。查看正式文档中的这个示例和相关问题条目
关于您的示例,您可以这样做(将skill_step_admin_service_id替换为您的服务id以使其工作):
# Admin/SkillAdmin.php
private function getStepAdmin() {
return $this->getConfigurationPool()
->getAdminByAdminCode('skill_step_admin_service_id');
}
public function prePersist($skill)
{
foreach ($skill->getSteps() as $step) {
$this->getStepAdmin->prePersist($step);
}
}
public function preUpdate($skill)
{
foreach ($skill->getSteps() as $step) {
$this->getStepAdmin->preUpdate($step);
}
}发布于 2022-08-03 23:29:17
增加了洛德罗多斯的答案。您可以在同一表单中直接访问未映射字段,只需检查窗体子字段即可。像这样:
$myUnmappedData = $form->get('steps')->get($key)->get('SkillStep')->get('unmappedField')->getData();示例:
# Admin/SkillAdmin.php
private function getStepAdmin() {
return $this->getConfigurationPool()
->getAdminByAdminCode('skill_step_admin_service_id');
}
public function prePersist($skill)
{
foreach ($skill->getSteps() as $key => $step) {
#access to unmapped form field
$myUnmappedData = $form->get('steps')->get($key)->get('SkillStep')->get('unmappedField')->getData();
$this->getStepAdmin->publicFunctionToManageMyData($step, $myUnmappedData);
}
}https://stackoverflow.com/questions/39623142
复制相似问题