{"id":1864,"date":"2018-11-15T14:36:36","date_gmt":"2018-11-15T12:36:36","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1864"},"modified":"2020-06-08T13:02:52","modified_gmt":"2020-06-08T11:02:52","slug":"prestashop-admincontroller-pour-un-module","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2018\/11\/15\/prestashop-admincontroller-pour-un-module\/","title":{"rendered":"Prestashop : cr\u00e9er un admin controller pour un module"},"content":{"rendered":"<p>Nous allons voir les diff\u00e9rentes \u00e9tapes pour r\u00e9aliser facilement un controller admin basique li\u00e9 \u00e0 un module Prestashop.<br \/>\nPuis nous verrons ensuite les caract\u00e9ristiques de base d&rsquo;un controller admin, cet article sera compl\u00e9t\u00e9 par d&rsquo;autres articles pour voir les fonctionnalit\u00e9s avanc\u00e9es \ud83d\ude09<br \/>\nVous pouvez consulter l&rsquo;ensemble des informations sur cette page\u00a0 :<a href=\"https:\/\/www.h-hennes.fr\/blog\/2020\/06\/08\/prestashop-creer-un-controller-admin-pour-un-module-presentation-des-options-avancees\/\"> https:\/\/www.h-hennes.fr\/blog\/2019\/01\/30\/prestashop-utilisation-avancee-admincontroller\/<\/a><\/p>\n<p><strong>Note : <\/strong>A partir de la version 1.7.5 de Prestashop il est possible d&rsquo;utiliser d&rsquo;utiliser le framework symfony et de suivre le m\u00eame fonctionnement que les nouveaux controller admin de prestashop, je ferais sans doute un article ult\u00e9rieurement.<br \/>\nCe tutoriel reste tout de m\u00eame valide sur cette version et les suivantes pour l&rsquo;instant.<\/p>\n<p>Pour cela nous allons cr\u00e9er un module \u00ab\u00a0samplemodule\u00a0\u00bb.<br \/>\nLe code complet est visible sur github : <a href=\"https:\/\/github.com\/nenes25\/prestashop_samplemodule\/tree\/admin\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/nenes25\/prestashop_samplemodule\/tree\/admin<\/a><\/p>\n<p>Les pr\u00e9requis suivants sont n\u00e9cessaires pour r\u00e9aliser un controller admin pour votre module :<\/p>\n<ul>\n<li>Cr\u00e9ation d&rsquo;une \u00ab\u00a0Tab\u00a0\u00bb<\/li>\n<li>Utilisation d&rsquo;un objet Prestashop h\u00e9ritant de la classe ObjectModel ( et de la base de donn\u00e9es qui lui est associ\u00e9e )<\/li>\n<\/ul>\n<p>Pour l&rsquo;objet Prestashop nous partirons sur un objet fictif \u00ab\u00a0Sample\u00a0\u00bb avec les propri\u00e9t\u00e9s suivantes :<\/p>\n<ul>\n<li>name : nom de l&rsquo;objet<\/li>\n<li>code : code de l&rsquo;objet<\/li>\n<li>email : email de l&rsquo;objet<\/li>\n<li>title : titre de l&rsquo;objet ( diff\u00e9rent en fonction de la langue )<\/li>\n<li>description : description de l&rsquo;objet ( diff\u00e9rent en fonction de la langue )<\/li>\n<\/ul>\n<p>Le code suivant sera dans le fichier classes\/Sample.php du module<\/p>\n<pre lang=\"php\" escaped=\"true\">class Sample extends ObjectModel\r\n{\r\n\r\n    public $id;\r\n    public $name;\r\n    public $code;\r\n    public $email;\r\n    public $title;\r\n    public $description;\r\n\r\n    public static $definition = [\r\n        'table' =&gt; 'hh_sample',\r\n        'primary' =&gt; 'id_sample',\r\n        'multilang' =&gt; true,\r\n        'fields' =&gt; [\r\n            \/\/ Champs Standards\r\n            'name' =&gt; ['type' =&gt; self::TYPE_STRING, 'validate' =&gt; 'isName', 'size' =&gt; 255, 'required' =&gt; true],\r\n            'code' =&gt; ['type' =&gt; self::TYPE_STRING, 'validate' =&gt; 'isLinkRewrite', 'size' =&gt; 255, 'required' =&gt; true],\r\n            'email' =&gt; ['type' =&gt; self::TYPE_STRING, 'validate' =&gt; 'isEmail', 'size' =&gt; 255, 'required' =&gt; true],\r\n            \/\/Champs langue\r\n            'title' =&gt; ['type' =&gt; self::TYPE_HTML, 'lang' =&gt; true, 'validate' =&gt; 'isCleanHtml', 'size' =&gt; 255,],\r\n            'description' =&gt; ['type' =&gt; self::TYPE_HTML, 'lang' =&gt; true, 'validate' =&gt; 'isCleanHtml',],\r\n        ],\r\n    ];\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Pour la cr\u00e9ation de la tab et de la base de donn\u00e9e c&rsquo;est le module qui se charge de g\u00e9rer tout cela lors de son installation.<\/p>\n<pre lang=\"php\" escaped=\"true\">\/\/Inclusion du mod\u00e8le Sample\r\nrequire_once _PS_MODULE_DIR_ . '\/samplemodule\/classes\/Sample.php';\r\n\r\nclass SampleModule extends Module\r\n{\r\n    public function __construct()\r\n    {\r\n        $this-&gt;author = 'hhennes';\r\n        $this-&gt;name = 'samplemodule';\r\n        $this-&gt;tab = 'hhennes';\r\n        $this-&gt;version = '0.1.1';\r\n        $this-&gt;need_instance = 0;\r\n\r\n        parent::__construct();\r\n\r\n        $this-&gt;displayName = $this-&gt;l('Prestashop sample Module');\r\n        $this-&gt;description = $this-&gt;l('Prestashop sample Module with front controller');\r\n    }\r\n\r\n    \/**\r\n     * Installation du module\r\n     * @return boolean\r\n     *\/\r\n    public function install()\r\n    {\r\n        return parent::install() &amp;&amp; $this-&gt;_installSql() &amp;&amp; $this-&gt;_installTab();\r\n    }\r\n\r\n    \/**\r\n     * D\u00e9sinstallation du module\r\n     * @return boolean\r\n     *\/\r\n    public function uninstall()\r\n    {\r\n        return parent::uninstall() &amp;&amp; $this-&gt;_uninstallSql() &amp;&amp; $this-&gt;_uninstallTab();\r\n    }\r\n\r\n    \/**\r\n     * Cr\u00e9ation de la base de donn\u00e9e\r\n     * @return boolean\r\n     *\/\r\n    protected function _installSql()\r\n    {\r\n        $sqlCreate = \"CREATE TABLE `\" . _DB_PREFIX_ . Sample::$definition['table'] . \"` (\r\n                `id_sample` int(11) unsigned NOT NULL AUTO_INCREMENT,\r\n                `name` varchar(255) DEFAULT NULL,\r\n                `code` varchar(255) DEFAULT NULL,\r\n                `email` varchar(255) DEFAULT NULL,\r\n                `date_add` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\r\n                `date_upd` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\r\n                PRIMARY KEY (`id_sample`)\r\n                ) ENGINE=InnoDB DEFAULT CHARSET=latin1;\";\r\n\r\n        $sqlCreateLang = \"CREATE TABLE `\" . _DB_PREFIX_ . Sample::$definition['table'] . \"_lang` (\r\n              `id_sample` int(11) unsigned NOT NULL AUTO_INCREMENT,\r\n              `id_lang` int(11) NOT NULL,\r\n              `title` varchar(255) DEFAULT NULL,\r\n              `description` text,\r\n              PRIMARY KEY (`id_sample`,`id_lang`)\r\n            ) ENGINE=InnoDB DEFAULT CHARSET=latin1;\";\r\n\r\n        return Db::getInstance()-&gt;execute($sqlCreate) &amp;&amp; Db::getInstance()-&gt;execute($sqlCreateLang);\r\n    }\r\n\r\n    \/**\r\n     * Installation du controller dans le backoffice\r\n     * @return boolean\r\n     *\/\r\n    protected function _installTab()\r\n    {\r\n        $tab = new Tab();\r\n        $tab-&gt;class_name = 'AdminHhSample';\r\n        $tab-&gt;module = $this-&gt;name;\r\n        $tab-&gt;id_parent = (int)Tab::getIdFromClassName('DEFAULT');\r\n        $tab-&gt;icon = 'settings_applications';\r\n        $languages = Language::getLanguages();\r\n        foreach ($languages as $lang) {\r\n            $tab-&gt;name[$lang['id_lang']] = $this-&gt;l('HH Sample Admin controller');\r\n        }\r\n        try {\r\n            $tab-&gt;save();\r\n        } catch (Exception $e) {\r\n            echo $e-&gt;getMessage();\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * D\u00e9sinstallation du controller admin\r\n     * @return boolean\r\n     *\/\r\n    protected function _uninstallTab()\r\n    {\r\n        $idTab = (int)Tab::getIdFromClassName('AdminHhSample');\r\n        if ($idTab) {\r\n            $tab = new Tab($idTab);\r\n            try {\r\n                $tab-&gt;delete();\r\n            } catch (Exception $e) {\r\n                echo $e-&gt;getMessage();\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * Suppression de la base de donn\u00e9es\r\n     *\/\r\n    protected function _uninstallSql()\r\n    {\r\n        $sql = \"DROP TABLE \". _DB_PREFIX_ .Sample::$definition['table'].\",\". _DB_PREFIX_ .Sample::$definition['table'].\"_lang\";\r\n        return Db::getInstance()-&gt;execute($sql);\r\n    }\r\n}\r\n<\/pre>\n<p><strong>Cr\u00e9ation du controller admin<\/strong><\/p>\n<p>Celui-ci doit \u00eatre cr\u00e9\u00e9 dans le dossier \/controllers\/admin\/ de votre module.<br \/>\nPour l&rsquo;exemple celui-ci se nommera <strong>AdminHhSample<\/strong> et le fichier AdminHhSample.php<\/p>\n<p>Je rappelle que les fonctions basiques d&rsquo;un controller admin dans le cadre d&rsquo;un module sont :<\/p>\n<ul>\n<li>d&rsquo;afficher une liste d&rsquo;objets Prestashop<\/li>\n<li>d&rsquo;ajouter et d&rsquo;\u00e9diter ces objets<\/li>\n<\/ul>\n<p>Voici le code basique de ce fichier<\/p>\n<pre lang=\"php\" escaped=\"true\">require_once _PS_MODULE_DIR_ . '\/samplemodule\/classes\/Sample.php';\r\nclass AdminHhSampleController extends ModuleAdminController\r\n{\r\n}\r\n<\/pre>\n<p>Le nom de classe du controller est nomdufichier<strong>Controller<\/strong> et il doit \u00e9tendre la classe ModuleAdminController<br \/>\nDans celui-ci on inclus \u00e9galement le fichier php contenant la classe de l&rsquo;objet que nous allons g\u00e9rer.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Liste des objets :<\/strong><\/p>\n<p>La fonction par d\u00e9faut du controller est d&rsquo;afficher une liste des objets.<br \/>\nPour cela il faut renseigner toutes les informations n\u00e9cessaires dans la fonction<em> __construct()<\/em> de la classe<br \/>\nJ&rsquo;ai comment\u00e9 les diff\u00e9rents param\u00e8tres pour expliquer leur fonctionnement.<\/p>\n<p>A noter que les champs <em>$this-&gt;fields_list<\/em> sont ensuite utilis\u00e9s dans une liste g\u00e9n\u00e9r\u00e9 via la classe <em>HelperList<\/em>, si vous souhaitez visualiser toutes les possibilit\u00e9s.<\/p>\n<pre lang=\"php\" escaped=\"true\">   \/**\r\n     * Instanciation de la classe\r\n     * D\u00e9finition des param\u00e8tres basiques obligatoires\r\n     *\/\r\n    public function __construct()\r\n    {\r\n        $this-&gt;bootstrap = true; \/\/Gestion de l'affichage en mode bootstrap \r\n        $this-&gt;table = Sample::$definition['table']; \/\/Table de l'objet\r\n        $this-&gt;identifier = Sample::$definition['primary']; \/\/Cl\u00e9 primaire de l'objet\r\n        $this-&gt;className = Sample::class; \/\/Classe de l'objet\r\n        $this-&gt;lang = true; \/\/Flag pour dire si utilisation de langues ou non\r\n\r\n        \/\/Appel de la fonction parente pour pouvoir utiliser la traduction ensuite\r\n        parent::__construct();\r\n\r\n        \/\/Liste des champs de l'objet \u00e0 afficher dans la liste\r\n        $this-&gt;fields_list = [\r\n            'id_sample' =&gt; [ \/\/nom du champ sql\r\n                'title' =&gt; $this-&gt;module-&gt;l('ID'), \/\/Titre\r\n                'align' =&gt; 'center', \/\/ Alignement\r\n                'class' =&gt; 'fixed-width-xs' \/\/classe css de l'\u00e9l\u00e9ment\r\n            ],\r\n            'name' =&gt; [\r\n                'title' =&gt; $this-&gt;module-&gt;l('name'),\r\n                'align' =&gt; 'left',\r\n            ],\r\n            'code' =&gt; [\r\n                'title' =&gt; $this-&gt;module-&gt;l('code'),\r\n                'align' =&gt; 'left',\r\n            ],\r\n            'email' =&gt; [\r\n                'title' =&gt; $this-&gt;module-&gt;l('email'),\r\n                'align' =&gt; 'left',\r\n            ],\r\n            'title' =&gt; [\r\n                'title' =&gt; $this-&gt;module-&gt;l('title'),\r\n                'lang' =&gt; true, \/\/Flag pour dire d'utiliser la langue\r\n                'align' =&gt; 'left',\r\n            ]\r\n        ];\r\n\r\n        \/\/Ajout d'actions sur chaque ligne\r\n        $this-&gt;addRowAction('edit');\r\n        $this-&gt;addRowAction('delete');\r\n    }\r\n<\/pre>\n<p>Avec ce code nous aurons l&rsquo;affichage suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1865\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-listing-admin-list.png\" alt=\"blog listing admin\" width=\"780\" height=\"286\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-listing-admin-list.png 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-listing-admin-list-300x110.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-listing-admin-list-768x282.png 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p><strong>Ajout \/ \u00c9dition d&rsquo;un objet<\/strong><\/p>\n<p>Pour l&rsquo;ajout ou l&rsquo;\u00e9dition d&rsquo;un objet le controller doit impl\u00e9menter la fonction renderForm avec le contenu suivant :<br \/>\nPour voir l&rsquo;ensemble des champs possibles vous pouvez visualiser le controller natif de AdminPatterns via l&rsquo;url : http:\/\/www.votre-site\/admin\/index.php?controller=AdminPatterns<\/p>\n<pre lang=\"php\" escaped=\"true\">\/**\r\n     * Affichage du formulaire d'ajout \/ cr\u00e9ation de l'objet\r\n     * @return string\r\n     * @throws SmartyException\r\n     *\/\r\n    public function renderForm()\r\n    {\r\n        \/\/D\u00e9finition du formulaire d'\u00e9dition\r\n        $this-&gt;fields_form = [\r\n            \/\/Ent\u00eate\r\n            'legend' =&gt; [\r\n                'title' =&gt; $this-&gt;module-&gt;l('Edit Sample'),\r\n                'icon' =&gt; 'icon-cog'\r\n            ],\r\n            \/\/Champs\r\n            'input' =&gt; [\r\n                [\r\n                    'type' =&gt; 'text', \/\/Type de champ\r\n                    'label' =&gt; $this-&gt;module-&gt;l('name'), \/\/Label\r\n                    'name' =&gt; 'name', \/\/Nom\r\n                    'class' =&gt; 'input fixed-width-sm', \/\/classes css\r\n                    'size' =&gt; 50, \/\/longueur maximale du champ\r\n                    'required' =&gt; true, \/\/Requis ou non\r\n                    'empty_message' =&gt; $this-&gt;l('Please fill the postcode'), \/\/Message d'erreur si vide\r\n                    'hint' =&gt; $this-&gt;module-&gt;l('Enter sample name') \/\/Indication compl\u00e9mentaires de saisie\r\n                ],\r\n                [\r\n                    'type' =&gt; 'text',\r\n                    'label' =&gt; $this-&gt;module-&gt;l('code'),\r\n                    'name' =&gt; 'code',\r\n                    'class' =&gt; 'input fixed-width-sm',\r\n                    'size' =&gt; 5,\r\n                    'required' =&gt; true,\r\n                    'empty_message' =&gt; $this-&gt;module-&gt;l('Please fill the code'),\r\n                ],\r\n                [\r\n                    'type' =&gt; 'text',\r\n                    'label' =&gt; $this-&gt;module-&gt;l('email'),\r\n                    'name' =&gt; 'email',\r\n                    'class' =&gt; 'input fixed-width-sm',\r\n                    'size' =&gt; 5,\r\n                    'required' =&gt; true,\r\n                    'empty_message' =&gt; $this-&gt;module-&gt;l('Please fill email'),\r\n                ],\r\n                [\r\n                    'type' =&gt; 'text',\r\n                    'label' =&gt; $this-&gt;module-&gt;l('Title'),\r\n                    'name' =&gt; 'title',\r\n                    'class' =&gt; 'input fixed-width-sm',\r\n                    'lang' =&gt; true, \/\/Flag pour utilisation des langues\r\n                    'required' =&gt; true,\r\n                    'empty_message' =&gt; $this-&gt;l('Please fill the title'),\r\n                ],\r\n                [\r\n                    'type' =&gt; 'textarea',\r\n                    'label' =&gt; $this-&gt;module-&gt;l('Description'),\r\n                    'name' =&gt; 'description',\r\n                    'lang' =&gt; true,\r\n                    'autoload_rte' =&gt; true, \/\/Flag pour \u00e9diteur Wysiwyg\r\n                ],\r\n            ],\r\n            \/\/Boutton de soumission\r\n            'submit' =&gt; [\r\n                'title' =&gt; $this-&gt;l('Save'), \/\/On garde volontairement la traduction de l'admin par d\u00e9faut\r\n            ]\r\n        ];\r\n        return parent::renderForm();\r\n    }\r\n<\/pre>\n<p>Le rendu sera ensuite le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1866\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-edition-sample.png\" alt=\"Blog \u00e9dition sample\" width=\"780\" height=\"330\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-edition-sample.png 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-edition-sample-300x127.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/blog-edition-sample-768x325.png 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Avec ces 2 \u00e9l\u00e9ments vous avez \u00e0 pr\u00e9sent un controller admin fonctionnel pour votre module qui permet de g\u00e9rer facilement votre entit\u00e9 Prestashop \ud83d\ude42<\/p>\n<p><strong>Bonus : Un bouton d&rsquo;ajout dans la toolbar<\/strong><\/p>\n<p>Le bouton d&rsquo;ajout d&rsquo;un \u00e9l\u00e9ment est relativement petit par d\u00e9faut, voici comment un ajouter un plus visible<br \/>\nAjouter la fonction initPageHeaderToolbar() dans votre controller avec le contenu suivant :<\/p>\n<pre lang=\"php\" escaped=\"true\">  \/**\r\n     * Gestion de la toolbar\r\n     *\/\r\n    public function initPageHeaderToolbar()\r\n    {\r\n\r\n        \/\/Bouton d'ajout\r\n        $this-&gt;page_header_toolbar_btn['new'] = array(\r\n            'href' =&gt; self::$currentIndex . '&amp;add' . $this-&gt;table . '&amp;token=' . $this-&gt;token,\r\n            'desc' =&gt; $this-&gt;module-&gt;l('Add new Sample'),\r\n            'icon' =&gt; 'process-icon-new'\r\n        );\r\n\r\n        parent::initPageHeaderToolbar();\r\n    }\r\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1905\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/11\/controller-add-btn-e1549019327767.png\" alt=\"Bouton Controller\" width=\"780\" height=\"378\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons voir les diff\u00e9rentes \u00e9tapes pour r\u00e9aliser facilement un controller admin basique li\u00e9 \u00e0 un module Prestashop. Puis nous verrons ensuite les caract\u00e9ristiques de base d&rsquo;un controller admin, cet article sera compl\u00e9t\u00e9 par d&rsquo;autres articles pour voir les fonctionnalit\u00e9s avanc\u00e9es \ud83d\ude09 Vous pouvez consulter l&rsquo;ensemble des informations sur cette page\u00a0 : https:\/\/www.h-hennes.fr\/blog\/2019\/01\/30\/prestashop-utilisation-avancee-admincontroller\/ Note : [&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":[537,288,104],"class_list":["post-1864","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-admin-controller","tag-module","tag-prestashop","prestashop-1-5","prestashop-1-6","prestashop-1-7","prestashop-1-7-4","prestashop-1-7-5","prestashop-1-7-6","prestashop-1-7-7","prestashop-1-7-8","prestashop-8-0","prestashop-8-1"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1864","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=1864"}],"version-history":[{"count":9,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1864\/revisions"}],"predecessor-version":[{"id":2135,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1864\/revisions\/2135"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}