Magento2 এ অ্যাডমিন বিক্রয় অর্ডার ভিউতে কীভাবে কাস্টম বোতাম যুক্ত করবেন


13

এখানে চিত্র বর্ণনা লিখুন

ম্যাজেন্টো 2-তে বিক্রয় অর্ডার ভিউতে কাস্টম বোতাম কীভাবে যুক্ত করা যায়, যেহেতু কিছু ইভেন্ট প্লাগইনের পক্ষে সরিয়ে ফেলা হয়েছিল।

  • কিছু ইভেন্ট সরানো হয়েছে (পরিবর্তে প্লাগইন ব্যবহার করা উচিত):

দেখুন Magento2 লগিন পরিবর্তন করুন

উত্তর:


19

আমি এখনও অবধি সবচেয়ে পরিষ্কার সমাধানটি হ'ল 'সেটলআউট'-এর আগে একটি প্লাগইন লক্ষ্যবস্তু ব্যবহার করা is

এটি বর্তমানের অনুরোধটির জন্য চেক সংরক্ষণ করে সঠিক ব্লকটিকে লক্ষ্যবস্তু করতে পারে এবং 'getOrderId' এ থাকা প্লাগইনটিকে এড়িয়ে যায় যা আমার ক্ষেত্রে আমার প্লাগইন পদ্ধতিতে getOrderId কল করার প্রয়োজন হিসাবে ব্যবহার করা যায়নি।

তাই এটি di.xml এ

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

এবং তারপরে ফাইলটি আমার \ মডিউল \ প্লাগইন \ ব্লক \ প্রশাসন \ আদেশ \ 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

সংস্থা / মডিউল / ইত্যাদি / প্রশাসনিক / 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>

তারপরে প্লাগইন / প্লাগইনবিফোর.এফপি

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

সংস্থা / মডিউল / ইত্যাদি / প্রশাসনিক / 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>

তারপরে প্লাগইন / প্লাগইনবিফরভিউ.এফপি

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

}

দেখুন ফুল সোর্স কোড


@rs আমি ২ য় বিকল্প চেষ্টা করে দেখেছি এবং এটি একটি ত্রুটি ঘটায় - 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()। \ বিক্রেতা \ ম্যাজেন্টো \ কাঠামো \ বাধা \ Interceptor.php [লাইন 124] - $arguments = $beforeResult;। সুতরাং আমি মনে করি সেখানে অবশ্যই অন্য কোনও ফেরত আসতে হবে, তবে আপত্তি নয়, অর্থ
কেট সুয়কভস্কায়া

1
আমি কেবল ম্যাজেন্টো ২.০.২ এ পরীক্ষা করেছি ... বিকল্প # 2 এর জন্য আমার আপডেটটি একবার দেখুন ... দেখুন github.com/magepal/stackexchange/tree/develop/91071
রেনন স্টুয়ার্ট

এই বোতামটি ক্লিক করে আজাক্স কল করার কোনও উপায় আছে কি?
nuwaus

@ নওয়াউস ... আপনি 'অনক্লিক' কে 'অনক্লিক = "প্রসেসএজ্যাক্স ()" "এ পরিবর্তন করতে পারেন তবে সেখানে জাজেরি আবদ্ধকরণে আপনাকে অ্যাজাক্স ফাংশন যুক্ত করতে পারেন
রেনন স্টুয়ার্ট

এখানে একটি অনুরূপ ইস্যু। magento.stackexchange.com/questions/251458/…
আজওয়াদ সৈয়দ

9

ডিআই ফাইল তৈরি করুন 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
এই সমাধানের জন্য আপনাকে ধন্যবাদ! আমি মনে করি এটি সেরা এবং সবচেয়ে মার্জিত।
ইনিজান্ট

এটি দেখতে সুন্দর, মার্জিত এবং সহজে বোঝার সহজ লাগছিল তবে দুর্ভাগ্যক্রমে এটি কার্যকর হয় না। ম্যাজেন্টো ২.৩.৪ এ যখন কোনও অর্ডারে ক্লিক করার সময় এটি একটি ত্রুটি ছুড়ে দেয়Exception occurred during order load
Gianni Di Falco

3

প্লাগিন ব্যবহার না করে আমি এখন অবধি দেখে নেওয়া সেরা সমাধানগুলির মধ্যে এটি

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 / ORDER / দেখুন / 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

বিষয়বস্তু হওয়া উচিত

