2012-01-12 15 views
7

Tengo una entidad de Orden, que puede tener múltiples entidades LineItem asociadas.administrador de Sonata - clase de administración infantil

He creado una clase Admin para Order y una clase Admin para LineItem. Pero necesito que la clase de administración de LineItem sea hija de la clase de administración de pedidos.

En la clase LineItemAdmin, configuré protected $parentAssociationMapping = 'order';.

Además, en el método configureFormFields de la clase OrderAdmin, he agregado ->add('lineItems', 'sonata_type_model').

Sin embargo, todavía no funciona. No se puede hacer clic en la lista de líneas de pedido en el formulario de pedido, por lo que no puedo ver cómo obtenerla del formulario de administración de pedidos para decir la página de la lista de administración de LineItem.

¿Hay rutas que deben configurarse? ¿Hay algún cambio en el campo de formulario lineItems que deba hacer?

Ha sido muy difícil encontrar cualquier documentación buena en el paquete de administración de Sonata, por lo que cualquier ayuda sería apreciada.

PS. Incluso el paso por el código de SonataAdminBundle no ha ayudado, ya que el código es muy difícil de seguir debido a su complejidad.

Respuesta

4

Después de haber pasado por los mismos problemas con la funcionalidad no documentada, los únicos pasos que parece haber perdido son llamar a addChild y configureSideMenu en la clase principal OrderAdmin.

Esta solución creará una página separada de un menú lateral que contendrá los elementos de línea, no se insertarán en el formulario OrderAdmin (no estoy seguro de que esto sea posible).

No hay ninguna ruta para configurar, ya que SonataAdmin maneja esto para usted.

He aquí un ejemplo de la clase de administración de los padres, usando anotaciones:

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 utiliza XML o YML por sus servicios que no necesitará probablemente el método __construct como los addChild llamadas pueden ir en la definición del servicio.

En el momento de la escritura hay an open issue con el JMS DiExtra Bundle con solicitud de extracción para una anotación @Admin dedicada que también puede evitar este requisito. Sin embargo, ha sido silencioso durante un par de semanas.

1

Puede a lo siguiente:

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

Asegúrese de que usted también tiene un administrador de pedido. Eso es necesario debido a que sonata_type_collection necesita una clase Admin para funcionar.

Esa solución funciona bien en mi paquete de facturas con muchos artículos de factura.

Cuestiones relacionadas