2012-01-12 14 views
7

Mam jednostkę Order, która może mieć wiele powiązanych jednostek LineItem.Administrator sonaty - administrator podrzędny klasa

Utworzyłem klasę Admin dla Order i klasę Admin dla LineItem. Ale potrzebuję, aby klasa LineItem Admin była potomkiem klasy Order Admin.

W klasie LineItemAdmin ustawiłem protected $parentAssociationMapping = 'order';.

Również w metodzie klasy OrderAdmin, w klasie OrderAdmin, dodałem ->add('lineItems', 'sonata_type_model').

Jednak nadal nie działa. Lista elementów zamówienia w formularzu zamówienia nie jest klikalna, więc nie widzę sposobu, w jaki można uzyskać formularz Administratora zamówienia, aby wyświetlić stronę listy administratorów LineItem.

Czy istnieją trasy, które należy skonfigurować? Czy są jakieś zmiany w polu formularza lineItems, które muszę wprowadzić?

Bardzo ciężko było znaleźć dobrą dokumentację pakietu Sonata Admin, więc każda pomoc będzie doceniona.

PS. Nawet przechodzenie przez kod SonataAdminBundle nie pomogło, ponieważ kod jest bardzo trudny do wykonania ze względu na jego złożoność.

Odpowiedz

4

Po tych samych problemach z nieudokumentowaną funkcjonalnością, jedyne kroki, które najwyraźniej zostały pominięte, to wywołanie addChild i configureSideMenu w nadrzędnej klasie OrderAdmin.

To rozwiązanie spowoduje utworzenie oddzielnej strony poza sidemenu, która będzie zawierać elementy lineItems, nie będą one osadzone w formularzu OrderAdmin (nie jestem pewien, czy jest to możliwe).

Nie ma żadnych tras do skonfigurowania, ponieważ SonataAdmin obsługuje to za Ciebie.

Oto przykład klasa dominująca administratora, używając adnotacji:

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

Jeśli używasz XML lub yml za swoje usługi prawdopodobnie nie będzie musiał metodę __construct jak rozmowy addChild może iść w definicji usługi.

W chwili pisania tego artykułu istnieje an open issue wraz z pakietem JMS DiExtra z prośbą o przesłanie dedykowanej adnotacji @Admin, która może również zapobiec temu wymaganiu. Przez kilka tygodni było cicho.

1

Można na następujące kwestie:

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

Upewnij się, że masz również OrderItem Administrator. Jest to konieczne ze względu na sonata_type_collection potrzebuje klasy Admin do pracy.

To rozwiązanie działa dobrze w moim zestawie faktur z wieloma elementami faktur.

Powiązane problemy