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:
contextargumento personalizado en elOrder\Viewbloque. Este contexto se define como un tipo virtual.buttonListargumentos personalizados con nuestra propia clase de lista de botones.Implemente su clase de lista de botones:
fuente
Exception occurred during order loadEsta 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.xmldebería sersales_order_view.xmlpublic function __constructCrear di.xml siguiente ubicación
El contenido debe ser
<? xml version = "1.0"?> <config xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: framework: ObjectManager / etc / config.xsd"> <type name = "Magento \ Backend \ Block \ Widget \ Context"> <plugin name = "add_custom_button_sales_veiw" type = "Learning \ RewriteSales \ Plugin \ Widget \ Context" sortOrder = "1" /> </type> </config>Crear Context.php después de la ubicación
El contenido debe ser
Aprendizaje del espacio de nombres \ RewriteSales \ Plugin \ Widget; Contexto de clase { función pública afterGetButtonList ( \ Magento \ Backend \ Block \ Widget \ Context $ subject, $ buttonList ) { $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ request = $ objectManager-> get ('Magento \ Framework \ App \ Action \ Context') -> getRequest (); if ($ request-> getFullActionName () == 'sales_order_view') { $ buttonList-> add ( 'custom_button', [ 'label' => __ ('Botón personalizado'), 'onclick' => 'setLocation (\' '. $ this-> getCustomUrl ().' \ ')', 'class' => 'barco' ] ); } return $ buttonList; } función pública getCustomUrl () { $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ urlManager = $ objectManager-> get ('Magento \ Framework \ Url'); return $ urlManager-> getUrl ('ventas / * / personalizado'); } }Borrar el caché de Magento y ejecutar el comando de actualización
fuente
preferencetipo es el equivalente a reescribir en magento 1. Por lo tanto, solo un módulo puede aprovecharlo$subject->getRequest()->getFullActionName()