2012-01-12 2 views
7

J'ai une entité Order, qui peut avoir plusieurs entités LineItem associées.Sonata admin - classe admin enfant

J'ai créé une classe Admin pour Order et une classe Admin pour LineItem. Mais j'ai besoin de la classe Admin LineItem pour être un enfant de la classe Order Admin.

Dans la classe LineItemAdmin, j'ai défini protected $parentAssociationMapping = 'order';.

De même, dans la méthode configureFormFields de la classe OrderAdmin, j'ai ajouté ->add('lineItems', 'sonata_type_model').

Cependant, cela ne fonctionne toujours pas. La liste des éléments de campagne du formulaire de commande ne peut pas être cliquée. Par conséquent, je ne vois pas comment accéder à la page de la liste d'administration de LineItem depuis le formulaire Administrateur de commandes.

Y a-t-il des routes à configurer? Y a-t-il des modifications au champ de formulaire lineItems que j'ai besoin de faire?

Il a été très difficile de trouver une bonne documentation sur le bundle Sonata Admin, donc toute aide serait appréciée.

PS. Même en passant par le code SonataAdminBundle n'a pas aidé, car le code est très difficile à suivre en raison de sa complexité.

Répondre

4

Après avoir rencontré les mêmes problèmes avec des fonctionnalités non documentées, les seules étapes que vous semblez avoir manqué sont d'appeler addChild et configureSideMenu sur la classe OrderAdmin parent.

Cette solution créera une page séparée d'un sidemenu qui contiendra les éléments de ligne, ils ne seront pas incorporés dans le formulaire OrderAdmin (je ne suis pas sûr que cela soit possible).

Aucune voie ne doit être configurée car SonataAdmin la gère pour vous.

Voici un exemple de classe admin mère, en utilisant des annotations:

namespace YourVendor\YourBundle\Admin; 

use JMS\DiExtraBundle\Annotation\Service; 
use JMS\DiExtraBundle\Annotation\Tag; 
use JMS\DiExtraBundle\Annotation\Inject; 
use JMS\DiExtraBundle\Annotation\InjectParams; 

use Knp\Menu\ItemInterface as MenuItemInterface; 

use Sonata\AdminBundle\Admin\Admin; 
use Sonata\AdminBundle\Admin\AdminInterface; 

/** 
* @Service("sonata.admin.order") 
* @Tag("sonata.admin", attributes={"manager_type"="orm", "group"="Orders", "label"="Orders"}) 
*/ 
class OrderAdmin extends Admin 
{ 
    /** 
    * @InjectParams({ 
    *  "code" = @Inject("%your.parameters.code%"), 
    *  "class" = @Inject("%your.parameters.class%"), 
    *  "baseControllerName" = @Inject("%your.parameters.controller%"), 
    *  "lineItems" = @Inject("sonata.admin.line_item") 
    * }) 
    */ 
    public function __construct($code, $class, $baseControllerName, $lineItems) 
    { 
     parent::__construct($code, $class, $baseControllerName); 

     $this->addChild($lineItems); 
    } 

    protected function configureSideMenu(MenuItemInterface $menu, $action, AdminInterface $childAdmin = null) 
    { 
     if (!$childAdmin && !in_array($action, array('edit', 'show'))) { return; } 

     $admin = $this->isChild() ? $this->getParent() : $this; 
     $id = $admin->getRequest()->get('id'); 

     $menu->addChild('Show Order', array('uri' => $admin->generateUrl('show', array('id' => $id)))); 
     $menu->addChild('Edit Order', array('uri' => $admin->generateUrl('edit', array('id' => $id)))); 
     $menu->addChild('Line items', array('uri' => $admin->generateUrl('sonata.admin.line_item.list', array('id' => $id)))); 
    } 
} 

Si vous utilisez XML ou YML pour vos services, vous aurez probablement pas besoin de la méthode __construct que les addChild appels peuvent aller dans la définition du service.

Au moment de l'écriture, il y a an open issue avec le paquet JMS DiExtra avec une requête de tirage pour une annotation @Admin dédiée qui peut également éviter cette exigence. Il a été calme pendant quelques semaines cependant.

1

Vous pouvez à ce qui suit:

// Order Entity 
/** 
* @ORM\OneToMany(targetEntity="OrderItem", mappedBy="invoice", cascade={"persist", "remove"}, orphanRemoval=true) 
* 
*/ 
protected $items; 
... 



// OrderAdmin.php 
protected function configureFormFields(FormMapper $formMapper) 
{ 
     $formMapper 
     ->with('Order Items') 
      ->add('items', 'sonata_type_collection', array('required' => true, 
                  'by_reference' => false, 
                  ), 
                array('edit' => 'inline', 
                  'inline' => 'table',)) 
.... 

Assurez-vous que vous avez également une OrderItem administration. C'est nécessaire à cause de sonate_type_collection qui nécessite une classe Admin pour fonctionner.

Cette solution fonctionne très bien dans mon lot de factures avec de nombreux éléments de facture.

Questions connexes