2012-01-12 40 views
7

Tôi có một thực thể Đơn đặt hàng, có thể có nhiều thực thể LineItem được liên kết.Quản trị Sonata - lớp quản trị con

Tôi đã tạo một lớp Quản trị cho Đơn hàng và lớp Quản trị cho LineItem. Nhưng tôi cần lớp quản trị LineItem là một lớp con của lớp Admin.

Trong lớp LineItemAdmin, tôi đã đặt protected $parentAssociationMapping = 'order';.

Ngoài ra, trong phương thức configureFormFields của lớp OrderAdmin, tôi đã thêm ->add('lineItems', 'sonata_type_model').

Tuy nhiên, nó vẫn không hoạt động. Danh sách chi tiết đơn hàng trong biểu mẫu đặt hàng không thể nhấp được, vì vậy tôi không thể xem cách tải xuống từ biểu mẫu Quản trị đơn đặt hàng để nói trang danh sách quản trị LineItem.

Có các tuyến đường nào cần được định cấu hình không? Có những thay đổi đối với trường biểu mẫu lineItems mà tôi cần phải thực hiện không?

Rất khó để tìm thấy bất kỳ tài liệu hay nào về gói quản trị Sonata, vì vậy mọi trợ giúp sẽ được đánh giá cao.

PS. Ngay cả việc trải qua mã SonataAdminBundle cũng không giúp được gì, vì mã rất khó tuân theo do sự phức tạp của nó.

Trả lời

4

Chỉ vừa trải qua các vấn đề tương tự với chức năng không có giấy tờ, các bước duy nhất bạn có vẻ đã bỏ lỡ đang gọi addChildconfigureSideMenu trên lớp OrderAdmin gốc.

Giải pháp này sẽ tạo ra một trang riêng biệt ngoài một sidemenu sẽ chứa lineItems, chúng sẽ không được nhúng trong biểu mẫu OrderAdmin (Tôi không chắc chắn rằng điều này là có thể).

Không có bất kỳ tuyến đường nào để được định cấu hình vì SonataAdmin xử lý điều này cho bạn.

Dưới đây là một ví dụ lớp cha admin, sử dụng chú thích:

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

Nếu bạn sử dụng XML hoặc YML cho các dịch vụ của bạn, bạn có thể sẽ không cần các phương pháp __construct như addChild cuộc gọi có thể đi trong định nghĩa dịch vụ.

Tại thời điểm viết, có an open issue với Gói di chuyển JMS DiExtra với yêu cầu kéo cho chú thích @Admin chuyên dụng cũng có thể tránh yêu cầu này. Nó đã được yên tĩnh cho một vài tuần mặc dù.

1

Bạn có thể như sau:

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

Hãy chắc chắn rằng bạn cũng có một OrderItem quản trị. Thats cần thiết vì sonata_type_collection cần một lớp Admin để làm việc.

Giải pháp đó hoạt động tốt trong gói hóa đơn của tôi với nhiều mục hóa đơn.

Các vấn đề liên quan