A solução mais limpa que vi até agora é usar um plug-in direcionado para 'beforeSetLayout'
Isso pode direcionar o bloco exato, salvando a verificação da solicitação atual e também evita que o plug-in esteja em 'getOrderId', que no meu caso não pôde ser usado, pois eu precisava chamar getOrderId no meu método de plug-in.
Então isso em di.xml
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
E então isso no arquivo 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}')"
]
);
}
Depois de tentar muitas maneiras diferentes, esta é a única solução que eu acho que parece funcionar sem afetar outros módulos. Eu adoraria ver outras soluções.
Opção 1
Crie um plug-in em Company / Module / etc / adminhtml / di.xml
Em seguida, em Plugin / PluginBefore.php
opção 2
Crie um plug-in em Company / Module / etc / adminhtml / di.xml
Em seguida, em Plugin / PluginBeforeView.php
Ver código fonte completo
fonte
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
, já que obeforeGetOrderId()
método __callPlugin () adiciona o método que retorna aos argumentos dogetOrderId()
método. \ vendor \ magento \ framework \ Interceptação \ Interceptor.php [linha 124] -$arguments = $beforeResult;
. Então, eu acho que deve ser devolvido smth mais, mas não objeto, ou seja, $ subjectCriar arquivo DI
app/code/YourVendor/YourModule/etc/di.xml
::O que fazemos aqui é:
context
argumento personalizado noOrder\View
bloco. Este contexto é definido como um tipo virtual.buttonList
argumentos personalizados com nossa própria classe de lista de botões.Implemente sua classe de lista de botões:
fonte
Exception occurred during order load
Esta é uma das melhores soluções que eu já vi até agora sem usar plugins
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
fonte
adminhtml_sales_order_view.xml
deve sersales_order_view.xml
public function __construct
Crie di.xml a seguir local
O conteúdo deve ser
Criar Context.php após loaction
O conteúdo deve ser
Limpar cache do Magento e executar o comando update
fonte
preference
tipo é o equivalente a reescrita em Magento 1. Portanto apenas um módulo pode tirar proveito dela$subject->getRequest()->getFullActionName()