一部のイベントはプラグインの代わりに削除されたため、magento2の注文ビューにカスタムボタンを追加する方法。
- 一部のイベントを削除しました(代わりにプラグインを使用する必要があります):
- adminhtml_widget_container_html_before(magento 1.xで使用)
- admin_session_user_logout
- model_config_data_save_before
- ...
一部のイベントはプラグインの代わりに削除されたため、magento2の注文ビューにカスタムボタンを追加する方法。
回答:
これまでに見た最もクリーンなソリューションは、「beforeSetLayout」をターゲットとするプラグインを使用することです
これは正確なブロックをターゲットにして現在のリクエストのチェックを保存し、プラグインメソッドでgetOrderIdを呼び出す必要があるために私の場合には使用できなかった 'getOrderId'にプラグインが置かれるのを防ぎます。
したがって、これはdi.xmlで
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="addMyButton" type="My\Module\Plugin\Block\Adminhtml\Order\View"/>
</type>
そして、これはファイル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}')"
]
);
}
多くの異なる方法を試した後、これが他のモジュールに影響を与えずに機能するように見える唯一の解決策です。私は他の解決策を見たいです。
オプション1
Company / Module / etc / adminhtml / di.xmlにプラグインを作成します
<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\Button\Toolbar">
<plugin name="MagePal_TestBed::pluginBefore" type="MagePal\TestBed\Plugin\PluginBefore" />
</type>
</config>
次に、Plugin / PluginBefore.php
namespace MagePal\TestBed\Plugin;
class PluginBefore
{
public function beforePushButtons(
\Magento\Backend\Block\Widget\Button\Toolbar\Interceptor $subject,
\Magento\Framework\View\Element\AbstractBlock $context,
\Magento\Backend\Block\Widget\Button\ButtonList $buttonList
) {
$this->_request = $context->getRequest();
if($this->_request->getFullActionName() == 'sales_order_view'){
$buttonList->add(
'mybutton',
['label' => __('My Button'), 'onclick' => 'setLocation(window.location.href)', 'class' => 'reset'],
-1
);
}
}
}
オプション2
Company / Module / etc / adminhtml / di.xmlにプラグインを作成します
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="\Magento\Sales\Block\Adminhtml\Order\View">
<plugin name="MagePal_TestBed::pluginBeforeView" type="MagePal\TestBed\Plugin\PluginBeforeView" />
</type>
</config>
次に、Plugin / PluginBeforeView.php
namespace MagePal\TestBed\Plugin;
class PluginBeforeView
{
public function beforeGetOrderId(\Magento\Sales\Block\Adminhtml\Order\View $subject){
$subject->addButton(
'mybutton',
['label' => __('My Buttion'), 'onclick' => 'setLocation(window.location.href)', 'class' => 'reset'],
-1
);
return null;
}
}
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
、__ callPlugin()メソッドがbeforeGetOrderId()
メソッドの引数に返すメソッドを追加するため、エラーが発生しますgetOrderId()
。\ vendor \ magento \ framework \ Interception \ Interceptor.php [124行目]- $arguments = $beforeResult;
。だから私は他のものは返さなければならないが、オブジェクトではなく、$ subjectを返す必要があると思います
DIファイルを作成app/code/YourVendor/YourModule/etc/di.xml
::
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="SalesOrderViewWidgetContext" type="\Magento\Backend\Block\Widget\Context">
<arguments>
<argument name="buttonList" xsi:type="object">YourVendor\YourModule\Block\Adminhtml\Order\View\ButtonList
</argument>
</arguments>
</virtualType>
<type name="Magento\Sales\Block\Adminhtml\Order\View">
<arguments>
<argument name="context" xsi:type="object">SalesOrderViewWidgetContext</argument>
</arguments>
</type>
</config>
ここで行うことは次のとおりです。
context
引数をOrder\View
ブロックに設定します。このコンテキストは仮想タイプとして定義されます。buttonList
独自のボタンリストクラスでカスタム引数を設定します。ボタンリストクラスを実装します。
<?php
namespace YourVendor\YourModule\Block\Adminhtml\Order\View;
class ButtonList extends \Magento\Backend\Block\Widget\Button\ButtonList
{
public function __construct(\Magento\Backend\Block\Widget\Button\ItemFactory $itemFactory)
{
parent::__construct($itemFactory);
$this->add('mybutton', [
'label' => __('My button label')
]);
}
}
Exception occurred during order load
これは、プラグインを使用せずにこれまでに見た中で最高のソリューションの1つです
MagePal / CustomButton / view / adminhtml / layout / sales_order_view.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="sales_order_edit">
<block class="MagePal\CustomButton\Block\Adminhtml\Order\View\Buttons" name="custom_buttons">
<action method="addButtons"/>
</block>
</referenceBlock>
</body>
</page>
MagePal / CustomButton / Block / Adminhtml / Order / View / Buttons.php
namespace MagePal\CustomButton\Block\Adminhtml\Order\View;
class Buttons extends \Magento\Sales\Block\Adminhtml\Order\View
{
public function __construct(
\Magento\Backend\Block\Widget\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Sales\Model\Config $salesConfig,
\Magento\Sales\Helper\Reorder $reorderHelper,
array $data = []
) {
parent::__construct($context, $registry, $salesConfig, $reorderHelper, $data);
}
public function addButtons()
{
$parentBlock = $this->getParentBlock();
if(!$parentBlock instanceof \Magento\Backend\Block\Template || !$parentBlock->getOrderId()) {
return;
}
$buttonUrl = $this->_urlBuilder->getUrl(
'adminhtml/custombutton/new',
['order_id' => $parentBlock->getOrderId()]
);
$this->getToolbar()->addChild(
'create_custom_button',
\Magento\Backend\Block\Widget\Button::class,
['label' => __('Custom Button'), 'onclick' => 'setLocation(\'' . $buttonUrl . '\')']
);
}
return $this;
}
}
adminhtml_sales_order_view.xml
はずですsales_order_view.xml
public function __construct
次の場所にdi.xmlを作成します
app / code / Learning / RewriteSales / etc / di.xml
コンテンツは
<?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>
loactionに従ってContext.phpを作成します
app / code / Learning / RewriteSales / Plugin / Widget / Context.php
コンテンツは
名前空間Learning \ RewriteSales \ Plugin \ Widget; クラスContext { パブリック関数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' => __( 'Custom Button')、 'onclick' => 'setLocation(\' '。$ this-> getCustomUrl()。' \ ')'、 'クラス' => '船' ] ); } $ buttonListを返します。 } パブリック関数getCustomUrl() { $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance(); $ urlManager = $ objectManager-> get( 'Magento \ Framework \ Url'); $ urlManager-> getUrl( 'sales / * / custom');を返します。 } }
Magentoのキャッシュをクリアして更新コマンドを実行する
php bin / magento setup:upgrade
preference
タイプはmagento 1での書き換えに相当します。したがって、1つのモジュールのみがそれを利用できます
$subject->getRequest()->getFullActionName()