2012-01-12 5 views
7

나는 여러 개의 LineItem 엔티티를 연결할 수있는 Order 엔티티가 있습니다.소나타 관리 - 하위 관리 클래스

Order의 Admin 클래스와 LineItem의 Admin 클래스를 만들었습니다. 하지만 LineItem Admin 클래스가 Order Admin 클래스의 자식이어야합니다.

LineItemAdmin 클래스에서 protected $parentAssociationMapping = 'order';을 설정했습니다.

또한 OrderAdmin 클래스 configureFormFields 메서드에서 ->add('lineItems', 'sonata_type_model')을 추가했습니다.

그러나 여전히 작동하지 않습니다. 주문 양식의 광고 항목 목록은 클릭 할 수 없으므로 광고 주문 관리 양식에서 LineItem 관리 목록 페이지로 이동하는 방법을 볼 수 없습니다.

구성해야 할 경로가 있습니까? 양식 필드 lineItems을 변경해야합니까?

소나타 관리 번들에 대한 좋은 문서를 찾기가 매우 어려워서 도움이 될 것입니다.

추신. 코드가 복잡하기 때문에 따라하기가 매우 어렵 기 때문에 SonataAdminBundle 코드를 통과하는 것조차 도움이되지 못했습니다.

답변

4

문서화되지 않은 기능과 동일한 문제가 발생했지만 부모 OrderAdmin 클래스에서 addChildconfigureSideMenu을 호출하는 것만 남았습니다.

이 솔루션은 lineItems를 포함하는 사이드 메뉴에서 별도의 페이지를 만들 것이고, OrderAdmin 양식에 포함되지 않을 것입니다. (이것이 가능하지는 않습니다.)

구성 할 경로가 없으므로 SonataAdmin이이 경로를 처리합니다.

여기에 주석을 사용하여, 예를 들어 상위 관리 클래스의 :

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

당신이 당신의 서비스에 대한 XML 또는 YML을 사용하는 경우 addChild 호출 서비스 정의에 갈 수 당신은 아마도 __construct 방법이 필요하지 않습니다.

작성 당시에는이 요구 사항을 피할 수있는 전용 @Admin 주석을 요청한 JMS DiExtra 번들과 함께 an open issue이 있습니다. 그것은 2,3 주 동안 조용했다. 다음

1

당신은 할 수 있습니다

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

하는 당신은 또한 OrderItem에 관리자가 있는지 확인합니다. Sonata_type_collection 때문에 필요한 작업은 Admin 클래스가 필요합니다.

그 솔루션은 많은 인보이스 항목이있는 인보이스 번들에서 올바르게 작동합니다.

관련 문제