2016-09-21 13 views
1

私はSymfony 2.8.9でSonata Adminを使用しています。Sonata Adminでは、sonata_type_collectionのマッピングされていないフィールドを取得する方法埋め込み管理者

2つのエンティティ:スキルとスキルステップ。スキルはスキルステップと1対1の関係を持っています。

スキル管理者には、複数のスキルステップ管理者が組み込まれたsonata_type_collectionフィールドがあります。

各スキルステップ管理者には、「データ」というマップされていないテキストフィールドがあります。 SkillStepエンティティの値に直接マップされません。

ユーザーがスキルを保存または更新するとき、sonata_type_collectionの各スキルステップ管理者の「データ」フィールドへの入力に基づいて任意のコードを実行したいとします。

スキルステップ管理者の場合、これを実行する明白な場所はprePersist()preUpdate()です。しかし、

sonata_type_adminフィールドタイプを使用して、たとえば、別の内の1つの管理を埋め込む、子供は管理者のフックは解雇されていません。私はトップレベルのエンティティを保存するときに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

:あなたはこのような何か(この作品を作るためにあなたのサービスIDとskill_step_admin_service_idを置き換え)を行うことができますあなたの例についてはthis example in the official documentationthe related issue entry

をチェックprePersistリスナー、おそらくあなたdoctrine prePersistとpreUpdateイベントを介して行うことができますか? http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html。または、あなたはSkillAdmin prePersistとpreUpdateメソッドでそれを行うことができますか? –

答えて

2

これは手動で管理する必要があります。 uはSonataAdmin更新前と経由して子実体を更新できない場合

# 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

関連する問題