La solution la plus propre que j'ai vue jusqu'à présent est d'utiliser un plugin ciblant 'beforeSetLayout'
Cela peut cibler le bloc exact, enregistrer la vérification de la demande actuelle et éviter également que le plugin ne soit sur 'getOrderId' qui, dans mon cas, ne pouvait pas être utilisé car j'avais besoin d'appeler getOrderId dans ma méthode de plugin.
Donc, cela en di.xml
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
Et puis ceci dans le fichier 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}')"
]
);
}
Après avoir essayé de nombreuses façons différentes, c'est la seule solution que j'ai pu trouver qui semble fonctionner sans affecter les autres modules. J'adorerais voir d'autres solutions.
Option 1
Créez un plugin dans Company / Module / etc / adminhtml / di.xml
Puis dans Plugin / PluginBefore.php
Option 2
Créez un plugin dans Company / Module / etc / adminhtml / di.xml
Puis dans Plugin / PluginBeforeView.php
Voir le code source complet
la source
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
, puisque la méthode __callPlugin () ajoute ce quebeforeGetOrderId()
méthode renvoie à des arguments degetOrderId()
méthode. \ vendor \ magento \ framework \ Interception \ Interceptor.php [ligne 124] -$arguments = $beforeResult;
. Je pense donc qu'il doit être renvoyé ailleurs, mais pas d'objet, ce qui signifie $ subjectCréer un fichier DI
app/code/YourVendor/YourModule/etc/di.xml
::Ce que nous faisons ici, c'est:
context
argument personnalisé dans leOrder\View
bloc. Ce contexte est défini comme un type virtuel.buttonList
argument personnalisé avec notre propre classe de liste de boutons.Implémentez votre classe de liste de boutons:
la source
Exception occurred during order load
C'est l'une des meilleures solutions que j'ai vues jusqu'à présent sans utiliser de plugins
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
la source
adminhtml_sales_order_view.xml
devrait êtresales_order_view.xml
public function __construct
Créer l'emplacement di.xml suivant
Le contenu doit être
Créer Context.php après la loaction
Le contenu doit être
Vider le cache Magento et exécuter la commande de mise à jour
la source
preference
type est l'équivalent de la réécriture dans magento 1. Par conséquent, un seul module peut en profiter$subject->getRequest()->getFullActionName()