首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在奏鸣曲管理中,如何在sonata_type_collection嵌入式管理员中获取未映射字段

在奏鸣曲管理中,如何在sonata_type_collection嵌入式管理员中获取未映射字段
EN

Stack Overflow用户
提问于 2016-09-21 17:38:57
回答 2查看 2.5K关注 0票数 1

我用的是奏鸣曲管理和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的管理员的未映射字段?,重要的是,这些未映射的字段与它们所在的管理对象相关联。

相关守则:

代码语言:javascript
复制
# Entity/Skill.php

class Skill {
    /**
     * @ORM\OneToMany(targetEntity="SkillStep", mappedBy="skill")
     */
    private $steps;

    // ...
}
代码语言:javascript
复制
# Entity/SkillStep.php

class SkillStep {
    /**
     * @ORM\ManyToOne(targetEntity="Skill")
     * @ORM\JoinColumn(name="skill_id", referencedColumnName="id")
     **/
    protected $skill;

    // ..
}
代码语言:javascript
复制
# 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']
            )
        ;
    }
}
代码语言:javascript
复制
# 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
    }

}
EN

回答 2

Stack Overflow用户

发布于 2016-09-22 13:55:19

你需要手动处理这个问题。查看正式文档中的这个示例相关问题条目

关于您的示例,您可以这样做(将skill_step_admin_service_id替换为您的服务id以使其工作):

代码语言:javascript
复制
# 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); 
    }
}
票数 2
EN

Stack Overflow用户

发布于 2022-08-03 23:29:17

增加了洛德罗多斯的答案。您可以在同一表单中直接访问未映射字段,只需检查窗体子字段即可。像这样:

代码语言:javascript
复制
$myUnmappedData = $form->get('steps')->get($key)->get('SkillStep')->get('unmappedField')->getData();

示例:

代码语言:javascript
复制
# 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); 
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39623142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档