Tworzenie nowego kontrolera w Magento 2
Tematem dzisiejszego wpisu będzie tworzenie nowego kontrolera w Magento 2. W stosunku do Magento 1 w Magento 2 mamy trochę zmian. Główną zmianą jest to, że sam kontroler nie jest klasą, a nazwą katalogu. Klasę tworzymy dla konkretnej akcji.
Struktura katalogów
Dla potrzeby tego wpisu stworzyłam nowy moduł Anna_FirstController. Na początek utwórzmy następujące katalogi dla nowego modułu:
- Anna\FirstController\Controller — w nim tworzymy klasy akcji,
- Anna\FirstController\Block — klasy bloków, odpowiedzialne za dostarczenie danych do templaty,
- Anna\FirstController\etc — konfiguracja modułu,
- Anna\FirstController\etc\frontend — konfiguracja modułu dla obszaru frontend,
- Anna\FirstController\view\frontend\templates — miejsce na templaty widoku .phtml,
- Anna\FirstController\view\frontend\layout — definicja layoutu strony.
Tworzenie kontrolera i definiowanie akcji
Jak wiemy z Magento 1 url danej akcji ma wzór: frontName/controllerName/actonName. Przy czym, jeśli nie podamy jednego lub dwóch ostatnich parametrów, domyślnie zarówno dla controllerName jak i actionName będzie wartość index. Spróbujmy zaimplementować obsługę dla akcji, która będzie dostępna pod adresem firstcontroller/first/page.
Na początek zdefiniujmy frontName dla naszego modułu. W katalogu etc/frontend stwórz plik routes.xml o następującej zawartości:
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="firstcontroller" frontName="firstcontroller"> <module name="Anna_FirstController" /> </route> </router> </config> |
Klasy związane z akcjami tworzymy w katalogu Controller. Teraz czas na kontroler. W Magento 2 kontroler sam w sobie nie jest klasą, a jedynie folderem. Tworzymy więc katalog First, a w nim samą klasę akcji Page.
1 |
Anna\FirstController\Controller\First\Page.php |
Klasa akcji będzie rozszerzać klasę Magento\Framework\App\Action\Action i musi implementować metodę execute():
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 |
<?php declare(strict_types=1); namespace Anna\FirstController\Controller\First; class Page extends \Magento\Framework\App\Action\Action { /** * Dispatch request * * @return \Magento\Framework\View\Result\Page */ public function execute() { /** @var \Magento\Framework\View\Result\Page\Interceptor $resultPage */ $resultPage = $this->resultFactory->create( \Magento\Framework\Controller\ResultFactory::TYPE_PAGE ); /** @var \Magento\Framework\View\Page\Config $config */ $config = $resultPage->getConfig(); $config->getTitle()->set(__('My First Controller')); /** @var \Anna\FirstController\Block\Hello $block */ $block = $this->_view->getLayout()->createBlock('Anna\FirstController\Block\Hello'); // template from: Anna\FirstController\view\frontend\templates\firstcontroller\index.phtml $block->setTemplate('Anna_FirstController::firstcontroller/index.phtml'); $html = $block->toHtml(); $this->getResponse()->setBody($html); return $resultPage; } } |
Użyłam tutaj własnego bloku, aby zwrócić odpowiedź. Przykładowy blok znajdziesz w moim wpisie o tworzeniu nowego bloku w Magento 2.
Jeśli interesuje nas, aby za pomocą ustawień w adminie, mieć możliwość dodawania spersonalizowanej zawartości, potrzebujemy jeszcze jednego pliku konfiguracyjnego: page_types.xml. Plik ten umieszczamy w katalogu etc/frontend:
1 2 3 4 5 |
<?xml version="1.0"?> <page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_types.xsd"> <type id="firstcontroller_first_page" label="Frist Controller Page"/> </page_types> |
W sposób programowy utworzyliśmy tytuł strony oraz zwróciliśmy wygenerowany html bloku. Otrzymujemy prostą stronę:
Dodany w ten sposób blok nie używa żadnego layoutu strony. Zdefiniujmy teraz layout dla naszej własnej akcji.
Definicja layoutu dla naszej akcji
Stwórzmy nową akcję o nazwie layout. Nasza akcja będzie dostępna pod adresem: firstcontroller/first/layout. Dodajmy naszą akcję do pliku page_types.xml:
1 2 3 4 5 6 |
<?xml version="1.0"?> <page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_types.xsd"> <type id="firstcontroller_first_page" label="Frist Controller Page"/> <type id="firstcontroller_first_layout" label="Frist Controller with Page Layout"/> </page_types> |
Teraz potrzebujemy w katalogu Anna\FirstController\view\frontend\layout utworzyć pliko nazwie firstcontroller_first_layout.xml:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="content"> <!-- template from: Anna\FirstController\view\frontend\templates\firstcontroller\index.phtml --> <block class="Anna\FirstController\Block\Hello" name="first_controller_hello" template="Anna_FirstController::firstcontroller/index.phtml"/> </referenceContainer> </body> </page> |
Klasa Layout naszej nowej akcji:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php declare(strict_types=1); namespace Anna\FirstController\Controller\First; class Layout extends \Magento\Framework\App\Action\Action { /** * Dispatch request * * @return \Magento\Framework\View\Result\Page */ public function execute() { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create( \Magento\Framework\Controller\ResultFactory::TYPE_PAGE ); return $resultPage; } } |
Tym razem nasza strona będzie prezentowała się następująco:
Kontroler i menu w adminie w Magento 2 - Web Porgramming
6 sierpnia 2018 @ 13:28
[…] poprzednim wpisie omówiono sposób tworzenia kontrolera. Dzisiaj pokażemy jak stworzyć kontroler i menu w […]
Magento 2: Dodanie masowej akcji do istniejącego grida - Web Programming
28 listopada 2023 @ 01:33
[…] zależności od naszych preferencji możemy nadpisać istniejący routing lub użyć stworzonego w naszym […]
Dodanie akcji do istniejącego kontrolera w Magento 2 - Web Programming
15 stycznia 2024 @ 02:44
[…] przedstawiłam, w jaki sposób skonfigurować kontrolera i jego akcje — zarówno dla obszaru frontend jak i admina. W tym wpisie zostanie przedstawione dodanie akcji do istniejącego kontrolera w […]