Alcune delle caratteristiche sono ad esempio il nome (che deve essere uguale al nome del modulo), la versione, l\u2019autore, il range di conformit\u00e0 di versione, l\u2019autore, il messaggio di conferma per la disinstallazione del modulo ecc.<\/span><\/p>\n<?php\nif (!defined('_PS_VERSION_')) {\nexit;\n}\n\nclass HomepageBanner extends Module\n{\n\u00a0 \u00a0 public function __construct()\n\u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 $this->name = 'homepagebanner';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->tab = 'front_office_features';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->version = '1.0.0';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->author = 'Duccio Bottai';\n\u00a0 \u00a0 \u00a0 \u00a0 $this->need_instance = 0;\n\u00a0 \u00a0 \u00a0 \u00a0 $this->ps_versions_compliancy = [\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'min' => '1.7',\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 'max' => _PS_VERSION_\n\u00a0 \u00a0 \u00a0 \u00a0 ];\n\u00a0 \u00a0 \u00a0 \u00a0 $this->bootstrap = true;\n\n\u00a0 \u00a0 \u00a0 \u00a0 parent::__construct();\n\n\u00a0 \u00a0 \u00a0 \u00a0 $this->displayName = $this->l('Homepage Banner');\n\u00a0 \u00a0 \u00a0 \u00a0 $this->description = $this->l('This is a module that allows to show a banner in the homepage of the website.');\n\n\u00a0 \u00a0 \u00a0 \u00a0 $this->confirmUninstall = $this->l('Are you sure you want to uninstall?');\n\u00a0 \u00a0 }\n}<\/pre>\nPer permettere di installare (e disinstallare) il modulo correttamente, \u00e8 necessario aggiungere due ulteriori metodi alla nostra classe. Si tratta dei metodi install()<\/strong> e uninstall()<\/strong>.<\/p>\nOsserviamo, nel codice seguente, che il metodo install()<\/strong>, oltre a invocare la funzione padre di installazione, effettua una serie di operazioni, ognuna delle quali deve restituire true.\u00a0\u00c8 importante notare che tra queste, viene chiamata una funzione che lega il modulo ad un\u2019entit\u00e0 denominata hook<\/strong>. Un hook<\/strong>, come vedremo successivamente, \u00e8 un modo per associare una parte di codice (solitamente per iniettare del contenuto in una pagina, ma possono essere usati anche per effettuare azioni pi\u00f9 complesse) a determinati eventi di PrestaShop.
\nNel nostro caso usiamo l\u2019hook displayHome<\/strong> che ci permette di inserire contenuto nella homepage del sito.
\nInfine impostiamo un messaggio di default per il nostro banner.<\/p>\nAl contrario, il metodo per la disinstallazione del nostro modulo invoca il metodo padre per la disinstallazione e elimina il valore dalla tabella delle propriet\u00e0.<\/p>\n
public<\/span> function install()<\/span>\n{<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>if<\/span> (Shop::isFeatureActive())<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Shop::setContext(Shop::CONTEXT_ALL);<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> parent::install() &&<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$<\/span>this<\/span>->registerHook(<\/span>'displayHome'<\/span>) && Configuration::updateValue(<\/span>'homepage_banner_message'<\/span>, <\/span>'Message shown in homepage'<\/span>);<\/span>\n}<\/span>\n\npublic<\/span> function uninstall()<\/span>\n{<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>if<\/span> (!parent::uninstall() || !Configuration::deleteByName(<\/span>'homepage_banner_message'<\/span>))<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> false<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> true<\/span>;<\/span>\n}<\/span><\/pre>\nCosa fare del nostro povero hook che abbiamo registrato con tanto amore?<\/span><\/p>\nInnanzitutto, prepariamo il template del banner che vogliamo inserire nella homepage del nostro e-commerce. Per farlo dobbiamo rispettare una particolare gerarchia di directory. Il file che andiamo a creare, e che chiamiamo <\/span>homepage_banner.tpl, <\/strong>andr\u00e0 inserito all\u2019interno della directory <\/span>\/views\/templates\/hook\/<\/strong>.<\/span><\/p>\nNotate l\u2019uso della variabile <\/span>{$homepage_banner_message} <\/strong>all\u2019interno del file: grazie a Smarty<\/strong>, il template engine PHP utilizzato da PrestaShop, sar\u00e0 possibile passare il testo da inserire nel banner.<\/span><\/p>\n<div style=\"text-align:center; font-size: 20px; font-weight: bold; background-color: black; color: white; padding: 20px; margin: 40px 0;\"><\/span>\n <span>{$homepage_banner_message}<\/span>\n<\/div><\/span><\/pre>\nAdesso che abbiamo il nostro template, possiamo definire la funzione che ci permetter\u00e0 di usare l\u2019hook per iniettare il suo contenuto nell\u2019homepage del sito e-commerce. \u00c8 importante notare l\u2019uso delle maiuscole nel definire la funzione: l\u2019hook da noi usato \u00e8 displayHome<\/strong>, di conseguenza la funzione dovr\u00e0 chiamarsi necessariamente hookDisplayHome.<\/strong>
\n<\/strong>La funzione sostanzialmente utilizza le funzionalit\u00e0 di Smarty<\/strong> per iniettare la variabile relativa al messaggio da inserire nel banner prelevandola dalla tabella delle propriet\u00e0 e chiama la funzione che mostrer\u00e0 il banner.<\/span><\/p>\npublic<\/span> function hookDisplayHome($params)\n<\/span>{\n<\/span>\u00a0\u00a0\u00a0\u00a0$<\/span>this<\/span>->context->smarty->assign(\n<\/span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(<\/span>'homepage_banner_message'<\/span> => Configuration::get(<\/span>'homepage_banner_message'<\/span>))\n<\/span>\u00a0\u00a0\u00a0\u00a0);\n<\/span>\u00a0\u00a0\u00a0\u00a0<\/span>return<\/span> $<\/span>this<\/span>->display(__FILE__, <\/span>'homepage_banner.tpl'<\/span>);\n<\/span>}\n<\/span><\/pre>\nPer terminare lo sviluppo del modulo dobbiamo fornire la possibilit\u00e0 di modificare il messaggio mostrato all\u2019interno del banner.
\nPer questo ci serviamo del metodo displayForm() <\/strong>per mostrare il form di configurazione e del metodo getContent() <\/strong>che permette di salvare il messaggio. Il primo metodo fa uso della classe HelperForm <\/strong>per generare un form con il campo messaggio e prelevandone il valore corrente da Configuration<\/strong>, oltre ad impostare altre caratteristiche le cui specifiche sono consultabili nella documentazione ufficiale di PrestaShop.<\/span><\/p>\npublic<\/span> function displayForm()<\/span>\n{\n<\/span> \/\/ Definiamo il titolo della sezione, i campi del form e il tasto di salvataggio\n\u00a0\u00a0\u00a0\u00a0$fields_form[0][<\/span>'form'<\/span>] = array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'legend'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'title'<\/span> => $<\/span>this<\/span>->l(<\/span>'Homepage Banner'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'input'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'type'<\/span> => <\/span>'text'<\/span>,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'label'<\/span> => $<\/span>this<\/span>->l(<\/span>'Banner message'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'name'<\/span> => <\/span>'homepage_banner_message'<\/span>,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'lang'<\/span> => <\/span>true<\/span>,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'size'<\/span> => 20,<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'required'<\/span> => <\/span>true<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'submit'<\/span> => array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'title'<\/span> => $<\/span>this<\/span>->l(<\/span>'Save'<\/span>),<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'class'<\/span> => <\/span>'btn btn-default pull-right'<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)<\/span>\n\u00a0\u00a0\u00a0\u00a0);<\/span>\n\u00a0\u00a0\u00a0\u00a0<\/span>\n \/\/ Istanziamo l'HelperForm che permette di costruire la schermata di configurazione del modulo\n\u00a0\u00a0\u00a0\u00a0$helper = <\/span>new<\/span> HelperForm();<\/span>\n\n\u00a0\u00a0\u00a0\u00a0$helper->module = $<\/span>this<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->name_controller = $<\/span>this<\/span>->name;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->token = Tools::getAdminTokenLite(<\/span>'AdminModules'<\/span>);<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->currentIndex = AdminController::$currentIndex.<\/span>'&configure='<\/span>.$<\/span>this<\/span>->name;<\/span>\n\n\u00a0\u00a0\u00a0\u00a0$helper->title = $<\/span>this<\/span>->displayName;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->show_toolbar = <\/span>true<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->toolbar_scroll = <\/span>true<\/span>;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->submit_action = <\/span>'submit'<\/span>.$<\/span>this<\/span>->name;<\/span>\n\u00a0\u00a0\u00a0\u00a0$helper->toolbar_btn = array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'save'<\/span> =><\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0array(<\/span>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>'desc'<\/span>