{"id":1924,"date":"2019-04-16T13:22:22","date_gmt":"2019-04-16T11:22:22","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1924"},"modified":"2019-05-22T09:21:16","modified_gmt":"2019-05-22T07:21:16","slug":"prestashop-generer-des-modules-via-la-console","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2019\/04\/16\/prestashop-generer-des-modules-via-la-console\/","title":{"rendered":"Prestashop : G\u00e9n\u00e9rer des modules via la console."},"content":{"rendered":"<p>Note : Cette fonctionnalit\u00e9 n&rsquo;est pas disponible via la console native de Prestashop ( disponible \u00e0 partir de prestashop 1.7 ) mais sur mon outil de console externe : prestashopConsole ( cf. <a href=\"https:\/\/github.com\/nenes25\/prestashop_console\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/nenes25\/prestashop_console<\/a> )<\/p>\n<p>J&rsquo;ai derni\u00e8rement du cr\u00e9er de nombreux modules sous Prestashop et le fait de les copier \/ coller des diff\u00e9rents modules \u00e0 chaque fois m&rsquo;a fait perdre pas mal de temps.<br \/>\nEt je ne connais pas forc\u00e9ment par coeur l&rsquo;ensemble des syntaxes n\u00e9cessaires.<br \/>\nPour optimiser tout cela j&rsquo;ai donc cherch\u00e9 un moyen de cr\u00e9er facilement et rapidement des modules.<br \/>\nIl existe d\u00e9j\u00e0 la possibilit\u00e9 de cr\u00e9er un module via le g\u00e9n\u00e9rateur de module de Prestashop ( disponible <a href=\"https:\/\/validator.prestashop.com\/generator\" target=\"_blank\" rel=\"noopener noreferrer\">ici<\/a> ) , en revanche cela ne correspondait pas vraiment \u00e0 mon besoin.<br \/>\nLe plus simple est donc de le g\u00e9rer via la ligne de commandes, j&rsquo;ai donc impl\u00e9ment\u00e9 des nouvelles commandes dans la console de prestashop pour g\u00e9rer cela.<\/p>\n<p>Voyons ensemble comment cr\u00e9er facilement et rapidement un module via cet outil.<br \/>\nLe but \u00e9tant bien entendu un canevas de module pour son d\u00e9veloppement et non pas un module final \ud83d\ude09<\/p>\n<p>Pour cela 3 nouvelles commandes font donc leur apparition :<\/p>\n<ul>\n<li><strong>module:generate:module<\/strong> : G\u00e9n\u00e9ration du fichier principal du module<\/li>\n<li><strong>module:generate:controller<\/strong> : G\u00e9n\u00e9ration d&rsquo;un controller front ou back pour un module ( Architecture legacy )<\/li>\n<li><strong>module:generate:upgrade<\/strong> : G\u00e9n\u00e9ration d&rsquo;un fichier d&rsquo;upgrade pour un module.&nbsp;<\/li>\n<\/ul>\n<p><strong>G\u00e9n\u00e9ration d&rsquo;un module<\/strong><\/p>\n<p>Le seul param\u00e8tre n\u00e9cessaire est le nom du module<\/p>\n<p>Les options suivantes sont disponibles ( et non obligatoires ):<\/p>\n<ul>\n<li>auhor : Auteur du module<\/li>\n<li>displayName : Nom du module<\/li>\n<li>description : description du module<\/li>\n<li>hookList : Liste des hooks du module<\/li>\n<li>widget : Le module impl\u00e9mente la widgetInterface ( PS 1.7 )<\/li>\n<li>templates : G\u00e9n\u00e9rer ou non les templates des hooks du module<\/li>\n<\/ul>\n<p>Plusieurs approche sont possible :<\/p>\n<p><strong>Approche interactive :<\/strong><\/p>\n<pre lang=\"php\" escaped=\"true\">.\/prestashopConsole.phar module:generate:module hhdev -1=true<\/pre>\n<p>Les param\u00e8tres sont demand\u00e9s par la console au fur et \u00e0 mesure<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1930\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/03\/ps-console-intractive.png\" alt=\"G\u00e9n\u00e9ration console\" width=\"514\" height=\"256\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/03\/ps-console-intractive.png 514w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/03\/ps-console-intractive-300x149.png 300w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/p>\n<p><strong>Saisie des options directement dans la console.<\/strong><\/p>\n<p>En mode raccourci<\/p>\n<pre lang=\"php\" escaped=\"true\">.\/prestashopConsole.phar module:generate:module -a\"hhennes\" -dn\"Module dev\" -d\"Module g\u00e9n\u00e9r\u00e9 via la console prestashop\" -l\"displayHeader,displayFooter,displayLeftColumn\" -wtrue -ttrue<\/pre>\n<p>Ou en mode complet<\/p>\n<pre lang=\"php\" escaped=\"true\">.\/prestashopConsole.phar module:generate:module --author=\"hhennes\" --displayName=\"Module dev\" --description=\"Module g\u00e9n\u00e9r\u00e9 via la console prestashop\" --hookList=\"displayHeader,displayFooter,displayLeftColumn\" --widget=true -templates=true<\/pre>\n<p>&nbsp;<\/p>\n<p>Le contenu g\u00e9n\u00e9r\u00e9 est le suivant<\/p>\n<pre lang=\"php\" escaped=\"true\">if (!defined('_PS_VERSION_')) {\r\n    exit;\r\n}\r\n\r\nuse PrestaShop\\PrestaShop\\Core\\Module\\WidgetInterface;\r\n\r\nclass Hhdev extends Module implements WidgetInterface {\r\n\r\npublic function __construct()\r\n{\r\n    $this-&gt;name = 'hhdev';\r\n    $this-&gt;tab = 'others';\r\n    $this-&gt;version = '0.1.0';\r\n    $this-&gt;author = 'hhennes';\r\n    $this-&gt;bootstrap = true;\r\n    parent::__construct();\r\n\r\n    $this-&gt;displayName = $this-&gt;l('Module dev');\r\n    $this-&gt;description = $this-&gt;l('Module g\u00e9n\u00e9r\u00e9 via la console Prestashop');\r\n}\r\n\r\n\/**\r\n * Installation du module\r\n * @return bool\r\n *\/\r\npublic function install()\r\n{\r\n    if (!parent::install()\r\n        || !$this-&gt;registerHook(['displayHeader','displayFooter','displayLeftColumn'])\r\n\r\n    ) {\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n\r\n\/**\r\n * Function displayHeaderdescription \r\n * @param array $params\r\n * @return mixed\r\n *\/\r\npublic function hookDisplayHeader($params){\r\n    return $this-&gt;display(__FILE__,\"views\/templates\/hook\/displayHeader.tpl\");\r\n}\r\n\r\n\r\n\/**\r\n * Function displayFooterdescription \r\n * @param array $params\r\n * @return mixed\r\n *\/\r\npublic function hookDisplayFooter($params){\r\n    return $this-&gt;display(__FILE__,\"views\/templates\/hook\/displayFooter.tpl\");\r\n}\r\n\r\n\r\n\/**\r\n * Function displayLeftColumndescription \r\n * @param array $params\r\n * @return mixed\r\n *\/\r\npublic function hookDisplayLeftColumn($params){\r\n    return $this-&gt;display(__FILE__,\"views\/templates\/hook\/displayLeftColumn.tpl\");\r\n}\r\n\r\n\r\n\r\n public function renderWidget($hookName = null, array $configuration = [])\r\n    {\r\n        \/\/@TODO Implements RenderWidgetMethod\r\n    }\r\n\r\n    public function getWidgetVariables($hookName = null, array $configuration = [])\r\n    {\r\n     \/\/@TODO Implements getWidgetVariables\r\n    }\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>G\u00e9n\u00e9ration d&rsquo;un controller :<br \/>\n<\/strong><\/p>\n<p><em>Le module doit exister au pr\u00e9alable<\/em><\/p>\n<p>Les 3 param\u00e8tres n\u00e9cessaires sont :<\/p>\n<ul>\n<li>le nom du module<\/li>\n<li>le nom du controller<\/li>\n<li>le type de controller ( front ou admin )<\/li>\n<\/ul>\n<p>L&rsquo;option suivante est disponible :<\/p>\n<ul>\n<li>template : g\u00e9n\u00e9rer le template pour le controller ( par d\u00e9faut oui )<\/li>\n<\/ul>\n<p>Voici comment g\u00e9n\u00e9rer un controller front AVEC un template :<\/p>\n<pre lang=\"bash\">.\/prestashopConsole.phar module:generate:controller hhdev demo front<\/pre>\n<p>Voici comment g\u00e9n\u00e9rer un controller front SANS template<\/p>\n<pre lang=\"bash\">.\/prestashopConsole.phar module:generate:controller hhdev demo front -t=false<\/pre>\n<p>Le contenu suivant est g\u00e9n\u00e9r\u00e9 pour le controller<\/p>\n<pre lang=\"php\" escaped=\"true\">class HhdevDemoModuleFrontController extends ModuleFrontController {\r\n    \r\n    public function init()\r\n    {\r\n        \/\/ TODO: Change the autogenerated stub\r\n        return parent::init(); \r\n    }\r\n\r\n    public function postProcess()\r\n    {\r\n        \/\/ TODO: Change the autogenerated stub\r\n        parent::postProcess(); \r\n    }\r\n\r\n    \r\n    public function initContent()\r\n    {\r\n        parent::initContent();\r\n        $this-&gt;setTemplate('module:hhdev\/views\/templates\/front\/demo.tpl');\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>Et un template correspondant est cr\u00e9\u00e9 dans le dossier views\/templates\/front<\/p>\n<p>Voici comment g\u00e9n\u00e9rer un controller admin<\/p>\n<pre lang=\"bash\">.\/prestashopConsole.phar module:generate:controller hhdev demo admin<\/pre>\n<p>Le contenu suivant est g\u00e9n\u00e9r\u00e9 :<\/p>\n<pre lang=\"php\" escaped=\"true\">class HhdevDemoController extends ModuleAdminController {\r\n \r\n \r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>G\u00e9n\u00e9ration d&rsquo;un fichier d&rsquo;upgrade<\/strong><\/p>\n<p><em>Le module doit exister au pr\u00e9alable<\/em><\/p>\n<p>Les 2 param\u00e8tres n\u00e9cessaires sont :<\/p>\n<ul>\n<li>le nom du module<\/li>\n<li>la version du module<\/li>\n<\/ul>\n<p>Pour g\u00e9n\u00e9rer un fichier d&rsquo;upgrade du module hhdev en version 0.2.0 la commande a ex\u00e9cuter sera la suivante :<\/p>\n<pre lang=\"bash\">.\/prestashopConsole.phar module:generate:upgrade hhdev 0.2.0<\/pre>\n<p>Elle g\u00e9n\u00e9rera automatiquement un fichier <em>upgrade-0.2.0.php<\/em> dans le dossier <em>upgrade<\/em> du module <em>hhdev <\/em>avec le contenu suivant :<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php\r\n\r\nif (!defined('_PS_VERSION_')) {\r\nexit;\r\n}\r\n\r\nfunction upgrade_module_0_2_0($module)\r\n{\r\n\/\/@Todo generate content\r\n}\r\n<\/pre>\n<p>En cumulant les fonction de g\u00e9n\u00e9ration et d&rsquo;installation, il est possible d&rsquo;obtenir un affichage en quelques lignes \ud83d\ude42<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1932\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-1024x280.png\" alt=\"Module console generate and install\" width=\"780\" height=\"213\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-1024x280.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-300x82.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-768x210.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console.png 1112w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1933\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-installed-1024x654.png\" alt=\"\" width=\"780\" height=\"498\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-installed-1024x654.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-installed-300x192.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-installed-768x490.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2019\/04\/module-console-installed.png 1225w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>N&rsquo;h\u00e9sitez pas \u00e0 me faire vos retours sur ces fonctionnalit\u00e9s qui m&rsquo;ont d\u00e9j\u00e0 fait gagner pas mal de temps \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note : Cette fonctionnalit\u00e9 n&rsquo;est pas disponible via la console native de Prestashop ( disponible \u00e0 partir de prestashop 1.7 ) mais sur mon outil de console externe : prestashopConsole ( cf. https:\/\/github.com\/nenes25\/prestashop_console ) J&rsquo;ai derni\u00e8rement du cr\u00e9er de nombreux modules sous Prestashop et le fait de les copier \/ coller des diff\u00e9rents modules \u00e0 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245],"tags":[440,104],"class_list":["post-1924","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-console","tag-prestashop"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1924"}],"version-history":[{"count":8,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1924\/revisions"}],"predecessor-version":[{"id":1981,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1924\/revisions\/1981"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}