Najczystszym rozwiązaniem, jakie do tej pory widziałem, jest użycie wtyczki kierowanej na „beforeSetLayout”
Może to być ukierunkowane na dokładny blok, zapisując czek dla bieżącego żądania, a także pozwala uniknąć wtyczki na „getOrderId”, która w moim przypadku nie mogłaby zostać użyta, ponieważ musiałem wywołać getOrderId w mojej metodzie wtyczki.
Więc to w di.xml
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
A potem to w pliku 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}')"
]
);
}
Po wypróbowaniu wielu różnych sposobów jest to jedyne rozwiązanie, które wydaje mi się, że działa bez wpływu na inne moduły. Chciałbym zobaczyć inne rozwiązania.
opcja 1
Utwórz wtyczkę w Company / Module / etc / adminhtml / di.xml
Następnie w Plugin / PluginBefore.php
Opcja 2
Utwórz wtyczkę w Company / Module / etc / adminhtml / di.xml
Następnie w Plugin / PluginBeforeView.php
Zobacz pełny kod źródłowy
źródło
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
ponieważ metoda __callPlugin () dodaje, którabeforeGetOrderId()
metoda zwraca argumentygetOrderId()
metody. \ vendor \ magento \ framework \ Interception \ Interceptor.php [linia 124] -$arguments = $beforeResult;
. Myślę więc, że trzeba zwrócić coś innego, ale nie przedmiot, co oznacza $ podmiotUtwórz plik DI
app/code/YourVendor/YourModule/etc/di.xml
:Co robimy tutaj to:
context
argument wOrder\View
bloku. Ten kontekst jest zdefiniowany jako typ wirtualny.buttonList
argument za pomocą naszej własnej klasy listy przycisków.Zaimplementuj klasę listy przycisków:
źródło
Exception occurred during order load
To jedno z najlepszych rozwiązań, jakie do tej pory widziałem bez użycia wtyczek
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
źródło
adminhtml_sales_order_view.xml
powinna byćsales_order_view.xml
public function __construct
Utwórz di.xml następującą lokalizację
Treść powinna być
Utwórz Context.php po pętli
Treść powinna być
Wyczyść pamięć podręczną Magento i uruchom polecenie aktualizacji
źródło
preference
typ jest odpowiednikiem przepisywania w magento 1. Dlatego tylko jeden moduł może z niego skorzystać$subject->getRequest()->getFullActionName()