Magento2 में व्यवस्थापन विक्रय दृश्य में कस्टम बटन कैसे जोड़ें


13

यहाँ छवि विवरण दर्ज करें

Magento2 में बिक्री ऑर्डर दृश्य में एक कस्टम बटन कैसे जोड़ें, क्योंकि कुछ ईवेंट प्लग-इन के पक्ष में हटा दिए गए थे।

  • कुछ ईवेंट हटाए गए (प्लग इन का उपयोग किया जाना चाहिए):

Magento2 परिवर्तन लॉग देखें

जवाबों:


19

अब तक मैंने जो सबसे साफ समाधान देखा है, वह 'पहले सोचे' के बाद एक टारगेट का उपयोग करना है

यह सटीक ब्लॉक को लक्षित कर सकता है, वर्तमान अनुरोध के लिए चेक की बचत कर सकता है, और 'getOrderId' पर होने वाले प्लगइन से भी बचता है, जो मेरे मामले में उपयोग नहीं किया जा सकता है क्योंकि मुझे अपने प्लगइन विधि में getOrderId को कॉल करने की आवश्यकता है।

तो यह di.xml में

   <type name="Magento\Sales\Block\Adminhtml\Order\View">
    <plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
   </type>

और फिर इस फ़ाइल में My \ Module \ Plugin \ Block \ Adminhtml \ Order \ View.php

public function beforeSetLayout(\Magento\Sales\Block\Adminhtml\Order\View $view)
{
    $message ='Are you sure you want to do this?';
    $url = '/mymodule/controller/action/id/' . $view->getOrderId();


    $view->addButton(
        'order_myaction',
        [
            'label' => __('My Action'),
            'class' => 'myclass',
            'onclick' => "confirmSetLocation('{$message}', '{$url}')"
        ]
    );


}

एक आकर्षण की तरह काम किया
राउल सांचेज

17

कई अलग-अलग तरीकों की कोशिश करने के बाद, यह एकमात्र समाधान है जो मुझे मिल सकता है जो अन्य मॉड्यूल को प्रभावित किए बिना काम करने लगता है। मैं अन्य समाधान देखना पसंद करूंगा।

विकल्प 1

कंपनी / मॉड्यूल / etc / adminhtml / di.xml में एक प्लगइन बनाएँ

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Backend\Block\Widget\Button\Toolbar">
        <plugin name="MagePal_TestBed::pluginBefore" type="MagePal\TestBed\Plugin\PluginBefore" />
    </type>
</config>

फिर Plugin / PluginBefore.php में

namespace MagePal\TestBed\Plugin;

class PluginBefore
{
    public function beforePushButtons(
        \Magento\Backend\Block\Widget\Button\Toolbar\Interceptor $subject,
        \Magento\Framework\View\Element\AbstractBlock $context,
        \Magento\Backend\Block\Widget\Button\ButtonList $buttonList
    ) {

        $this->_request = $context->getRequest();
        if($this->_request->getFullActionName() == 'sales_order_view'){
              $buttonList->add(
                'mybutton',
                ['label' => __('My Button'), 'onclick' => 'setLocation(window.location.href)', 'class' => 'reset'],
                -1
            );
        }

    }
}

विकल्प 2

कंपनी / मॉड्यूल / etc / adminhtml / di.xml में एक प्लगइन बनाएँ

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="\Magento\Sales\Block\Adminhtml\Order\View">
        <plugin name="MagePal_TestBed::pluginBeforeView" type="MagePal\TestBed\Plugin\PluginBeforeView" />
    </type>
</config>

फिर Plugin / PluginBeforeView.php में

namespace MagePal\TestBed\Plugin;

class PluginBeforeView
{

    public function beforeGetOrderId(\Magento\Sales\Block\Adminhtml\Order\View $subject){
        $subject->addButton(
                'mybutton',
                ['label' => __('My Buttion'), 'onclick' => 'setLocation(window.location.href)', 'class' => 'reset'],
                -1
            );

        return null;
    }

}

पूर्ण स्रोत कोड देखें


