Magento2'de Yönetici Müşteri Siparişi Görünümüne Özel Düğme Ekleme


13

resim açıklamasını buraya girin

Magento2'deki müşteri siparişi görünümüne özel bir düğme nasıl eklenir, çünkü bazı etkinlikler eklentilerin lehine kaldırıldı.

  • Bazı etkinlikler kaldırıldı (bunun yerine eklentiler kullanılmalıdır):

Bkz Magento2 Değişikliği Günlüğü

Yanıtlar:


19

Şimdiye kadar gördüğüm en temiz çözüm, 'beforeSetLayout'u hedefleyen bir eklenti kullanmaktır

Bu, geçerli bloğu kontrol ederek tam bloğu hedefleyebilir ve eklentinin 'getOrderId' üzerinde olmasını önler, bu da benim durumumda eklenti yöntemimde getOrderId'i çağırmak için gerektiği gibi kullanılamaz.

Yani bu di.xml'de

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

Ve sonra bu benim \ Module \ Plugin \ Block \ Adminhtml \ Order \ View.php dosyasında

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}')"
        ]
    );


}

Bir cazibe gibi çalıştı
Raul Sanchez

17

Birçok farklı yolu denedikten sonra, diğer modülleri etkilemeden işe yaradığı görülen tek çözüm budur. Başka çözümler görmek isterim.

seçenek 1

Şirket / Modül / etc / adminhtml / di.xml'de bir eklenti oluşturun

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

Sonra Plugin / PluginBefore.php içinde

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

    }
}

seçenek 2

Şirket / Modül / etc / adminhtml / di.xml'de bir eklenti oluşturun

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

Sonra Plugin / PluginBeforeView.php içinde

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

}

Tam Kaynak koduna bakın


@rs 2. seçeneği denedim ve bir hataya neden olur - 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çünkü __callPlugin () yöntemi beforeGetOrderId(), getOrderId()yöntemin argümanlarına hangi yöntemin döndürdüğünü ekler . \ vendor \ magento \ framework \ Interception \ Interceptor.php [satır 124] - $arguments = $beforeResult;. Bu yüzden başka bir şey geri döndürmek gerektiğini düşünüyorum, ama nesne değil, $ konu anlamına gelir
Kate Suykovskaya

1
Ben sadece Magento 2.0.2 üzerinde test ediyorum ... Seçenek # 2 için güncellememe bir göz atın .... Bkz. Github.com/magepal/stackexchange/tree/develop/91071
Renon Stewart

Bu butona tıklayarak ajax'ı çağırmanın bir yolu var mı?
Nuwaus

@nuwaus ... 'onclick' değerini 'onclick = "processAjax ()" "olarak değiştirebilir, ardından buraya ajax işlevi ekleyebilir veya tıklama jquery ciltlemesinde başka bir şey ekleyebilirsiniz
Renon Stewart


9

DI dosyası oluştur 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>

Burada yaptığımız şey:

  1. Özel contextbağımsız değişkeni Order\Viewbloğa ayarlayın . Bu bağlam bir sanal tür olarak tanımlanır.
  2. Bir widget içeriği için sanal türü tanımlayın. buttonListKendi düğme listesi sınıfımızla özel argüman ayarladık .

Düğme listesi sınıfınızı uygulayın:

<?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
Bu çözüm için teşekkürler! Bence bu en iyi ve en zarif.
eInyzant

Bu güzel, zarif ve anlaşılması kolay görünüyordu ama maalesef çalışmıyor. Magento 2.3.4'te bir siparişi tıkladığınızda hata verirException occurred during order load
Gianni Di Falco

4

Bu, eklentileri kullanmadan şimdiye kadar gördüğüm en iyi çözümlerden biri

MagePal / CustomButton / görüntülemek / adminhtml / düzeni / 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 / Blok / Adminhtml / Sipariş / Görünüm / 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;
    }

}

Hata içinde var adminhtml_sales_order_view.xmlolmalıdırsales_order_view.xml
Zaheerabbas

Gerek yokpublic function __construct
Serhii Koval

2

Aşağıdaki konumu di.xml oluşturun

Uygulamanın / kod / Öğrenme / RewriteSales / etc / di.xml

İçerik olmalı

<? xml sürüm = "1.0"?>
<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 \ Context">
        <plugin name = "add_custom_button_sales_veiw" type = "Learning \ RewriteSales \ Plugin \ Widget \ Context" sortOrder = "1" />
    </ Type>
</ Config>

Losyondan sonra Context.php oluşturun

Uygulamanın / kod / Öğrenme / RewriteSales / Eklenti / Araç / Context.php

İçerik olmalı

namespace Learning \ RewriteSales \ Plugin \ Widget;


sınıf Bağlam
{
    getButtonList (
        \ Magento \ Backend \ Block \ Widget \ Context $ konusu,
        $ buttonList
    )
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
        $ request = $ objectManager-> get ('Magento \ Framework \ App \ Action \ Context') -> getRequest ();
        if ($ request-> getFullActionName () == 'sales_order_view') {
            $ ButtonList-> add (
                'Custom_button',
                [
                    'label' => __ ('Özel Düğme'),
                    'onclick' => 'setLocation (\' '. $ this-> getCustomUrl ().' \ ')',
                    'class' => 'gemi'
                ]
            );
        }

        return $ buttonList;
    }

    genel işlev getCustomUrl ()
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
        $ urlManager = $ objectManager-> get ('Magento \ Framework \ Url');
        return $ urlManager-> getUrl ('satış / * / özel');
    }
}

Magento önbelleğini temizle ve güncelleme komutunu çalıştır

php bin / magento kurulumu: yükseltme

Yanılıyorsam beni düzeltin, ancak şimdiye kadar yaptığım tüm testlerden preferencemagento 1'de yeniden yazmanın eşdeğeridir. Bu nedenle sadece bir modül bundan faydalanabilir
Renon Stewart

Evet. Ancak korumalı işlev için eklenti oluşturamazsınız.
Sohel Rana

Eklentiyi kullanarak cevabımı güncelle
Sohel Rana

1
Yapabileceğiniz objectManager'ı yüklemek yerine$subject->getRequest()->getFullActionName()
Renon Stewart

afterGetButtonList işlevinden önce ekleyin ....... korumalı $ urlBuider; public function __construct (\ Magento \ Framework \ UrlInterface $ urlBuilder) {$ this-> urlBuilder = $ urlBuilder; } Daha sonra getCustomUrl () işlevinde yalnızca bu satırı ekleyin ..... $ $ bu-> urlBuilder-> getUrl ('modulename / controllername / methodname', array ('parametre' => parametre_değeri));
KA9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.