Création de controllers
Déclaration de la route
La route pour le front est définie dans le fichier etc/frontend/routes.xml. Le fichier est le suivant :
<?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="adexos_formation" frontName="adexos_formation">
<module name="Adexos_Formation" />
</route>
</router>
</config>
Utilisation des controllers
Les controllers sont situés dans le dossier Controller du module. À la différence de Magento 1, chaque action a sa propre classe avec sa méthode execute.
Les controllers étendent la classe
\Magento\Framework\App\Action\Action
<?php
namespace Adexos\Formation\Controller\Quote;
class Request extends \Magento\Framework\App\Action\Action implements HttpGetActionInterface {}
TP - Création d'un formulaire de demande de devis
Créer notre controller dans app/code/Adexos/Formation/Controller, nous l'appelerons Quote/Request.php.
Ce controller ne fera qu'afficher un template dans un premier temps.
<?php
namespace Adexos\Formation\Controller\Quote;
class Request extends \Magento\Framework\App\Action\Action implements HttpGetActionInterface {
public function execute()
{
return $this->resultFactory->create(ResultFactory::TYPE_PAGE);
}
}
Testons notre nouvelle page : http://www.maboutique.com/adexos_formation/quote/request/.
adexos_formationcorrespond aufrontNamedéclaré dans leroutes.xmlquotecorrespond au nom du "controller"requestcorrespond au nom de "l'action"
Notre nouvelle page est vide, c'est normal, nous n'avons rien indiqué concernant son contenu dans nos layouts.
Les étapes suivantes :
- Ajouter dans notre fichier de layout
<route_id>_<controller>_<action>.xml, les instructions pour afficher un template dans le contenu de la page - Notre template devra être appelé par un de nos blocks
- Le template affiche un formulaire dont l'action du formulaire sera
quotePost. L'URL n'est pas en dur, mais est le résultat d'une fonction du block - Le formulaire demande à l'utilisateur son nom, son adresse e-mail et son message
Les routeurs
Déclarer le routeur dans le fichier etc/frontend/di.xml.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\App\RouterList">
<arguments>
<argument name="routerList" xsi:type="array">
<item name="adexos_formation" xsi:type="array">
<item name="class" xsi:type="string">Adexos\Formation\Controller\Router</item>
<item name="disable" xsi:type="boolean">false</item>
<item name="sortOrder" xsi:type="string">60</item>
</item>
</argument>
</arguments>
</type>
</config>
Ne pas oublier de compiler la DI dès que l'on modifie un fichier
di.xml
Nous allons faire en sorte que l'URL /demandededevis match notre controller précédemment créé.
Le routeur devrait ressembler à cela :
/**
* @param \Magento\Framework\App\RequestInterface $request
* @return bool|\Magento\Framework\App\ActionInterface
*/
public function match(\Magento\Framework\App\RequestInterface $request)
{
// Avoid infinite redirection
if ($request->getModuleName()) {
return null;
}
$identifier = trim($request->getPathInfo(), '/');
if ($identifier == '<rewrited_url>') {
$request->setModuleName('frontName')->setControllerName('controller')->setActionName('action');
$request->setAlias(\Magento\Framework\Url::REWRITE_REQUEST_PATH_ALIAS, $identifier);
return $this->actionFactory->create(\Magento\Framework\App\Action\Forward::class);
}
return false;
}