@ मैंने दूसरा विकल्प आज़माया है, और यह एक त्रुटि का कारण बनता है - Warning: call_user_func_array() expects parameter 2 to be array, object given in D:\new\OpenServer\domains\graffiticaps-m2.loc\vendor\magento\framework\Interception\Interceptor.php on line 144चूंकि __callPlugin () विधि beforeGetOrderId()विधि के तर्कों पर वापस आती है getOrderId()। \ वेंडर \ magento \ फ्रेमवर्क \ अवरोधन \ Interceptor.php [लाइन 124] - $arguments = $beforeResult;। इसलिए मुझे लगता है कि
स्मथ को

1
मैं सिर्फ Magento 2.0.2 पर परीक्षण करता हूं ... विकल्प # 2 के लिए मेरे अपडेट पर एक नज़र डालें .... github.com/magepal/stackexchange/tree/develop/91071
रेनॉन स्टीवर्ट

क्या इस बटन के क्लिक पर अजाक्स को कॉल करने का कोई तरीका है?
नौवस

@ विस्व ... आप 'onclick' को 'onclick = "processAjax ()" "में बदल सकते हैं, फिर आपको वहाँ ajax फंक्शन जोड़ेंगे या क्लिक jquery बाइंडिंग पर कुछ और
Renon Stewart

यहाँ एक ऐसा ही मुद्दा है। magento.stackexchange.com/questions/251458/…
सैयद

9

DI फाइल बनाएं app/code/YourVendor/YourModule/etc/di.xml:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="SalesOrderViewWidgetContext" type="\Magento\Backend\Block\Widget\Context">
        <arguments>
            <argument name="buttonList" xsi:type="object">YourVendor\YourModule\Block\Adminhtml\Order\View\ButtonList
            </argument>
        </arguments>
    </virtualType>
    <type name="Magento\Sales\Block\Adminhtml\Order\View">
        <arguments>
            <argument name="context" xsi:type="object">SalesOrderViewWidgetContext</argument>
        </arguments>
    </type>
</config>

हम यहाँ क्या करते हैं:

  1. ब्लॉक contextमें कस्टम तर्क सेट करें Order\View। इस संदर्भ को एक आभासी प्रकार के रूप में परिभाषित किया गया है।
  2. एक विजेट संदर्भ के लिए आभासी प्रकार को परिभाषित करें। हम buttonListअपने स्वयं के बटन सूची वर्ग के साथ कस्टम तर्क सेट करते हैं ।

अपने बटन सूची वर्ग को लागू करें:

<?php
namespace YourVendor\YourModule\Block\Adminhtml\Order\View;

class ButtonList extends \Magento\Backend\Block\Widget\Button\ButtonList
{
   public function __construct(\Magento\Backend\Block\Widget\Button\ItemFactory $itemFactory)
   {
       parent::__construct($itemFactory);
       $this->add('mybutton', [
           'label' => __('My button label')
       ]);
   }
}

1
इस समाधान के लिए धन्यवाद! मुझे लगता है कि यह सबसे अच्छा और सबसे सुंदर है।
eInyzant

यह अच्छा, सुरुचिपूर्ण और समझने में आसान लग रहा था लेकिन दुर्भाग्य से यह काम नहीं करता है। मैगेंटो 2.3.4 में एक आदेश में क्लिक करने पर, यह एक त्रुटि फेंकता हैException occurred during order load
जियाननी डि फाल्को

4

यह सबसे अच्छा समाधानों में से एक है जो मैंने अब तक प्लगइन्स का उपयोग किए बिना देखा है

MagePal / CustomButton / देखने / adminhtml / लेआउट / sales_order_view.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="sales_order_edit">
            <block class="MagePal\CustomButton\Block\Adminhtml\Order\View\Buttons" name="custom_buttons">
                <action method="addButtons"/>
            </block>
        </referenceBlock>
    </body>
</page>

MagePal / CustomButton / ब्लॉक / Adminhtml / आदेश / देखें / Buttons.php

namespace MagePal\CustomButton\Block\Adminhtml\Order\View;

class Buttons extends \Magento\Sales\Block\Adminhtml\Order\View
{    
    public function __construct(
        \Magento\Backend\Block\Widget\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Sales\Model\Config $salesConfig,
        \Magento\Sales\Helper\Reorder $reorderHelper,
        array $data = []
    ) {
        parent::__construct($context, $registry, $salesConfig, $reorderHelper, $data);
    }

