2016-09-21 47 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

相關問題