2017-07-01 2 views
0

J'ai une entité Doctrine Foo qui est liée à l'entité Doctrine AbstractBar par le modèle One-To-One.Comment administrer Doctrine ORM Class Table Héritage via SonataAdminBundle (Symfony)?

/** 
* @ORM\Table(name="foo") 
* @ORM\Entity 
*/ 
class Foo 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var AbstractBar 
    * 
    * @ORM\OneToOne(targetEntity="AbstractBar", cascade={"persist"}) 
    * @ORM\JoinColumn(name="bar_id", referencedColumnName="id") 
    */ 
    private $bar; 
} 

L'entité AbstractBar est une entité abstraite avec laquelle deux entités spécifiques sont associés à l'utilisation Class Table Inheritance

Alors, j'ai ceci:

/** 
* @ORM\Table(name="bar") 
* @ORM\Entity 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="bar_type", type="string") 
* @ORM\DiscriminatorMap({"one" = "BarOne", "two" = "BarTwo"}) 
*/ 
abstract class AbstractBar 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
} 

/** 
* @ORM\Table(name="bar_one") 
* @ORM\Entity 
*/ 
class BarOne extends AbstractBar 
{ 
    // BarOne class properties 
} 

/** 
* @ORM\Table(name="bar_two") 
* @ORM\Entity 
*/ 
class BarTwo extends AbstractBar 
{ 
    // BarTwo class properties 
} 

Le panneau d'administration (SonataAdminBundle) du Foo l'entité est configurée comme suit:

class FooAdmin extends AbstractAdmin 
{ 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('bar', AdminType::class, array(), array(
       'admin_code' => 'key.of.bar_one.admin.service' 
      )) 
     ; 
    } 
} 

En même temps, la configuration du service de classe administrateur ressemble à ceci:

key.of.bar_one.admin.service: 
    class: MyBundle\Admin\BarAdmin 
    arguments: [~, MyBundle\Entity\BarOne, ~] 
    tags: 
     - name: sonata.admin 
      manager_type: orm 
      show_in_dashboard: false 

Le code ci-dessus me permet d'éditer et de créer des entités Barone en éditant l'entité Foo.

Ma question est: comment puis-je faire en sorte que je peux basculer entre le BarOne et BarTwo dans la zone d'administration? C'est-à-dire, afin que je puisse implémenter le choix multiple fourni par le Doctrine ORM (Class Table Inheritance).

Répondre

1

créer une classe d'administration pour votre classe abstraite AbstractBar, par ex.

# MyBundle/Admin/BarAdmin.php 
class BarAdmin extends AbstractAdmin 
{ 
    ...  
} 

et définir un service, utilisez l'appel setSubclasses pour définir votre héritage de table/objet:

key.of.bar.admin.service: 
    class: MyBundle\Admin\AbstractBarAdmin 
    arguments: [~, MyBundle\Entity\AbstractBar, SonataAdminBundle:CRUD] 
    tags: 
     - { name: sonata.admin, manager_type: orm, show_in_dashboard: false } 
    calls: 
     - [setSubclasses, [{'Bar One': MyBundle\Entity\BarOne, 'Bar Tow': MyBundle\Entity\BarTwo]] 

Mettez à jour votre FooAdmin d'utiliser la nouvelle classe admin:

$formMapper 
    ->add('bar', AdminType::class, array(), array(
     'admin_code' => 'key.of.bar.admin.service' 
    )) 
; 

À l'intérieur de votre classe BarAdmin, vous pouvez vérifier quel objet concret vous devez adapter l'admin en conséquence, par exemple lors de la configuration des champs de formulaire

/** 
* @param FormMapper $form 
*/ 
protected function configureFormFields(FormMapper $form) { 
    $subject = $this->getSubject(); 

    // add shared fields 
    $form->add(); 

    // BarOne fields 
    if ($subject instanceof BarOne) 
    } 

    // BarTwo fields 
    if ($subject instanceof BarTwo) 
    } 
}