Самое чистое решение, которое я видел до сих пор, - это использовать плагин с таргетингом 'beforeSetLayout'
Это может быть нацелено на конкретный блок, сохраняя проверку текущего запроса, а также позволяет избежать использования подключаемого модуля '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}')"
]
);
}
Попробовав много разных способов, это единственное решение, которое я смог найти, которое, кажется, работает, не затрагивая другие модули. Я хотел бы увидеть другие решения.
Опция 1
Создайте плагин в Company / Module / etc / adminhtml / di.xml
Затем в плагин / PluginBefore.php
Вариант 2
Создайте плагин в Company / Module / etc / adminhtml / di.xml
Затем в плагин / PluginBeforeView.php
Смотрите полный исходный код
источник
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()
метода. \ vendor \ magento \ framework \ Interception \ Interceptor.php [строка 124] -$arguments = $beforeResult;
. Поэтому я думаю, что должно быть возвращено что-то еще, но не объект, то есть $ subjectСоздать DI-файл
app/code/YourVendor/YourModule/etc/di.xml
::Что мы делаем здесь:
context
аргумент вOrder\View
блок. Этот контекст определяется как виртуальный тип.buttonList
аргумент с нашим собственным классом списка кнопок.Реализуйте свой класс списка кнопок:
источник
Exception occurred during order load
Это одно из лучших решений, которые я видел до сих пор без использования плагинов.
MagePal / CustomButton / просмотреть / adminhtml / макет / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
источник
adminhtml_sales_order_view.xml
должна быть ошибкаsales_order_view.xml
public function __construct
Создать di.xml следующую локацию
Содержание должно быть
Создать Context.php после loaction
Содержание должно быть
Очистить кеш Magento и запустить команду обновления
источник
preference
тип является эквивалентом перезаписи в magento 1. Поэтому только один модуль может воспользоваться этим$subject->getRequest()->getFullActionName()