Magento 2 Custom Admin Action Umgeleitet zum Dashboard


18

Ich nehme am Magento 2-Grundlagen-Entwicklungskurs teil und die Übung zum Admin-Router / Controller scheint veraltet zu sein. Der Router funktioniert, der Controller jedoch nicht. Er leitet immer nur zur Admin-Homepage um. Code für die Router- App / code / Training / Test / etc / adminhtml / routes.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/framework/App/etc/routes.xsd">
<router id="admin">
    <route id="test" frontName="test">
        <module name="Training_Test" before="Magento_Backend" />
    </route>
</router>
</config>

Code für die Admin-Controller- App / code / Training / Test / Controller / Adminhtml / Action / Index.php :

<?php

namespace Training\Test\Controller\Adminhtml\Action;
class Index extends \Magento\Backend\App\Action
{

public function execute()
    {
    die("test reached controller");
    }
protected function _isAllowed() {
    return true;
    }
}

Wenn ich zur Admin-URL von admin / test / action / index gehe, wird sie einfach umgeleitet und es passiert nichts. Wenn ich einen Konstruktor hinzufüge und xdebug verwende, wird angezeigt, dass er den Controller-Konstruktor erreicht, aber den Execute-Teil nie ausführt. Was vermisse ich?


Ich hoffe in Deiner Codefunktion _istAllowed return true. In Beispiel "Rückkehr" Anweisung ist Abwesenheit
KAndy

@KAndy ja, aber danke. Bearbeitet meine Frage, um das zu zeigen.
Kevin Chavez

Antworten:


22

Dies liegt daran, dass der geheime Schlüssel fehlt, wenn Sie die URL nur manuell eingeben. Geheimschlüssel - Funktion ist standardmäßig aktiviert und kann hier deaktiviert werden: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Dann sollten Sie in der Lage sein, Ihre Aktion zu erreichen.


@Alex Paliarush, wie funktioniert das, wenn Sicherheitsschlüssel aktiviert sind?
Aswanth

@Aswanth Fügen Sie einfach Ihre Aktion zum Menü hinzu und klicken Sie darauf. In diesem Fall fügt Magento der Anfrage den richtigen Sicherheitsschlüssel hinzu
Alex Paliarush,

@ AlexPaliarush Danke Es funktioniert für mich .. und hat mir Zeit gespart
ZOE RULE

Dies war das Problem, aber warum sagt der Kurs in der Übung nichts über diese Bedingung aus? Ich habe einige Stunden damit verloren, dies zu überprüfen ... Grrrrrrr
Binod - GoFundMonica

perfekte Antwort!!! +1 :) machte meinen Tag
SagarPPanchal

12

In router.xmlfile ( companyName/customModule/etc/adminhtml/router.xml) bestand die Lösung darin, dass die Routen-ID und der Frontname den gleichen Wert haben. In Ihrem Fall wäre dies:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="admin">
        <route id="asw_advanved" frontName="asw_advanved">
            <module name="Asw_Sample" before="Magento_Backend"/>
        </route>
    </router>
</config>

Geändert <route id="Bmanager" frontName="bmanager">zu <route id="bmanager" frontName="bmanager">und jetzt kann ich einen Basis-Controller wie beschrieben zum Fragetext machen. Immer noch kein Glück mit meinen benutzerdefinierten Controllern. Bearbeiten: Tatsächlich hat einer meiner benutzerdefinierten Controller einige Fehler ausgegeben. Viel besser als ohne Fehler umzuleiten.
Adrian Moisa

4

Vielleicht ist es besser, diese Eigenschaft zu verwenden:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];

2

Beim Versuch, auf Module / Funktionen im Backend (Adminhtml) zuzugreifen, prüft Magento Form Keys, ob das Geheimnis vorhanden ist und ob / wann jemand versucht, auf eine Aktion zuzugreifen und keinen FormKey angibt (z. B. Hotlinking der URL) und / oder liefert einen ungültigen FormKey - die Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) leitet die definierte Startup-Seite des Benutzers Admin UIX weiter (normalerweise die Dashboard-Seite)

[Dieser Mechanismus dient als "Sicherheitskontrolle", um zu verhindern, dass Benutzer auf Teile des Backends zugreifen, auf die sie keinen Zugriff haben.]


Beim Zugriff auf Optionen über das Admin UIX-Menü fügt Magento den FormKey automatisch für Sie hinzu.


Um die Prüfung auf FormKey zu verhindern, haben Sie zwei Möglichkeiten:

(a) Deaktivieren Sie die FormKey-Validierung

Navigation: Stores -> Einstellungen: Configuration -> Advanced: Admin -> Security -> Setup "Add Secret Key to URLs" bis "No"

Es ist sehr wichtig, sich daran zu erinnern, dass dadurch die Überprüfung des geheimen Schlüssels deaktiviert und Ihre Anwendung möglicherweise angreifbar wird.

So deaktivieren Sie die FormKey-Validierung

(b) Deaktivieren Sie die FormKey-Überprüfung für Ihren Controller

Geben Sie im Attribut "$ _publicActions" Ihres Admin-Controllers die Aktionen an, die Sie von der FormKey-Prüfung ausnehmen möchten.

protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Code Beispiel:

class Index extends \Magento\Backend\App\Action
{
    protected $_publicActions = ['index'];

    public function execute()
    {
        echo "My Hello World! Controller";
    }

}

1

Das Problem der Routing-Umleitung bei aktiviertem Sicherheitsschlüssel ist die in der Datei menu.xml unter / etc / adminhtml / festgelegte Aktions-URL.

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id="Mycompany_Mymodule::top_level" module="Mycompany_Mymodule" resource="Magento_Backend::content" sortOrder="9999" title="My Module" parent="Magento_Sales::sales"/>
        <add action="mycompany_mymodule/profile/index" id="Mycompany::mycompany_mymodule_profile" module="mycompany_Mymodule" parent="Mycompany_Mymodule::top_level" resource="Magento_Backend::content" sortOrder="9999" title="My Module"/>
    </menu>
</config>

Der wichtige Wert ist der Aktionsparameter im Menüpunkt. Achten Sie darauf, den Namen des in der routes.xml deklarierten Moduls in den id-Parameter zu setzen. In meinem Fall: "mycompany_mymodule"

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route frontName="mymodule" id="mycompany_mymodule">
            <module before="Magento_Backend" name="Mycompany_Mymodule"/>
        </route>
    </router>
</config>

0

<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" /> wird helfen

Sie können jedoch ein Brickpoing zu vendor / magento / module-backend / App / AbstractAction.php hinzufügen

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.