    public function addButtons()
    {
        $parentBlock = $this->getParentBlock();

        if(!$parentBlock instanceof \Magento\Backend\Block\Template || !$parentBlock->getOrderId()) {
            return;
        }

        $buttonUrl = $this->_urlBuilder->getUrl(
            'adminhtml/custombutton/new',
            ['order_id' => $parentBlock->getOrderId()]
        );

        $this->getToolbar()->addChild(
              'create_custom_button',
              \Magento\Backend\Block\Widget\Button::class,
              ['label' => __('Custom Button'), 'onclick' => 'setLocation(\'' . $buttonUrl . '\')']
            );
        }
        return $this;
    }

}

इसमें गलती adminhtml_sales_order_view.xmlहोनी चाहिएsales_order_view.xml
ज़हीरबास

इसमें कोई जरूरत नहीं हैpublic function __construct
सेरीही कोवल

2

निम्नलिखित स्थान पर di.xml बनाएँ

एप्लिकेशन / कोड / लर्निंग / RewriteSales / etc / di.xml

सामग्री होनी चाहिए

<? xml संस्करण = "1.0"?>
<config xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: ढांचा: ObjectManager / etc / config.xsd">
    <टाइप नाम = "Magento \ Backend \ Block \ Widget \ Context">
        <प्लगइन का नाम = "add_custom_button_sales_veiw" प्रकार = "लर्निंग \ रिवर्टसेल्स \ प्लगिन \ विजेट \ प्रसंग" सॉर्टऑर्डर = "1" />
    </ प्रकार>
</ Config>

निम्नलिखित संचलन का संदर्भ बनाएं

एप्लिकेशन / कोड / लर्निंग / RewriteSales / प्लगइन / विजेट / Context.php

सामग्री होनी चाहिए

namepace Learning \ RewriteSales \ Plugin \ विजेट;


वर्ग प्रसंग
{
    सार्वजनिक समारोह afterGetButtonList (
        \ Magento \ Backend \ Block \ Widget \ प्रसंग $ विषय,
        $ buttonList
    )
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
        $ अनुरोध = $ objectManager-> get ('Magento \ Framework \ App \ Action \ Context') -> getRequest ();
        अगर ($ अनुरोध-> getFullActionName () == 'sales_order_view') {
            $ ButtonList-> ऐड (
                'Custom_button',
                [
                    'लेबल' => __ ('कस्टम बटन'),
                    'onclick' => 'setLocation (\' ')। $ इस-> getCustomUrl ())।' '' ',।
                    'वर्ग' => 'जहाज'
                ]
            );
        }

        $ बटन लौटाएं;
    }

    सार्वजनिक समारोह getCustomUrl ()
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
        $ urlManager = $ objectManager-> get ('Magento \ Framework \ Url');
        वापसी $ urlManager-> getUrl ('बिक्री / * / कस्टम');
    }
}

Magento के कैश को साफ़ करें और अपडेट कमांड चलाएं

php बिन / Magento सेटअप: उन्नयन

मुझे सही करें अगर मैं गलत हूं, लेकिन मेरे सभी परीक्षण से अब तक का preferenceप्रकार मैगनेटो में फिर से लिखना के बराबर है। इसलिए केवल एक मॉड्यूल इसका लाभ उठा सकता है
रेनॉन स्टीवर्ट

हाँ। लेकिन आप संरक्षित फ़ंक्शन के लिए प्लगइन नहीं बना सकते हैं।
सोहेल राणा

प्लगिन का उपयोग करके बस मेरे उत्तर को अपडेट करें
सोहेल राणा

1
ऑब्जेक्ट मैनजर को लोड करने के बजाय आप कर सकते हैं$subject->getRequest()->getFullActionName()
स्टीवर्ट

afterGetButtonList फ़ंक्शन ....... संरक्षित $ urlBuider से पहले इसे जोड़ें; सार्वजनिक फ़ंक्शन } फिर getCustomUrl () फ़ंक्शन में केवल इस लाइन को जोड़ें ..... $ $ इस लौटाएं-> urlBuilder-> getUrl ('modulename / नियंत्रक नाम / पद्धति का नाम', अरै ('पैरामीटर' => पैरामीटर_वल्यू);
KA9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.