Magento 2 fügt zusätzliche Schaltfläche im Backend hinzu

7

Ich möchte eine weitere Schaltfläche im Backend der Bearbeitungsansicht der CMS-Seite hinzufügen. Also habe ich ein Modul erstellt (mit Hilfe von: https://community.magento.com/t5/Programming-Questions/Overriding-a-block-in-Magento-2/mp/6831 ):

app / code / Company / Modulname / 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 / Firma / Modulname / 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 / Firma / Modulname / 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')
        ]);
    }
}

Und fügte es der Datei app / etc / config.php hinzu :'Company_Modulename' => 1

Aber das gibt mir einen Fehler: 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

Muss ich auf etwas anderes verweisen, da die Datei app / code / Magento / Cms / Block / Adminhtml / Page / Edit.php mit Folgendem beginnt:

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

Und ist dies der sauberste Weg, dies in Magento 2 zu erreichen?

Roy
quelle

Antworten:

5

Das Problem ist, dass Magento\Cms\Block\Adminhtml\Page\Edit {die Verwendung des von Ihnen deklarierten Namespace Magento\Cms\Block\Adminhtml\Page\Editso wirdCompany\Modulename\Block\Adminhtml\Page\Magento\Cms\Block\Adminhtml\Page\Edit

Sie vermissen ein \ an der Vorderseite der erweiterten Klasse, damit sie nicht den aktuellen Namespace verwendet - das sollten Sie dann haben

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

Das behebt den Fehler - aber es gibt möglicherweise noch einen besseren Weg, dies zu tun.

James Anelay - TheExtensionLab
quelle
Ich habe gerade einen Backslash verpasst, danke! Vorschläge, dies besser zu machen, sind willkommen!
Roy
4

Es ist besser, Plugins zu verwenden, als in Ihrem Fall die Präferenz zu deklarieren. Der Hauptvorteil besteht darin, dass es keine Konflikte gibt, wenn eine andere Erweiterung versucht, dieselbe Funktionalität zu ändern / zu erweitern. Beachten Sie, dass es für jede Klasse / Schnittstelle nur eine aktive Präferenz geben kann. Die Priorität wird gemäß der Reihenfolge in der endgültigen zusammengeführten module.xml definiert

Einstellungen sollten verwendet werden, wenn eine benutzerdefinierte Implementierung der Kernschnittstelle erforderlich ist.

Alex Paliarush
quelle
Das sieht gut aus! Ich werde mich damit befassen. Vielen Dank!
Roy
3

Kann mit einem Plugin durchgeführt \Magento\Cms\Block\Adminhtml\Page\Editwerden, beforeSetLayoutda sich in \ Magento \ Backend \ Block \ Widget \ Container Folgendes befindet:

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

In der Methode beforeSetLayoutverwenden $subject->addButton().

obskur
quelle