Come creare un modulo in Magento 2 – Guida allo sviluppo – Parte II

creare-mosulo-magento-perte-2

In un precedente articolo (Come creare un Modulo in Magento 2 – Guida allo sviluppo – Parte I) abbiamo imparato come registrare un’estensione sulla piattaforma Magento 2, il primo step da compiere per lo sviluppo di un modulo su questo framework.
Proviamo adesso ad aggiungere qualche funzionalità ad essa cominciando con il classico esempio che prevede la stampa di “Hello World!” su una pagina del nostro store.
Per raggiungere quest’obiettivo abbiamo necessità di creare un controller che si occupa dell’indirizzamento della chiamata verso la pagina desiderata.

Generiamo quindi il file routes.xml all’interno della cartella <base_dir>/app/code/WaPoNe/HelloWorld/etc/frontend/:

<?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="helloworld" frontName="helloworld">
            <module name="WaPoNe_HelloWorld" />
        </route>
    </router>
</config>

Con lo sviluppo della nuova piattaforma si è pensato di suddividere tutte le configurazioni prima contenute nel file <base_dir>/app/code/<code_pool>/<vendorName>/<moduleName>/etc/config.xml in vari file, ognuno con uno scopo ben preciso; routes.xml è uno dei tanti esempi di questo miglioramento introdotto con Magento 2, sempre nell’ottica di semplificare tutta la fase di implementazione di plugin. E’ infatti in questo file, come appena spiegato, che vengono dichiarati i controller (nell’esempio, quelli di frontend) dell’applicazione, a differenza della vecchia versione che relegava questa operazione all’interno del solito file config.xml

L’altro file che occorre creare per generare il controller è quello della action che nel nostro caso chiamiamo Index.php e che va posizionato nella directory <base_dir>/app/code/<vendorName>/<moduleName>/Controller/<controllerName>/.

Supponendo Index anche come nome del nostro controller, il percorso completo e corretto sarà quindi: <base_dir>/app/code/WaPoNe/HelloWorld/Controller/Index/Index.php

<?php
namespace WaPoNe\HelloWorld\Controller\Index;

class Index extends \Magento\Framework\App\Action\Action
{

    public function execute()
    {
    }
}

Puliamo la cache con il comando visto in precedenza:

php bin/magento cache:clean

e proviamo con un browser ad aprire la pagina http://nomesito.estensione/helloworld/index/index

Il risultato è una pagina bianca vuota.

No, non abbiamo commesso alcun errore. E’ tutto corretto dato che la ‘action’ del controller (il metodo execute()) non compie nessuna azione.

Approfittiamo per evidenziare alcune importanti modifiche nell’implementazione di controller a differenza di Magento 1. Innanzitutto è stata eliminata definitivamente la directory <module_dir>/controllers/ che lascia il posto a <module_dir>/Controller/ (coerente con il nome delle altre cartelle del modulo come <module_dir>/Model/, <module_dir>/Block/, <module_dir>/Helper/ ecc.) che contiene tutti i file dedicati allo sviluppo dei controller per l’appunto.

L’idea di fondo della nuova piattaforma inoltre è imporre la generazione di un file per ogni action differentemente dal suo predecessore dove era possibile per un unico file la definizione di un controller ma di più action all’interno. Anche questa scelta decisionale va verso il concetto dominante in M2 di migliorare e semplificare il più possibile lo sviluppo.

Si è invece voluto continuare a tenere la sintassi precedente per la chiamata al controller:

<frontName>/<controllerName>/<actionName>

Infatti nel nostro caso, per chiamare il controller, abbiamo inserito nel browser l’indirizzo http://nomesito.estensione/helloworld/index/index che può essere così scomposto: frontname è helloworld (frontName=”helloworld” attributo del tag <route> nel file <module_dir>/etc/frontend/routes.xml), il nome del controller è index, la directory contente il file dalla action (<module_dir>/Controller/Index/) e il nome della action è index, il nome del file stesso (Index.php), come già illustrato precedentemente.

Avendo nell’esempio nominato ‘index’ sia il controller che la action, sarà possibile raggiungere la nostra pagina web anche inserendo come URL http://nomesito.estensione/helloworld, esattamente come accadeva con M1.

Tutto chiaro! Ma abbiamo detto che avremmo stampato la frase “Hello World!” nella nostra pagina web.

Facile. Basta aggiungere nel metodo execute() della action l’istruzione echo “Hello World!”;.

…
    public function execute()
    {
    echo “Hello World!”;
    }
…

Puliamo nuovamente la cache e ricarichiamo la pagina nel browser. Pagina bianca con la scritta desiderata.
Bene, un altro passo in avanti è stato fatto ma noi vorremmo aggiungere alla scritta stampata lo stile usato all’interno delle altre pagine del nostro sito.
Per fare questo occorre chiamare il metodo che gestisce il sistema di layout di Magento.
In Magento 1 questo compito veniva svolto dai metodi $this->loadLayout() e $this->renderLayout() mentre nella nuova versione tocca al factory method PageFactory.

Ma questo lo vedremo in dettaglio nel prossimo articolo.

Ti è piaciuto questo articolo? Votalo!

Torna in alto