<? এক্সএমএল সংস্করণ = "1.0"?>
<কনফিগারেশন xMLns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: ফ্রেমওয়ার্ক: অবজেক্টম্যানেজার / ইত্যাদি / config.xsd">
    <প্রকারের নাম = "ম্যাজেন্টো \ ব্যাকএন্ড \ ব্লক \ উইজেট \ প্রসঙ্গ">
        <প্লাগইন নাম = "add_custom_button_sales_veiw" টাইপ = "শেখা \ RewritSales \ প্লাগইন \ উইজেট \ প্রসঙ্গ" সাজানো অর্ডার = "1" />
    </ টাইপ>
</ কনফিগ>

নিবন্ধটি অনুসরণ করে Context.php তৈরি করুন

অ্যাপ্লিকেশন / কোড / শিক্ষণ / RewriteSales / প্লাগইন / উইজেট / Context.php

বিষয়বস্তু হওয়া উচিত

নেমস্পেস লার্নিং \ রিরাইটসেলস \ প্লাগইন \ উইজেট;


ক্লাস প্রসঙ্গ
{
    গেটবটনলিস্টের পরে সর্বজনীন অনুষ্ঠান (
        \ ম্যাজেন্টো \ ব্যাকএন্ড \ ব্লক \ উইজেট \ প্রসঙ্গ $ বিষয়,
        $ buttonList
    )
    {
        $ অবজেক্টম্যানেজার = \ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ অ্যাপ \ অবজেক্ট ম্যানেজার :: getInstance ();
        $ অনুরোধ = $ অবজেক্ট ম্যানেজার-> পান ('ম্যাজেন্টো me ফ্রেমওয়ার্ক \ অ্যাপ \ ক্রিয়া \ প্রসঙ্গ') -> getRequest ();
        যদি ($ অনুরোধ-> getFullActionName () == 'বিক্রয়_ অর্ডার_ভিউ') {
            $ ButtonList-> যুক্ত করুন (
                'Custom_button',
                [
                    'লেবেল' => __ ('কাস্টম বোতাম'),
                    'onclick' => 'setLocation (\' '। $ this-> getCustomUrl ()।' \ ')',
                    'শ্রেণি' => 'জাহাজ'
                ]
            );
        }

        ফিরে $ বাটনলিস্ট;
    }

    পাবলিক ফাংশন getCustomUll ()
    {
        $ অবজেক্টম্যানেজার = \ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ অ্যাপ \ অবজেক্ট ম্যানেজার :: getInstance ();
        ; urlManager = $ অবজেক্ট ম্যানেজার-> পান ('ম্যাজেন্টো me ফ্রেমওয়ার্ক \ ইউআর');
        রিটার্ন $ urlManager-> getUrl ('বিক্রয় / * / কাস্টম');
    }
}

ম্যাজেন্টো ক্যাশে সাফ করুন এবং আপডেট কমান্ড রান করুন

পিএইচপি বিন / ম্যাজেন্টো সেটআপ: আপগ্রেড

আমি ভুল হলে আমাকে সংশোধন করুন, তবে এখন পর্যন্ত আমার সমস্ত পরীক্ষার থেকে preferenceটাইপ করা ম্যাজেন্টো ১-এ পুনরায় লেখার সমতুল্য Therefore সুতরাং কেবলমাত্র একটি মডিউল এটির সুবিধা নিতে পারে
রেনন স্টুয়ার্ট

হ্যাঁ. তবে আপনি সুরক্ষিত ফাংশনের জন্য প্লাগইন তৈরি করতে পারবেন না।
সোহেল রানা

প্লাগইন ব্যবহার করে আমার উত্তরটি আপডেট করুন
সোহেল রানা

1
অবজেক্ট ম্যানেজারটি লোড করার পরিবর্তে আপনি করতে পারতেন$subject->getRequest()->getFullActionName()
রেনন স্টুয়ার্ট

GETButtonList ফাংশন এর আগে এটি যুক্ত করুন ....... সুরক্ষিত $ urlBuider; পাবলিক ফাংশন __ কনস্ট্রাক্ট (\ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ UrlInterface $ urlUulder) {$ this-> urlBuilder = $ urlUulder; } তারপরে getCustomUrl () ফাংশনে এই লাইনটি কেবল যুক্ত করুন ..... ফিরুন $ এটি-> urlBuilder-> getUrl ('মডিউল নাম / নিয়ামক নাম / পদ্ধতি নাম', অ্যারে ('প্যারামিটার' => প্যারামিটার_ভ্যালু)));
কেএ 9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.