Creare una pagina nell'Admin di Magento
Creare una pagina all'interno dell'area di amministrazione di Magento è un'operazione relativamente semplice.
Proviamo ad elencare i vari passaggi da eseguire supponendo l'esistenza dell'estensione per la quale si necessita la pagina nell'Admin, per esempio WaPoNe_CustomersCounter.
Il primo step è l'aggiunta della voce all'interno del menu di navigazione.
Per svolgere tale compito bisogna creare il file di configurazione nominato menu.xml nella cartella dell'estensione, in questo preciso percorso: <extension_dir>/etc/adminhtml/
Questo il contenuto del file <extension_dir>/etc/adminhtml/menu.xml
<?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="WaPoNe_CustomersCounter::saluti"
title="Saluti"
translate="title"
module="WaPoNe_CustomersCounter"
parent="Magento_Backend::marketing"
sortOrder="10"
dependsOnModule="WaPoNe_CustomersCounter"
resource="WaPoNe_CustomersCounter::saluti"/>
<add id="WaPoNe_CustomersCounter::ciao_pippo"
title="Ciao Pippo"
translate="title"
module="WaPoNe_CustomersCounter"
parent="WaPoNe_CustomersCounter::saluti"
sortOrder="10"
dependsOnModule="WaPoNe_CustomersCounter"
action="saluti/ciaopippo"
resource="WaPoNe_CustomersCounter::saluti"/>
</menu>
</config>
Il codice sopra si occupa di inserire due voci di menu: Saluti (voce di primo livello) e Ciao Pippo (voce di secondo livello, figlia di Saluti), come intuibile leggendo l'attributo title degli elementi add.
Oltre all'attributo title che, come mostrato serve a dare una label alla voce di menu, importanti sono innanzitutto l'id che identifica l'item all'interno del sistema del menu e di conseguenza parent che, basandosi sull'id dell'elemento, assegna una gerarchia tra le voci. Nel codice infatti si può notare che Saluti dipende da Magento_Backend::marketing, una delle voci principali (Marketing) del menu di base di Magento, mentre Ciao Pippo è figlia di Saluti tramite questa "istruzione": WaPoNe_CustomersCounter::saluti
Questo il risultato finora ottenuto:
La maggior parte delle voci di menu principali esistenti di Magento sono definiti nel seguente file del core di Magento: <mage_dir>/vendor/magento/module-backend/etc/adminhtml/menu.xml
Un altro attributo fondamentale è action, inserito solo per la voce di menu Ciao Pippo. In questa maniera si sta definendo una action che viene gestita da un controller Adminhtml quindi è necessario innanzitutto la dichiarazione della route della richiesta tramite la creazione del file <extension_dir>/etc/adminhtml/routes.xml
<?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 id="saluti" frontName="saluti">
<module name="WaPoNe_CustomersCounter"/>
</route>
</router>
</config>
settando ovviamente l'attributo frontName="saluti" (la prima parte della action della voce di menu); la seconda parte della action della voce di menu (ciaopippo) è la cartella dove andare ad inserire il controller che, dato non esser stato "battezzato", si chiamerà Index.php.
A questo punto occorre creare il file per l'implementazione del controller <extension_dir>/Controller/Adminhtml/CiaoPippo/Index.php
Qui si può quindi gestire la richiesta tramite il metodo pubblico execute()
public function execute()
{
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu(static::MENU_ID);
$resultPage->getConfig()->getTitle()->prepend(__('Ciao Pippo'));
return $resultPage;
}
per ottenere il seguente risultato, cliccando sulla voce di menu Ciao Pippo:
Ovviamente si potrebbe anche aggiungere un layout (<extension_dir>/view/adminhtml/layout/saluti_ciaopippo_index.xml) per richiamare un template e rendere visibili ulteriori elementi grafici ed informazioni.
L'ultimo attributo da considerare è resource che serve per gestire i permessi per l'accesso alle nuove voci di menu. Bisogna creare il file <extension_dir>/etc/acl.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Backend::marketing">
<resource id="WaPoNe_CustomersCounter::saluti"
title="WaPoNe Customers Counter"
sortOrder="10" />
</resource>
</resource>
</resources>
</acl>
</config>
Da notare l'id di resource che combacia con quello definito nel file menu.xml
Tramite questa operazione sarà possibile definire quale tipologia di utenze potranno accedere a tale risorse:
Un utente senza i corretti permessi non visualizzarà le voci di menu legate alla resource WaPoNe_CustomersCounter::saluti
Rimanendo in ambito di sicurezza, si potrebbero impostare i permessi per l'accesso al controller aggiungento nel file<extension_dir>/Controller/Adminhtml/CiaoPippo/Index.php la funzione _isAllowed(), che deriva dalla classe <mage_dir>/vendor/magento/module-backend/App/AbstractAction.php
protected function _isAllowed()
{
return $this->_authorization->isAllowed('WaPoNe_CustomersCounter::saluti');
}
Come mostrato, Magento mette a disposizione un meccanismo allo stesso tempo semplice e potente per la gestione del menu.