Magento 2はバックエンドにボタンを追加します


7

cmsページ編集ビューのバックエンドに別のボタンを追加したいのですが。だから私はモジュールを作成しました(https://community.magento.com/t5/Programming-Questions/Overriding-a-block-in-Magento-2/mp/6831の助けを借りて):

app / code / Company / Modulename / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Company_Modulename" schema_version="0.0.1" setup_version="0.0.1">
        <sequence>
            <module name="Magento_Cms" />
        </sequence>
    </module>
</config>

app / code / Company / Modulename / etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Cms\Block\Adminhtml\Page\Edit" type="Company\Modulename\Block\Adminhtml\Page\Edit" />
</config>

app / code / Company / Modulename / Block / Adminhtml / Page / Edit.php

<?php
namespace Company\Modulename\Block\Adminhtml\Page;

class Edit extends Magento\Cms\Block\Adminhtml\Page\Edit {

    protected function _construct()
    {
        parent::_construct();

        $this->buttonList->add('Test',[
            'label' => __('Test')
        ]);
    }
}

そしてそれをapp / etc / config.phpファイルに追加します:'Company_Modulename' => 1

しかし、これは私にエラーを与えます: Fatal error: Class 'Company\Modulename\Block\Adminhtml\Page\Magento\Cms\Block\Adminhtml\Page\Edit' not found in C:\git-projects\magento2\app\code\Company\Modulename\Block\Adminhtml\Page\Edit.php on line 4

app / code / Magento / Cms / Block / Adminhtml / Page / Edit.phpファイルは次で始まるので、他のものを参照する必要がありますか

namespace Magento\Cms\Block\Adminhtml\Page;
class Edit extends \Magento\Backend\Block\Widget\Form\Container

そして、これはMagento 2でこれを達成する最もきれいな方法ですか?

回答:


5

問題があることをMagento\Cms\Block\Adminhtml\Page\Edit {あなたが宣言した名前空間を使用していることはMagento\Cms\Block\Adminhtml\Page\EditそうなりましたCompany\Modulename\Block\Adminhtml\Page\Magento\Cms\Block\Adminhtml\Page\Edit

拡張クラスの前に\がないため、現在の名前空間を使用しない-次に

class Edit extends \Magento\Cms\Block\Adminhtml\Page\Edit {

これでエラーが修正されますが、これを行うにはもっと良い方法があるかもしれません。


バックスラッシュを1つ逃しただけです。ありがとうございます。より良い方法でこれを行うための提案は大歓迎です!
ロイ、

4

あなたのケースで設定を宣言するよりもプラグインを使用する方が良いです。主な利点は、別の拡張機能が同じ機能を変更または拡張しようとしても、競合が発生しないことです。各クラス/インターフェースに対してアクティブな設定は1つしか存在できないことに注意してください。優先順位は、マージされた最終的なmodule.xmlのシーケンスに従って定義されます。

コアインターフェイスのカスタム実装を提供する必要がある場合は、設定を使用する必要があります。


いいですね!それについて詳しく説明します。ありがとう!
ロイ

3

\ Magento \ Backend \ Block \ Widget \ Containerに次のものが存在\Magento\Cms\Block\Adminhtml\Page\EditするbeforeSetLayoutため、使用時にプラグインで実行できます。

protected function _prepareLayout()
{
    $this->toolbar->pushButtons($this, $this->buttonList);
    return parent::_prepareLayout();
}

メソッドでbeforeSetLayout使用$subject->addButton()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.