Dodanie akcji do istniejącego kontrolera w Magento 2
W tym wpisie przedstawię dodanie akcji do istniejącego kontrolera w Magento 2. W poprzednich wpisach przedstawiłam, w jaki sposób skonfigurować kontrolera i jego akcje — zarówno dla obszaru frontend jak i admina.
Lokalizacja kontrolera
Dla przykładu weźmy moduł Magento_Contact, dla którego zdefiniujemy nową akcję. Przypatrzmy się bliżej plikom związanym z routingiem i samymi akcjami:

Moduł posiada następująco zdefiniowany routing (plik frontend/routes.xml):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0"?> <!-- /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd"> <router id="standard"> <route id="contact" frontName="contact"> <module name="Magento_Contact" /> </route> </router> </config> |
W katalogu Controller modułu Magento_Contact znajduje się katalog Index, który Magento zmapuje jako nazwę dla kontrolera. Za wyświetlaniem strony kontaktowej odpowiada akcja Index (klasa Magento\Contact\Controller\Index). Strona kontaktowa jest dostępna pod tym adresem /contact/index/index, zaś wersja skrócona jest następująca: /contact (jako że wartości index w ścieżce możemy pominąć).
Dodanie nowej akcji
Dla przykładu dodamy akcję People do istniejącego już kontrolera Index. Nowa akcja będzie dostępna pod adresem /contact/index/people.
Klasycznie tworzymy nowy moduł. Tutaj stworzyłam moduł Anna_Contact. Plik konfiguracyjny nowego modułu, etc/module.xml, jest następujący:
|
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Anna_Contact" > <sequence> <module name="Magento_Contact"/> </sequence> </module> </config> |
Ważne jest, aby pamiętać o zależnościach pomiędzy innymi modułami. Jako że chcemy wykorzystać istniejący routing oraz bazową klasę (dla kontrolera) z modułu Magento_Contact. Potrzebujemy w naszym module zaznaczyć, że przed jego załadowaniem chcemy załadować moduł Magento_Contact. Efekt ten uzyskamy poprzez ustawienie węzła <sequence>.
Kolejnym krokiem jest określenie routingu dla naszego modułu. Ponieważ chcemy ścieżkę z frontName z nazwą contact, potrzebujemy skopiować zawartość pliku etc/frontend/routes.xml z modułu Magento_Contact. Umieszczamy skopiowaną zawartość do etc/frontend/routes.xml w naszym module i zmieniamy nazwę modułu zdefiniowaną w węźle <module> na nazwę naszego modułu:
|
1 2 3 4 5 6 7 8 9 |
<?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="standard"> <route id="contact" frontName="contact"> <module name="Anna_Contact" /> </route> </router> </config> |
Kolejnym krokiem jest utworzenie odpowiedniego katalogu dla naszej akcji.
Na początek należy utworzyć podstawowy katalog app/code/Anna/Contact/Controller. Dodanie akcji do istniejącego kontrolera Index wymaga utworzenia przez nas podkatalogu Index. W podkatalogu Index tworzymy własną klasę akcji Anna\Contact\Controller\Index\People:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php declare(strict_types=1); namespace Anna\Contact\Controller\Index; use Magento\Contact\Controller\Index; use Magento\Contact\Model\ConfigInterface; use Magento\Framework\App\Action\Context; use Magento\Framework\App\Action\HttpGetActionInterface as HttpGetActionInterface; use Magento\Framework\Controller\Result\RawFactory; use Magento\Framework\Controller\ResultInterface; class People extends Index implements HttpGetActionInterface { /** @var RawFactory */ protected $resultRawFactory; public function __construct( Context $context, ConfigInterface $contactsConfig, RawFactory $resultRawFactory ) { parent::__construct($context, $contactsConfig); $this->resultRawFactory = $resultRawFactory; } public function execute(): ResultInterface { $result = $this->resultRawFactory->create(); return $result->setContents('<strong>Hello Power People!</strong>'); } } |
Strona 404
Nasza klasa akcji Anna\Contact\Controller\Index\People dziedziczy po klasie Magento\Contact\Controller\Index. Wspomniana klasa z modułu Magento_Contact nadpisuje bazową metodę dispatch() klasy Magento\Framework\App\Action\Action w taki sposób:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Contact\Controller; use Magento\Contact\Model\ConfigInterface; use Magento\Framework\App\Action\Context; use Magento\Framework\App\RequestInterface; use Magento\Framework\Exception\NotFoundException; /** * Contact module base controller */ abstract class Index extends \Magento\Framework\App\Action\Action { /** * (...) */ /** * Dispatch request * * @param RequestInterface $request * @return \Magento\Framework\App\ResponseInterface * @throws \Magento\Framework\Exception\NotFoundException */ public function dispatch(RequestInterface $request) { if (!$this->contactsConfig->isEnabled()) { throw new NotFoundException(__('Page not found.')); } return parent::dispatch($request); } } |
Logika powyższego kodu jest prosta: następuje w nim sprawdzenie, czy moduł Magento_Contact nie został wyłączony w konfiguracji admina. Wyłączenie tego modułu spowoduje wyrzucenie wyjątku Magento\Framework\Exception\NotFoundException, co będzie skutkowało wyświetleniem strony 404 przez Magento.
Magento 2: Dodanie masowej akcji do istniejącego grida - Web Programming
15 listopada 2023 @ 13:56
[…] zależności od naszych preferencji możemy nadpisać istniejący routing lub użyć stworzonego w naszym […]