2016-09-21 2 views
1

Я использую Sonata Admin с Symfony 2.8.9.В Sonata Admin, как получить Unmapped поле в sonata_type_collection Встроенные администраторы

Два объекта: умение и умение. Навыки имеют отношения «один ко многим» с навыками.

Администратор навыка имеет поле sonata_type_collection, в которое входят несколько администраторов SkillStep.

У каждого администратора SkillStep есть текстовое поле без названия, называемое «данные». Он не сопоставляется непосредственно с любым значением в объекте SkillStep.

Когда пользователь сохраняет или обновляет навык, я хочу запустить произвольный код на основе ввода в поле «данные» каждого администратора SkillStep в sonata_type_collection.

Очевидным местом для этого было бы prePersist() и preUpdate() в администраторе SkillStep. Тем не менее,

При вложении одного Администратора внутри другого, например, с помощью типа поля 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 preUpdate и слушатели prePersist, может быть, вы можете сделать это через Doctrine prePersist и события preUpdate? http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html. Или, может быть, вы можете это сделать в методах preAddmin prePersist и preUpdate? –

ответ

2

Вам нужно управлять этим вручную. Проверьте this example in the official documentation и the related issue entry

Что касается вашего примера вы можете сделать что-то вроде этого (заменить 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

Спасибо за ответ. Это работает для вызова крючков встроенных админов. Однако вход анонимного поля неизвестен администратору при вызове этого способа. Я попробовал '$ this-> getForm() -> get ('data') -> getData();' в hookStitchAdmin, но это дает мне NULL, даже если в поле данных введен текст. – amacrobert

Смежные вопросы