Die sauberste Lösung, die ich bisher gesehen habe, ist die Verwendung eines Plugins, das auf "beforeSetLayout" abzielt.
Dies kann auf den genauen Block abzielen und die Prüfung für die aktuelle Anforderung speichern. Außerdem wird vermieden, dass sich das Plugin in 'getOrderId' befindet, was in meinem Fall nicht verwendet werden konnte, da ich getOrderId in meiner Plugin-Methode aufrufen musste.
Also das in di.xml
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
Und das dann in der Datei 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}')"
]
);
}
Nachdem ich viele verschiedene Möglichkeiten ausprobiert habe, ist dies die einzige Lösung, die zu funktionieren scheint, ohne andere Module zu beeinflussen. Ich würde gerne andere Lösungen sehen.
Option 1
Erstellen Sie ein Plugin in Company / Module / etc / adminhtml / di.xml
Dann in Plugin / PluginBefore.php
Option 2
Erstellen Sie ein Plugin in Company / Module / etc / adminhtml / di.xml
Dann in Plugin / PluginBeforeView.php
Siehe Vollständiger Quellcode
quelle
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
, da die Methode __callPlugin () hinzufügt, welchebeforeGetOrderId()
Methode zu den Argumenten dergetOrderId()
Methode zurückgibt . \ vendor \ magento \ framework \ Interception \ Interceptor.php [Zeile 124] -$arguments = $beforeResult;
. Also ich denke, es muss etwas anderes zurückgegeben werden, aber kein Objekt, was $ subject bedeutetErstellen DI - Datei:
app/code/YourVendor/YourModule/etc/di.xml
:Was wir hier machen ist:
context
Argument in dasOrder\View
Block. Dieser Kontext ist als virtueller Typ definiert.buttonList
Argumente mit unserer eigenen Schaltflächenlistenklasse.Implementieren Sie Ihre Schaltflächenlistenklasse:
quelle
Exception occurred during order load
Dies ist eine der besten Lösungen, die ich bisher ohne Plugins gesehen habe
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
quelle
adminhtml_sales_order_view.xml
sollte seinsales_order_view.xml
Erstellen Sie die folgende di.xml-Position
Inhalt sollte sein
Erstellen Sie Context.php nach der Aktion
Inhalt sollte sein
Leeren Sie den Magento-Cache und führen Sie den Befehl update aus
quelle
preference
liege , aber nach all meinen bisherigen Tests entspricht der Typ dem Umschreiben in Magento 1. Daher kann nur ein Modul davon profitieren$subject->getRequest()->getFullActionName()