Solusi terbersih yang saya lihat sejauh ini adalah menggunakan plugin yang menargetkan 'beforeSetLayout'
Ini dapat menargetkan blok yang tepat, menyimpan cek untuk permintaan saat ini, dan juga menghindari plugin yang ada di 'getOrderId' yang dalam kasus saya tidak dapat digunakan karena saya perlu memanggil getOrderId dalam metode plugin saya.
Jadi ini di di.xml
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
Dan kemudian ini dalam file 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}')"
]
);
}
Setelah mencoba berbagai cara, ini adalah satu-satunya solusi yang dapat saya temukan yang tampaknya berfungsi tanpa mempengaruhi modul lain. Saya akan senang melihat solusi lain.
Pilihan 1
Buat plugin di Perusahaan / Modul / etc / adminhtml / di.xml
Kemudian di Plugin / PluginBefore.php
pilihan 2
Buat plugin di Perusahaan / Modul / etc / adminhtml / di.xml
Kemudian di Plugin / PluginBeforeView.php
Lihat Kode Sumber Lengkap
sumber
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
, karena metode __callPlugin () menambahkanbeforeGetOrderId()
metode apa yang kembali ke argumengetOrderId()
metode. \ vendor \ magento \ framework \ Interception \ Interceptor.php [baris 124] -$arguments = $beforeResult;
. Jadi saya pikir harus ada yang dikembalikan, tetapi tidak keberatan, yang berarti $ subjekBuat file DI
app/code/YourVendor/YourModule/etc/di.xml
::Apa yang kami lakukan di sini adalah:
context
argumen khusus ke dalamOrder\View
blokir. Konteks ini didefinisikan sebagai tipe virtual.buttonList
argumen khusus dengan kelas daftar tombol kami sendiri.Terapkan kelas daftar tombol Anda:
sumber
Exception occurred during order load
Ini adalah salah satu solusi terbaik yang saya lihat sejauh ini tanpa menggunakan plugin
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
sumber
adminhtml_sales_order_view.xml
seharusnyasales_order_view.xml
public function __construct
Buat di.xml lokasi berikut
Konten seharusnya
Buat Context.php berikut loaction
Konten seharusnya
Hapus cache Magento dan jalankan perintah pembaruan
sumber
preference
ini adalah setara dengan menulis ulang di magento 1. Oleh karena itu hanya satu modul yang dapat memanfaatkannya$subject->getRequest()->getFullActionName()