2012-01-12 22 views
7

मेरे पास ऑर्डर इकाई है, जिसमें कई लाइनइटम इकाइयां संबद्ध हो सकती हैं।सोनाटा व्यवस्थापक - बाल व्यवस्थापक वर्ग

मैंने ऑर्डर के लिए एक व्यवस्थापक वर्ग और LineItem के लिए एक व्यवस्थापक वर्ग बनाया है। लेकिन मुझे ऑर्डर एडमिन क्लास का बच्चा होने के लिए LineItem Admin Class की आवश्यकता है।

LineItemAdmin कक्षा में, मैंने protected $parentAssociationMapping = 'order'; सेट किया है।

इसके अलावा, ऑर्डरएडमिन क्लास कॉन्फ़िगरफॉर्मफिल्ड्स विधि में, मैंने ->add('lineItems', 'sonata_type_model') जोड़ा है।

हालांकि, यह अभी भी काम नहीं करता है। ऑर्डर फॉर्म में लाइन आइटम्स की सूची क्लिक करने योग्य नहीं है, इसलिए मैं नहीं देख सकता कि ऑर्डर एडमिन फॉर्म से लाइनइटम व्यवस्थापक सूची पृष्ठ कहने के लिए कैसे प्राप्त किया जाए।

क्या ऐसे मार्ग हैं जिन्हें कॉन्फ़िगर करने की आवश्यकता है? क्या lineItems फॉर्म फ़ील्ड में बदलाव हैं जो मुझे करने की ज़रूरत है?

सोनाटा एडमिन बंडल पर कोई अच्छा दस्तावेज ढूंढना बहुत मुश्किल हो गया है, इसलिए किसी भी मदद की सराहना की जाएगी।

पीएस। सोनाटाएडमिनबंडल कोड के माध्यम से भी मदद नहीं मिली है, क्योंकि इसकी जटिलता के कारण कोड का पालन करना बहुत मुश्किल है।

उत्तर

4

अनियंत्रित कार्यक्षमता के साथ एक ही समस्या से गुज़रने के बाद, केवल एक ही चरण जो आप चूक गए हैं, वे addChild और configureSideMenu को ऑर्डरएडमिन क्लास पर कॉल कर रहे हैं।

यह समाधान एक सिडमेनू से एक अलग पृष्ठ तैयार करेगा जिसमें लाइन इटम्स शामिल होंगे, वे ऑर्डरएडमिन फॉर्म में एम्बेड नहीं होंगे (मुझे यकीन नहीं है कि यह संभव है)।

कॉन्फ़िगर करने के लिए कोई भी मार्ग नहीं हैं, क्योंकि सोनाटाएडमिन आपके लिए इसे संभालता है। आप शायद __construct विधि की जरूरत नहीं होगी आप अपनी सेवाओं के लिए एक्सएमएल या YML का उपयोग करते हैं के रूप में addChild कॉल सेवा परिभाषा में जा सकते हैं

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

:

यहाँ एक उदाहरण माता पिता व्यवस्थापक वर्ग, है एनोटेशन का उपयोग।

लिखने के समय an open issue पर एक समर्पित @ एडमिन एनोटेशन के लिए पुल अनुरोध के साथ जेएमएस डिएक्स्ट्रा बंडल के साथ an open issue है जो इस आवश्यकता से बच सकता है। हालांकि यह कुछ हफ्तों के लिए शांत रहा है।

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 की वजह से जरूरी चीजें काम करने के लिए एक व्यवस्थापक वर्ग की आवश्यकता होती है।

यह समाधान कई चालान वस्तुओं के साथ मेरे चालान बंडल में ठीक काम करता है।