2016-09-21 48 views
1

我正在使用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 
    } 

} 
+1

如果你无法通过更新前的SonataAdmin和更新子实体prePersist听众,也许你可以通过Doctrine prePersist和preUpdate事件做到这一点? http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html。或者,也许你可以在SkillAdmin prePersist和preUpdate方法中做到这一点? –

回答

2

您需要手动管理。退房this example in the official documentationthe related issue entry

关于你提到的例子中,你可以做这样的事情(与你的服务ID替换skill_step_admin_service_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); 
    } 
} 
+1

感谢您的回复。这对于调用嵌入式管理员的挂钩起作用。但是,以这种方式调用时,未映射字段的输入对管理员来说是未知的。我在SkillStepAdmin钩子中尝试了'$ this-> getForm() - > get('data') - > getData();',但即使在数据字段中输入了文本,也会给出NULL值。 – amacrobert

相关问题