La solución más limpia que he visto hasta ahora es usar un complemento dirigido a 'beforeSetLayout'
Esto puede apuntar al bloque exacto, guardar la verificación de la solicitud actual y también evita que el complemento esté en 'getOrderId', que en mi caso no se pudo usar, ya que necesitaba llamar a getOrderId en mi método de complemento.
Entonces esto en di.xml
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
Y luego esto en el archivo 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}')"
]
);
}
Después de probar muchas formas diferentes, esta es la única solución que pude encontrar que parece funcionar sin afectar a otros módulos. Me encantaría ver otras soluciones.
Opción 1
Cree un complemento en Empresa / Módulo / etc / adminhtml / di.xml
Luego en Plugin / PluginBefore.php
opcion 2
Cree un complemento en Empresa / Módulo / etc / adminhtml / di.xml
Luego en Plugin / PluginBeforeView.php
Ver código fuente completo
fuente
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
, ya que el método __callPlugin () agrega québeforeGetOrderId()
método regresa a los argumentos delgetOrderId()
método. \ vendor \ magento \ framework \ Interception \ Interceptor.php [línea 124] -$arguments = $beforeResult;
. Así que creo que debe devolverse algo más, pero no un objeto, lo que significa $ subjectCrear archivo DI
app/code/YourVendor/YourModule/etc/di.xml
::Lo que hacemos aquí es:
context
argumento personalizado en elOrder\View
bloque. Este contexto se define como un tipo virtual.buttonList
argumentos personalizados con nuestra propia clase de lista de botones.Implemente su clase de lista de botones:
fuente
Exception occurred during order load
Esta es una de las mejores soluciones que he visto hasta ahora sin usar complementos
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
fuente
adminhtml_sales_order_view.xml
debería sersales_order_view.xml
public function __construct
Crear di.xml siguiente ubicación
El contenido debe ser
Crear Context.php después de la ubicación
El contenido debe ser
Borrar el caché de Magento y ejecutar el comando de actualización
fuente
preference
tipo es el equivalente a reescribir en magento 1. Por lo tanto, solo un módulo puede aprovecharlo$subject->getRequest()->getFullActionName()