2012-01-12 7 views
7

Ho un'entità Ordine, che può avere più entità LineItem associate.Amministratore Sonata - classe amministratore figlio

Ho creato una classe di amministrazione per ordine e una classe di amministrazione per LineItem. Ma ho bisogno che la classe Admin di LineItem sia figlia della classe Admin degli ordini.

Nella classe LineItemAdmin, ho impostato protected $parentAssociationMapping = 'order';.

Inoltre, nel metodo configureFormFields della classe OrderAdmin, ho aggiunto ->add('lineItems', 'sonata_type_model').

Tuttavia, non funziona ancora. L'elenco di elementi pubblicitari nel modulo d'ordine non è selezionabile, quindi non riesco a vedere come ottenere dal modulo di gestione degli ordini per indicare la pagina di elenco admin di LineItem.

Ci sono percorsi che devono essere configurati? Ci sono modifiche al campo modulo lineItems che devo compilare?

È stato molto difficile trovare una buona documentazione sul pacchetto Sonata Admin, quindi qualsiasi aiuto sarebbe apprezzato.

PS. Anche l'utilizzo del codice SonataAdminBundle non ha aiutato, poiché il codice è molto difficile da seguire a causa della sua complessità.

risposta

4

Avendo appena affrontato gli stessi problemi con funzionalità non documentate, gli unici passaggi che sembra mancare sono chiamare addChild e configureSideMenu nella classe genitore OrderAdmin.

Questa soluzione creerà una pagina separata da un sidemenu che conterrà i lineItems, non saranno incorporati nel modulo OrderAdmin (non sono sicuro che ciò sia possibile).

Non ci sono percorsi da configurare, come SonataAdmin gestisce per te.

Ecco un esempio di classe genitore di amministrazione, utilizzando le annotazioni:

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)))); 
    } 
} 

Se si utilizza XML o YML per i vostri servizi che probabilmente non sarà necessario il metodo __construct i addChild chiamate possono andare nella definizione del servizio.

Al momento della scrittura, an open issue con il pacchetto DiExtra JMS con richiesta pull per un'annotazione @Admin dedicata che potrebbe anche evitare questo requisito. Però è stato tranquillo per un paio di settimane.

1

È possibile a quanto segue:

// 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',)) 
.... 

Assicurarsi che anche voi avete un OrderItem Admin. Questo è necessario perché la proprietà sonata_type_collection richiede una classe di amministrazione per funzionare.

Questa soluzione funziona bene nel mio pacchetto di fatture con molti articoli di fattura.