{"id":1587,"date":"2017-09-23T21:06:09","date_gmt":"2017-09-23T19:06:09","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1587"},"modified":"2018-11-22T18:11:18","modified_gmt":"2018-11-22T16:11:18","slug":"prestashop-module-dashboard","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2017\/09\/23\/prestashop-module-dashboard\/","title":{"rendered":"Prestashop : Module Dashboard"},"content":{"rendered":"<p>Nous allons voir en d\u00e9tails comment r\u00e9aliser un module dashboard sur prestashop ( Ce tuto a \u00e9t\u00e9 test\u00e9 sur les derni\u00e8res versions \u00e0 date de PS 1.6 et PS 1.7)<\/p>\n<p>La documentation officielle pr\u00e9sente de nombreuses informations mais elle n&rsquo;est pas super d\u00e9taill\u00e9e sur les diff\u00e9rents type de donn\u00e9es possibles nativement, ni sur comment traiter les graphiques.<\/p>\n<p>C&rsquo;est parti pour voir en d\u00e9tails comment les modules dashboard fonctionnent :<br \/>\nLe nom du module sera <strong>hh_dashmodule<\/strong><\/p>\n<p>Pour commencer notre module sera greff\u00e9 sur les hooks suivants :<\/p>\n<p>&#8211; <strong>dashboardZoneTwo<\/strong> ( Bloc central du dashboard ) OU dashboardZoneOne ( Colonne de gauche du dashboard )<br \/>\n&#8211; <strong>dashboardData<\/strong> ( R\u00e9cup\u00e9rations des donn\u00e9es du dashboard)<br \/>\n&#8211; <strong>actionAdminControllerSetMedia<\/strong> ( Pour ajouter le js sp\u00e9cifique du module.)<\/p>\n<p>Le code est volontairement simplifi\u00e9 pour comprendre l&rsquo;essentiel.<\/p>\n<p>Je passe rapidement sur les hooks<br \/>\n<strong>actionAdminControllerSetMedia<\/strong> dont le code sera le suivant :<\/p>\n<pre lang=\"php\" escaped=\"true\">    \/**\r\n     * Ajout du js sp\u00e9cifique du module dans le dashboard\r\n     *\/\r\n    public function hookActionAdminControllerSetMedia()\r\n    {\r\n        if (get_class($this-&gt;context-&gt;controller) == 'AdminDashboardController') {\r\n            $this-&gt;context-&gt;controller-&gt;addJs($this-&gt;_path.'views\/js\/'.$this-&gt;name.'.js');\r\n        }\r\n    }\r\n<\/pre>\n<p>ansi que sur le hook <strong>hookDashboardZoneTwo<\/strong> qui affiche uniquement un template smarty.<\/p>\n<pre lang=\"php\" escaped=\"true\">     \/**\r\n     * Hook Dasboard Principale\r\n     * @return type\r\n     *\/\r\n    public function hookDashboardZoneTwo()\r\n    {\r\n        return $this-&gt;display(__FILE__, 'views\/templates\/hook\/hookDashboardZoneTwo.tpl');\r\n    }\r\n<\/pre>\n<p>La particularit\u00e9 des modules de type dashboard et que les donn\u00e9es sont mises \u00e0 jour via des scripts ajax, qui appellent le hook <strong>DashboardData<\/strong> des modules.<\/p>\n<p>C&rsquo;est donc dans cette fonction qu&rsquo;il va falloir renvoyer les informations \u00e0 afficher.<\/p>\n<pre lang=\"php\" escaped=\"true\">    \/**\r\n     * Hook de r\u00e9cup\u00e9ration des donn\u00e9es\r\n     * @param type $params\r\n     *\/\r\n    public function hookDashboardData($params)\r\n    {\r\n        \/**\r\n         * Param\u00e8tres envoy\u00e9s par leur dashboard pour actualiser les stats\r\n         *\/\r\n        $from = $params['date_from'];\r\n        $to = $params['date_to'];\r\n\r\n        \/\/Exemple de requ\u00eate qui utilise les pram\u00e8tres\r\n        $customers = Db::getInstance()-&gt;executeS(\"SELECT DATE(date_add) AS date, COUNT(*) AS nbre \"\r\n                . \"FROM \" . _DB_PREFIX_ . \"customer \"\r\n                . \"WHERE DATE(date_add) &gt;= '\" . pSQL($from) . \"' AND DATE(date_add) &lt;= '\" . pSQL($to) . \"' \" . \"GROUP BY DATE(date_add)\"); \/\/Renvoi de tous les types de donn\u00e9es possibles return [ 'data_value' =&gt;\r\n            [\r\n                'current_time' =&gt; time(),\r\n                'customers' =&gt; $customers,\r\n                'sample_data' =&gt; '<strong>Test de donn\u00e9es fixe<\/strong>',\r\n            ],\r\n            'data_table' =&gt; $this-&gt;_getSampleDataTable(),\r\n            'data_trends' =&gt; $this-&gt;_getSampleDataTrends(),\r\n            'data_list_small' =&gt; $this-&gt;_getSampleDataListSmall(),\r\n            'data_chart' =&gt; $this-&gt;_getSampleDataChart(),\r\n        ];\r\n    }\r\n<\/pre>\n<p>Les plages de dates s\u00e9lectionn\u00e9es via le tableau de bord sont disponibles lors de l&rsquo;appel comme vous pouvez le voir dans le code, et ce sont ces param\u00e8tres qui vont nous permettre de renvoyer les donn\u00e9es ad\u00e9quates<\/p>\n<p>Les types de donn\u00e9es natifs sont les suivants :<\/p>\n<ul>\n<li>data_value<\/li>\n<li>data_table<\/li>\n<li>data_trends<\/li>\n<li>data_list_small<\/li>\n<li>data_chart<\/li>\n<\/ul>\n<p>Nous allons voir type par type comment g\u00e9rer leur affichage, qui n\u00e9cessitera \u00e0 la fois du code dans le fichier tpl \u00ab\u00a0views\/templates\/hook\/hookDashboardZoneTwo.tpl\u00a0\u00bb et dans le fichier php<\/p>\n<p><strong><span style=\"text-decoration: underline;\">&#8211; Type data_value<\/span><\/strong><\/p>\n<p>Le type data_value est le plus simple, il suffit de renvoyer une valeur ( int \/ string ) dans le tableau<br \/>\n&lsquo;data_value&rsquo; du hook comme dans l&rsquo;exemple ci-dessous.<\/p>\n<pre lang=\"php\" escaped=\"true\">return [\r\n            'data_value' =&gt;\r\n            [\r\n                'current_time' =&gt; time(),\r\n                'sample_data' =&gt; '<strong>Test de donn\u00e9es fixe<\/strong>',\r\n            ],\r\n];\r\n<\/pre>\n<p>Dans le tpl il est n\u00e9cessaire de mettre le code suivant :<\/p>\n<pre lang=\"html\" escaped=\"true\">&lt;div class=\"data_value\"&gt;\r\n{* Information remplie automatiquement par le script l'id correspond \u00e0 la cl\u00e9 du tableau renvoy\u00e9 dans data-value *}\r\n&lt;span id=\"current_time\"&gt;&lt;\/span&gt;\r\n&lt;span id=\"sample_data\"&gt;&lt;\/span&gt;\r\n&lt;\/div&gt;\r\n<\/pre>\n<p>Le rendu sera le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1592\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-value.jpg\" alt=\"Prestashop dashoard value\" width=\"427\" height=\"54\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-value.jpg 427w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-value-300x38.jpg 300w\" sizes=\"auto, (max-width: 427px) 100vw, 427px\" \/><\/p>\n<p><strong><span style=\"text-decoration: underline;\">&#8211; Type data_table<\/span><\/strong><\/p>\n<p>Pour le type data_table il est n\u00e9cessaire de renvoyer un tableau format\u00e9 sous la forme suivante :<\/p>\n<pre lang=\"php\" escaped=\"true\">return [\r\n            'table_hh_sample_table' =&gt; [\r\n                \/\/Header de la table\r\n                'header' =&gt; [\r\n                    \/\/Champ(s) wrapper(s) optionnel(s)\r\n                    ['title' =&gt; 'sample_column_1','class' =&gt; 'text-left' , 'wrapper_start' =&gt; '<strong>','wrapper_stop' =&gt; '<\/strong>'],\r\n                    ['title' =&gt; 'sample_column_2','class' =&gt; 'text-left'],\r\n                    ['title' =&gt; 'sample_column_2','class' =&gt; 'text-left'],\r\n                ],\r\n                \/\/Corps de la table\r\n                'body' =&gt; [\r\n                   [\r\n                       \/\/Champ wrapper optionnel\r\n                       ['id' =&gt; 'sample_column_1','value' =&gt; 'test value', 'class' =&gt; 'text-left'],\r\n                       ['id' =&gt; 'sample_column_2','value' =&gt; 'test value column2', 'class' =&gt; 'text-left','wrapper_start' =&gt; '<strong>','wrapper_stop' =&gt; '<\/strong>'],\r\n                       ['id' =&gt; 'sample_column_3','value' =&gt; 'test value column3', 'class' =&gt; 'text-left'],\r\n                   ],\r\n                   [\r\n                       ['id' =&gt; 'sample_column_1','value' =&gt; 'test value row 2', 'class' =&gt; 'text-left'],\r\n                       ['id' =&gt; 'sample_column_2','value' =&gt; 'test value row 2 column2', 'class' =&gt; 'text-left'],\r\n                       ['id' =&gt; 'sample_column_3','value' =&gt; 'test value row 2 column3', 'class' =&gt; 'text-left'],\r\n                   ],\r\n                   [\r\n                       ['id' =&gt; 'sample_column_1','value' =&gt; 'test value row 3', 'class' =&gt; 'text-left'],\r\n                       ['id' =&gt; 'sample_column_2','value' =&gt; 'test value row 3 column2', 'class' =&gt; 'text-left'],\r\n                       ['id' =&gt; 'sample_column_3','value' =&gt; 'test value row 3 column3', 'class' =&gt; 'text-left'],\r\n                   ]\r\n                ]\r\n            ],\r\n        ];\r\n<\/pre>\n<p>Dans le tpl il est n\u00e9cessaire de mettre le code suivant :<\/p>\n<pre lang=\"html\" escaped=\"true\">&lt;table class=\"table data_table\" id=\"table_hh_sample_table\"&gt;\r\n&lt;thead&gt;&lt;\/thead&gt;\r\n&lt;tbody&gt;&lt;\/tbody&gt;\r\n&lt;\/table&gt;\r\n<\/pre>\n<p>Le rendu sera le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1593\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-table.jpg\" alt=\"Prestashop dashoard table\" width=\"780\" height=\"102\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-table.jpg 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-table-300x39.jpg 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-table-768x100.jpg 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p><span style=\"text-decoration: underline;\"><strong>&#8211; Type data_trends<\/strong><\/span><\/p>\n<p>Pour le type data_trends il est n\u00e9cessaire de renvoyer un tableau formatt\u00e9 sous la forme suivante :<\/p>\n<pre lang=\"php\" escaped=\"true\"> return [\r\n            'dash_trend_sample_1' =&gt; [\r\n                'way' =&gt; 'up',\r\n                'value' =&gt; 3,\r\n            ],\r\n            'dash_trend_sample_2' =&gt; [\r\n                'way' =&gt; 'down',\r\n                'value' =&gt; 3,\r\n            ]\r\n        ];\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Dans le tpl il est n\u00e9cessaire de mettre le code suivant :<\/p>\n<pre lang=\"smarty\" escaped=\"true\">{l s='trend up' mod='hh_dashmodule'}&lt;dd class=\"dash_trend\"&gt;&lt;span id=\"dash_trend_sample_1\"&gt;&lt;\/span&gt;&lt;\/dd&gt;\r\n{l s='trend down' mod='hh_dashmodule'}&lt;dd class=\"dash_trend\"&gt;&lt;span id=\"dash_trend_sample_2\"&gt;&lt;\/span&gt;&lt;\/dd&gt;\r\n<\/pre>\n<p>Le rendu sera le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1594\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-trend.jpg\" alt=\"Prestashop dashoard trends\" width=\"99\" height=\"88\" \/><\/p>\n<p><span style=\"text-decoration: underline;\"><strong>&#8211; Type data_list_small<\/strong><\/span><\/p>\n<p>Pour le type data_list_small il est n\u00e9cessaire de renvoyer un tableau format\u00e9 sous la forme suivante :<\/p>\n<pre lang=\"php\" escaped=\"true\">return [\r\n            'dash_list_small_sample' =&gt; [\r\n                   'key1 : ' =&gt; ' value1',\r\n                   'key2 : ' =&gt; ' value2',\r\n                   'key3 : ' =&gt; [ 'value1', 'value2'],\r\n            ],\r\n        ];\r\n<\/pre>\n<p>Dans le tpl il est n\u00e9cessaire de mettre le code suivant :<\/p>\n<pre lang=\"html\" escaped=\"true\">&lt;div class=\"dash_list_small\"&gt;\r\n&lt;ul id=\"dash_list_small_sample1\"&gt;\r\n&lt;\/ul&gt;\r\n&lt;\/div&gt;\r\n<\/pre>\n<p>Le rendu sera le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1595\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-list.jpg\" alt=\"Prestashop dashoard list\" width=\"238\" height=\"83\" \/><\/p>\n<p><span style=\"text-decoration: underline;\"><strong>&#8211; Type data_chart<\/strong><\/span><\/p>\n<p>Le type chart est lui plus complexe et n\u00e9cessite l&rsquo;ajout d&rsquo;un fichier javascript sp\u00e9cifique au module.<br \/>\nLes graphiques sont g\u00e9n\u00e9r\u00e9s via la librairie javascript <strong>nv3d<\/strong> http:\/\/nvd3.org\/examples\/index.html<\/p>\n<p>Il est donc possible de g\u00e9n\u00e9rer l&rsquo;ensemble des types de graphiques pr\u00e9sent\u00e9s par la librairie, le format de donn\u00e9es attendu \u00e9tant sp\u00e9cifique \u00e0 chaque type de graphique, voici le principe g\u00e9n\u00e9ral et comment faire \u00e0 travers 2 exemples de type \u00ab\u00a0line\u00a0\u00bb et \u00ab\u00a0bar\u00a0\u00bb.<br \/>\nPour tous les autres types, je vous invites \u00e0 voir directement sur le site de la libairie nv3d.<\/p>\n<p>Les donn\u00e9es export\u00e9es via le php seront les suivantes :<\/p>\n<pre lang=\"php\" escaped=\"true\">return [\r\n            \/\/Graphique de type ligne\r\n            'data_chart_sample_1' =&gt; [\r\n                'chart_type' =&gt; 'sample_chart_line_model', \/\/Nom de la fonction d'initialisation dans le fichier hh_dashmodule.js\r\n                'chart_xaxis_label' =&gt; 'X axis Label',\r\n                'chart_yaxis_label' =&gt; 'Y axis Label',\r\n                'data' =&gt; [\r\n                    [\r\n                        'color' =&gt; '#7777ff',\r\n                        'area' =&gt; true,\r\n                        'values' =&gt; [\r\n                            ['x' =&gt; '1', 'y' =&gt; 10],\r\n                            ['x' =&gt; '2', 'y' =&gt; 20],\r\n                            ['x' =&gt; '3', 'y' =&gt; 30],\r\n                            ['x' =&gt; '4', 'y' =&gt; 60],\r\n                        ]\r\n                    ],\r\n                ]\r\n            ],\r\n            'data_chart_sample_2' =&gt; [\r\n                'chart_type' =&gt; 'sample_chart_bar_model', \/\/Nom de la fonction d'initialisation dans le fichier hh_dashmodule.js\r\n                'chart_xaxis_label' =&gt; 'X axis Label',\r\n                'chart_yaxis_label' =&gt; 'Y axis Label',\r\n                'data' =&gt; [\r\n                    [\r\n                        'values' =&gt; [\r\n                            ['label' =&gt; '2017-09-20', 'value' =&gt; 10],\r\n                            ['label' =&gt; '2017-09-21', 'value' =&gt; 20],\r\n                            ['label' =&gt; '2017-09-22', 'value' =&gt; 15],\r\n                            ['label' =&gt; '2017-09-23', 'value' =&gt; 7],\r\n                            ['label' =&gt; '2017-09-24', 'value' =&gt; 35],\r\n                        ]\r\n                    ],\r\n                ]\r\n            ],\r\n        ];\r\n<\/pre>\n<p>Dans le tpl il est n\u00e9cessaire de mettre le code suivant :<\/p>\n<pre lang=\"html\" escaped=\"true\">  &lt;div id=\"data_chart_sample_1\" class=\"chart with-transitions\"&gt;\r\n &lt;svg&gt;&lt;\/svg&gt;\r\n &lt;\/div&gt;\r\n \r\n &lt;p&gt;{l s='Bar Chart' mod='hh_dashmodule'}&lt;\/p&gt;\r\n &lt;div id=\"data_chart_sample_2\" class=\"chart with-transitions\"&gt;\r\n &lt;svg&gt;&lt;\/svg&gt;\r\n &lt;\/div&gt;\r\n<\/pre>\n<p>En suppl\u00e9ment il faut \u00e9galement rajouter le contenu suivant dans le fichier views\/js\/hh_dashmodule.js<br \/>\nLe point essentiel \u00e0 retenir \u00e9tant que les donn\u00e9es de notre tableau sont envoy\u00e9es dans la variable <strong>chart_details<\/strong><\/p>\n<pre lang=\"javascript\" escaped=\"true\">\/**\r\n * La librairie utilis\u00e9e est nvd3 : pour plus d'informations =&gt; http:\/\/nvd3.org\/examples\/index.html\r\n *  documentation : https:\/\/nvd3-community.github.io\/nvd3\/examples\/documentation.html\r\n *\/\r\n\r\n\/**\r\n * Mod\u00e8le d'exemple de graphique en ligne\r\n * @param string widget_name\r\n * @param array chart_details\r\n * @returns chart\r\n *\/\r\nfunction sample_chart_line_model(widget_name, chart_details) {\r\n\r\n    nv.addGraph(function () {\r\n        var chart = nv.models.lineChart()\r\n                .margin({left: 100})  \/\/Adjust chart margins to give the x-axis some breathing room.\r\n                .useInteractiveGuideline(true)  \/\/We want nice looking tooltips and a guideline!\r\n                .transitionDuration(350)  \/\/how fast do you want the lines to transition?\r\n                .showLegend(true)       \/\/Show the legend, allowing users to turn on\/off line series.\r\n                .showYAxis(true)        \/\/Show the y-axis\r\n                .showXAxis(true)        \/\/Show the x-axis\r\n                ;\r\n\r\n        \/\/Chart x-axis settings        \r\n        chart.xAxis\r\n                .axisLabel(chart_details.chart_xaxis_label)\r\n                .tickFormat(d3.format('d'));\r\n\r\n        \/\/Chart y-axis settings        \r\n        chart.yAxis\r\n                .axisLabel(chart_details.chart_yaxis_label)\r\n                .tickFormat(d3.format('d'));\r\n\r\n        d3.select('#data_chart_sample_1 svg')    \/\/Select the  element you want to render the chart in.   \r\n                .datum(chart_details.data)         \/\/Populate the  element with chart data...\r\n                .call(chart);          \/\/Finally, render the chart!\r\n\r\n        \/\/Update the chart when window resizes.\r\n        nv.utils.windowResize(function () {\r\n            chart.update()\r\n        });\r\n        return chart;\r\n    });\r\n}\r\n\/**\r\n * Mod\u00e8le d'exemple de graphique en barre\r\n * @param string widget_name\r\n * @param array chart_details\r\n * @returns chart\r\n *\/\r\nfunction sample_chart_bar_model(widget_name, chart_details) {\r\n\r\n    nv.addGraph(function () {\r\n        var chart = nv.models.discreteBarChart()\r\n                .x(function (d) {\r\n                    return d.label\r\n                })    \/\/Specify the data accessors.\r\n                .y(function (d) {\r\n                    return parseInt(d.value)\r\n                })\r\n                .staggerLabels(true)    \/\/Too many bars and not enough room? Try staggering labels.\r\n                .tooltips(false)        \/\/Don't show tooltips\r\n                .showValues(true)       \/\/...instead, show the bar value right on top of each bar.\r\n                .transitionDuration(350)\r\n                .valueFormat(d3.format('d'))\r\n                ;\r\n                \r\n        \/\/Chart x-axis settings        \r\n        chart.xAxis.axisLabel(chart_details.chart_xaxis_label);\r\n\r\n        \/\/Chart y-axis settings        \r\n        chart.yAxis\r\n                .axisLabel(chart_details.chart_yaxis_label)\r\n                .tickFormat(d3.format('d'));\r\n\r\n        d3.select('#data_chart_sample_2 svg')\r\n                .datum(chart_details.data)\r\n                .call(chart);\r\n\r\n        nv.utils.windowResize(chart.update);\r\n\r\n        return chart;\r\n    });\r\n}\r\n\r\n<\/pre>\n<p>Le rendu sera le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1591\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-chart.jpg\" alt=\"Prestashop dashoard chart\" width=\"780\" height=\"327\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-chart.jpg 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-chart-300x126.jpg 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/dashboard-type-chart-768x322.jpg 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Et voila nous avons fait le tour du fonctionnement des modules de type dashboard sous Prestashop.<br \/>\nN&rsquo;h\u00e9sitez pas \u00e0 remonter vos questions \ud83d\ude09<\/p>\n<p>&nbsp;<\/p>\n<p>Vous pouvez r\u00e9cup\u00e9rer le module complet d&rsquo;exemple <a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/09\/hh_dashmodule.zip\">ici<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons voir en d\u00e9tails comment r\u00e9aliser un module dashboard sur prestashop ( Ce tuto a \u00e9t\u00e9 test\u00e9 sur les derni\u00e8res versions \u00e0 date de PS 1.6 et PS 1.7) La documentation officielle pr\u00e9sente de nombreuses informations mais elle n&rsquo;est pas super d\u00e9taill\u00e9e sur les diff\u00e9rents type de donn\u00e9es possibles nativement, ni sur comment traiter [&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":[11,104,483,498],"class_list":["post-1587","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-dashboard","tag-prestashop","tag-prestashop-1-7","tag-tableau-de-bord","prestashop-1-6","prestashop-1-7","prestashop-1-7-6","prestashop-1-7-7","prestashop-1-7-8","prestashop-8-0"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1587","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=1587"}],"version-history":[{"count":8,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1587\/revisions"}],"predecessor-version":[{"id":1601,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1587\/revisions\/1601"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}