Magento 2 Custom Admin Action Przekierowano do pulpitu nawigacyjnego

18

Biorę kurs rozwoju Magento 2, a ćwiczenie Router / Kontroler Admin wydaje się nieaktualne. Router działa, ale kontroler nie, zawsze po prostu przekierowuje na stronę główną administratora. Kod aplikacji routera / code / Training / Test / etc / adminhtml / tras.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>

Kod aplikacji kontrolera administracyjnego / kodu / szkolenia / testu / kontrolera / administratora / działania / indeksu.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;
    }
}

Kiedy przechodzę do adresu administratora admin / test / action / index, po prostu przekierowuje i nic się nie dzieje. Jeśli dodam konstruktor i użyję xdebug, to pokazuje, że osiąga konstruktor kontrolera, ale nigdy nie wykonuje części wykonawczej. czego mi brakuje?

Kevin Chavez
źródło
Mam nadzieję, że w twojej funkcji kodu _is dozwolony jest true. W przykładzie instrukcja „return” to brak
KAndy
@KAndy tak, dziękuję. Zredagowałem moje pytanie, aby to pokazać.
Kevin Chavez,

Odpowiedzi:

22

Dzieje się tak, ponieważ podczas ręcznego wpisywania adresu URL brakuje „tajnego klucza”. Tajny klucz funkcja jest domyślnie włączona i tutaj może być wyłączone: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Wtedy powinieneś być w stanie osiągnąć swoje działanie.

Alex Paliarush
źródło
@Alex Paliarush, jak to zrobić, gdy klucze bezpieczeństwa są włączone.
Aswanth
@Aswanth Po prostu dodaj swoje działanie do menu i kliknij je. W takim przypadku Magento doda odpowiedni klucz bezpieczeństwa do żądania
Alex Paliarush
@AlexPaliarush Dzięki To działa dla mnie .. i zaoszczędziłem czas
ZOE ZASADA
To był problem, ale dlaczego kurs nie mówi o tym stanie w ćwiczeniu? Straciłem kilka godzin, sprawdzając to ... Grrrrrrr
Binod - GoFundMonica
idealna odpowiedź !!! +1 :) sprawiło, że mój dzień
SagarPPanchal
12

W router.xmlpliku ( companyName/customModule/etc/adminhtml/router.xml) Dla mnie rozwiązaniem było, aby identyfikator trasy i nazwa przednia miały tę samą wartość. W twoim przypadku byłoby to:

<?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>
Sankar_k
źródło
Zmieniono <route id="Bmanager" frontName="bmanager">na <route id="bmanager" frontName="bmanager">i teraz mogę sprawić, aby podstawowy kontroler działał zgodnie z opisem w treści pytania. Nadal nie mam szczęścia z moimi niestandardowymi kontrolerami. Edycja: Właściwie jeden z moich niestandardowych kontrolerów zaczął dawać błędy. Znacznie lepsze niż przekierowanie bez błędów.
Adrian Moisa,
4

Może lepiej użyć tej właściwości:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];
Bóg Magento
źródło
2

Podczas próby uzyskania dostępu do modułów / funkcji w backendie (Adminhtml), Magento sprawdza obecność tajnego klucza Form Keysi czy / kiedy ktoś próbuje uzyskać dostęp do akcji i nie dostarcza klucza FormKey (np .: hotlinkowanie adresu URL) i / lub dostarcza nieprawidłowy klawisz FormKey - Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) przekieruje zdefiniowaną przez użytkownika stronę startową Admin UIX (zwykle jest to strona Dashboard)

[Ten mechanizm służy „punktowi kontroli bezpieczeństwa”, aby uniemożliwić użytkownikom dostęp do części Backend, do których nie mają dostępu]


Podczas uzyskiwania dostępu do opcji z menu Administrator UIX - Magento automatycznie doda dla ciebie FormKey.


Aby zapobiec sprawdzaniu FormKey, masz dwie opcje:

(a) Wyłącz FormKey Validation

Nawigacja: Sklepy -> Ustawienia: Konfiguracja -> Zaawansowane: Administrator -> Bezpieczeństwo -> Ustawienia „Dodaj tajny klucz do adresów URL” na „Nie”

Bardzo ważne jest, aby pamiętać, że spowoduje to wyłączenie sprawdzania poprawności tajnego klucza, a zatem może narazić twoją aplikację na niebezpieczeństwo.

Jak wyłączyć sprawdzanie poprawności formularza

(b) Wyłącz FormKey Validation dla swojego kontrolera

Podaj działania, które chcesz zwolnić, z kontroli FormKey, w atrybucie „$ _publicActions” swojego administratora.

protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Przykład kodu:

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

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

}
Sharath Kumar
źródło
1

Problemem przekierowania routingu z włączonym kluczem bezpieczeństwa jest adres URL akcji ustawiony w menu.xml w / etc / adminhtml /

<?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>

Ważną wartością jest parametr akcji w pozycji menu. Zwróć uwagę na ustawienie nazwy modułu zadeklarowanego w pliku route.xml w parametrze id. W moim przypadku: „mojafirma_mymoduł”

<?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>
Michał Anioł
źródło
0

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

ale możesz dodać brickpoing do vendor / magento / module-backend / App / AbstractAction.php

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Саша Осадчий
źródło