[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fgtvUw3FAhF3Qc-8uUGAcWHLpiJcJDUediL7lw-WROGw":22,"$fi12sqd0B194lpZRLCyytx9a3r1aG6QCEWOKDPamuRuU":61,"header-db":76,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":92,"megamenu":171,"footer-db":225},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"title":23,"slug":24,"metaDescription":25,"category":26,"tags":27,"difficulty":34,"psVersions":35,"content":39,"faq":40,"tldr":56,"readingTime":57,"generatedAt":58,"publishDate":58,"relatedArticles":59,"sourceCategory":60},"Afficher le nombre de favoris (likes) sur une fiche produit PrestaShop","afficher-nombre-favoris-likes-fiche-produit-prestashop","Découvrez comment afficher le compteur de favoris sur vos fiches produits PrestaShop avec une requête SQL optimisée et sécurisée. Guide complet avec code.","developpement",[28,29,30,31,32,33],"favoris","smarty","SQL","fiche produit","module","social proof","intermediaire",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Pourquoi afficher un compteur de favoris sur vos fiches produits\u003C\u002Fh2>\n\u003Cp>Le \u003Cstrong>social proof\u003C\u002Fstrong> (preuve sociale) est l'un des leviers de conversion les plus puissants en e-commerce. Afficher le nombre de fois qu'un produit a été ajouté aux favoris par d'autres clients crée un signal de confiance immédiat : « Si 47 personnes ont mis ce produit en favori, c'est qu'il vaut le coup. »\u003C\u002Fp>\n\u003Cp>Dans PrestaShop, le module \u003Cstrong>Produits Favoris\u003C\u002Fstrong> (\u003Ccode>blockwishlist\u003C\u002Fcode> en 1.7+ ou \u003Ccode>favoriteproducts\u003C\u002Fcode> en 1.6) stocke ces données en base. Il suffit d'une requête SQL bien construite pour récupérer ce compteur et l'afficher sur la fiche produit.\u003C\u002Fp>\n\u003Cp>Cependant, cette opération apparemment simple cache plusieurs pièges techniques que nous allons détailler.\u003C\u002Fp>\n\u003Ch2>Le piège classique : `ExecuteS()` vs `getValue()`\u003C\u002Fh2>\n\u003Ch3>L'erreur fréquente\u003C\u002Fh3>\n\u003Cp>Beaucoup de développeurs PrestaShop écrivent instinctivement ce type de code pour compter des enregistrements :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F ❌ Code problématique — ne faites pas ça\n$id_product = $_GET['id_product'];\n\n$sql = 'SELECT COUNT(*)\n    FROM `' . _DB_PREFIX_ . 'favorite_product`\n    WHERE `id_product` = ' . $id_product;\n\n$results = Db::getInstance()-&gt;ExecuteS($sql);\n$smarty-&gt;assign('likeproductCount', $results);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Ce code comporte \u003Cstrong>trois problèmes majeurs\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**`ExecuteS()` retourne un tableau**, même pour un scalaire. Le résultat sera quelque chose comme `[['COUNT(*)' => '12']]` au lieu du simple entier `12`. Côté template Smarty, vous obtiendrez un objet `Smarty_Variable` contenant un tableau, impossible à afficher directement avec `{$likeproductCount}`.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n\u003Cli>**Injection SQL** : `$_GET['id_product']` est injecté directement dans la requête sans aucune validation. Un attaquant pourrait manipuler l'URL pour exécuter des requêtes arbitraires sur votre base de données.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n\u003Cli>**Variable superglobale brute** : utiliser `$_GET` directement contourne le système de filtrage de PrestaShop.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>La solution propre\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F ✅ Code corrigé et sécurisé\n$id_product = (int) Tools::getValue('id_product');\n\n$likeCount = (int) Db::getInstance()-&gt;getValue(\n    'SELECT COUNT(*)\n    FROM `' . _DB_PREFIX_ . 'favorite_product`\n    WHERE `id_product` = ' . $id_product\n);\n\n$this-&gt;context-&gt;smarty-&gt;assign('likeproductCount', $likeCount);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Les corrections apportées :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**`getValue()`** au lieu de `ExecuteS()` : cette méthode retourne directement la première colonne de la première ligne, soit un scalaire (ici, le nombre entier).\u003C\u002Fli>\n\u003Cli>**`(int)` cast** sur `Tools::getValue()` : sécurise l'entrée contre les injections SQL en forçant la conversion en entier.\u003C\u002Fli>\n\u003Cli>**`Tools::getValue()`** au lieu de `$_GET` : utilise le helper PrestaShop qui gère proprement la récupération des paramètres GET\u002FPOST.\u003C\u002Fli>\n\u003Cli>**`$this->context->smarty`** au lieu de `global $smarty` : en PrestaShop moderne, l'accès au contexte via `$this->context` est la pratique recommandée. L'utilisation de `global` est dépréciée.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Implémentation complète dans un module\u003C\u002Fh2>\n\u003Cp>Voici comment implémenter proprement cette fonctionnalité dans un module PrestaShop :\u003C\u002Fp>\n\u003Ch3>Structure du module\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-\">\nmonmodule\u002F\n├── monmodule.php\n└── views\u002F\n    └── templates\u002F\n        └── hook\u002F\n            └── product-likes.tpl\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Code PHP du module\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F**\n * @author Alexandre Carette &lt;contact@alexandrecarette.fr&gt;\n * @copyright 2026 Alexandre Carette\n * @license Propriétaire et Confidentiel\n *\u002F\n\nclass MonModule extends Module\n{\n    public function __construct()\n    {\n        $this-&gt;name = 'monmodule';\n        $this-&gt;version = '1.0.0';\n        $this-&gt;author = 'Alexandre Carette';\n        parent::__construct();\n    }\n\n    public function install()\n    {\n        return parent::install()\n            && $this-&gt;registerHook('displayProductAdditionalInfo');\n    }\n\n    \u002F**\n     * Récupère le nombre de favoris pour un produit donné.\n     *\u002F\n    public static function getFavoriteCount(int $idProduct): int\n    {\n        \u002F\u002F Adapter le nom de la table selon le module de favoris utilisé\n        \u002F\u002F PS 1.6 : favorite_product (module favoriteproducts)\n        \u002F\u002F PS 1.7+ : wishlist_product (module blockwishlist)\n        $table = version_compare(_PS_VERSION_, '1.7', '&gt;=') \n            ? 'wishlist_product' \n            : 'favorite_product';\n\n        return (int) Db::getInstance(_PS_USE_SQL_SLAVE_)-&gt;getValue(\n            'SELECT COUNT(*)\n            FROM `' . _DB_PREFIX_ . pSQL($table) . '`\n            WHERE `id_product` = ' . (int) $idProduct\n        );\n    }\n\n    public function hookDisplayProductAdditionalInfo(array $params): string\n    {\n        $idProduct = (int) $params['product']['id_product'];\n        $count = self::getFavoriteCount($idProduct);\n\n        $this-&gt;context-&gt;smarty-&gt;assign([\n            'like_count' =&gt; $count,\n            'like_label' =&gt; $count &gt; 1 ? 'personnes' : 'personne',\n        ]);\n\n        return $this-&gt;display(__FILE__, 'views\u002Ftemplates\u002Fhook\u002Fproduct-likes.tpl');\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Template Smarty (PS 1.6 \u002F 1.7)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* views\u002Ftemplates\u002Fhook\u002Fproduct-likes.tpl *}\n{if $like_count &gt; 0}\n    &lt;div class=\"product-likes\"&gt;\n        &lt;i class=\"material-icons\"&gt;favorite&lt;\u002Fi&gt;\n        &lt;span&gt;{$like_count} {$like_label} {if $like_count &gt; 1}ont{else}a{\u002Fif} ajouté ce produit en favori&lt;\u002Fspan&gt;\n    &lt;\u002Fdiv&gt;\n{\u002Fif}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Variante PrestaShop 8.x avec Symfony\u003C\u002Fh3>\n\u003Cp>Sur PrestaShop 8.x, si vous travaillez côté back-office ou dans un controller Symfony, privilégiez Doctrine DBAL :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\nuse Doctrine\\DBAL\\Connection;\n\nclass ProductLikesService\n{\n    private Connection $connection;\n    private string $dbPrefix;\n\n    public function __construct(Connection $connection, string $dbPrefix)\n    {\n        $this-&gt;connection = $connection;\n        $this-&gt;dbPrefix = $dbPrefix;\n    }\n\n    public function getFavoriteCount(int $productId): int\n    {\n        $qb = $this-&gt;connection-&gt;createQueryBuilder();\n        $qb-&gt;select('COUNT(*)')\n           -&gt;from($this-&gt;dbPrefix . 'wishlist_product')\n           -&gt;where('id_product = :id')\n           -&gt;setParameter('id', $productId);\n\n        return (int) $qb-&gt;executeQuery()-&gt;fetchOne();\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette approche utilise les \u003Cstrong>prepared statements\u003C\u002Fstrong> nativement, éliminant tout risque d'injection SQL.\u003C\u002Fp>\n\u003Ch2>Optimisation des performances\u003C\u002Fh2>\n\u003Ch3>Utiliser l'instance slave\u003C\u002Fh3>\n\u003Cp>Notez l'utilisation de \u003Ccode>Db::getInstance(_PS_USE_SQL_SLAVE_)\u003C\u002Fcode> dans notre code. Si votre hébergement dispose d'une réplication MySQL master\u002Fslave, les requêtes en lecture seront dirigées vers le slave, soulageant le serveur principal.\u003C\u002Fp>\n\u003Ch3>Mettre en cache le compteur\u003C\u002Fh3>\n\u003Cp>Sur un catalogue important (> 5 000 produits), exécuter un \u003Ccode>COUNT(*)\u003C\u002Fcode> à chaque affichage de fiche produit peut peser. Deux stratégies :\u003C\u002Fp>\n\u003Cp>\u003Cstrong>1. Cache objet PrestaShop :\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic static function getFavoriteCount(int $idProduct): int\n{\n    $cacheKey = 'MonModule::getFavoriteCount_' . $idProduct;\n\n    if (!Cache::isStored($cacheKey)) {\n        $count = (int) Db::getInstance(_PS_USE_SQL_SLAVE_)-&gt;getValue(\n            'SELECT COUNT(*)\n            FROM `' . _DB_PREFIX_ . 'wishlist_product`\n            WHERE `id_product` = ' . (int) $idProduct\n        );\n        Cache::store($cacheKey, $count);\n    }\n\n    return (int) Cache::retrieve($cacheKey);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>2. Colonne dénormalisée :\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Pour les très gros volumes, ajoutez une colonne \u003Ccode>favorite_count\u003C\u002Fcode> directement dans \u003Ccode>ps_product\u003C\u002Fcode> et mettez-la à jour via un hook \u003Ccode>actionObjectWishlistProductAddAfter\u003C\u002Fcode> \u002F \u003Ccode>actionObjectWishlistProductDeleteAfter\u003C\u002Fcode>. Le compteur est alors lu sans aucune jointure.\u003C\u002Fp>\n\u003Ch2>Différences entre les versions de PrestaShop\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Aspect\u003C\u002Fth>\u003Cth>PrestaShop 1.6\u003C\u002Fth>\u003Cth>PrestaShop 1.7\u003C\u002Fth>\u003Cth>PrestaShop 8.x\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Module favoris\u003C\u002Fth>\u003Cth>`favoriteproducts`\u003C\u002Fth>\u003Cth>`blockwishlist`\u003C\u002Fth>\u003Cth>`blockwishlist` v3+\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Table SQL\u003C\u002Fth>\u003Cth>`favorite_product`\u003C\u002Fth>\u003Cth>`wishlist_product`\u003C\u002Fth>\u003Cth>`wishlist_product`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Hook recommandé\u003C\u002Fth>\u003Cth>`displayProductButtons`\u003C\u002Fth>\u003Cth>`displayProductAdditionalInfo`\u003C\u002Fth>\u003Cth>`displayProductAdditionalInfo`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Accès Smarty\u003C\u002Fth>\u003Cth>`global $smarty`\u003C\u002Fth>\u003Cth>`$this->context->smarty`\u003C\u002Fth>\u003Cth>`$this->context->smarty`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Bonne pratique SQL\u003C\u002Fth>\u003Cth>`Db::getInstance()`\u003C\u002Fth>\u003Cth>`Db::getInstance()`\u003C\u002Fth>\u003Cth>Doctrine DBAL\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ch2>Aller plus loin : chargement asynchrone en AJAX\u003C\u002Fh2>\n\u003Cp>Pour éviter tout impact sur le temps de chargement initial de la page, vous pouvez charger le compteur en AJAX après le rendu de la page :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F front.js\ndocument.addEventListener('DOMContentLoaded', function () {\n    const container = document.querySelector('.product-likes-count');\n    if (!container) return;\n\n    const productId = container.dataset.productId;\n\n    fetch(`\u002Fmodule\u002Fmonmodule\u002Fajax?action=getLikeCount&id_product=${productId}`)\n        .then(response =&gt; response.json())\n        .then(data =&gt; {\n            if (data.count &gt; 0) {\n                container.textContent = `${data.count} favori${data.count &gt; 1 ? 's' : ''}`;\n                container.style.display = 'block';\n            }\n        });\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette technique est particulièrement pertinente si vous utilisez un \u003Cstrong>cache full-page\u003C\u002Fstrong> (Varnish, CloudFlare) car le compteur dynamique ne bloque pas la mise en cache du reste de la page.\u003C\u002Fp>",[41,44,47,50,53],{"q":42,"a":43},"Quelle est la différence entre ExecuteS() et getValue() dans PrestaShop ?","ExecuteS() exécute une requête SELECT et retourne un tableau de résultats (array de arrays associatifs), même si le résultat ne contient qu'une seule valeur. getValue() retourne directement la valeur scalaire de la première colonne de la première ligne. Pour un COUNT(*), un MAX() ou toute requête retournant une valeur unique, utilisez toujours getValue() afin d'obtenir directement un entier ou une chaîne exploitable.",{"q":45,"a":46},"Comment sécuriser une requête SQL dans un module PrestaShop ?","Trois règles fondamentales : (1) castez toujours les identifiants numériques avec (int) avant de les injecter dans la requête, (2) utilisez Tools::getValue() au lieu de $_GET\u002F$_POST pour récupérer les paramètres utilisateur, (3) utilisez pSQL() pour échapper les chaînes de caractères. Sur PrestaShop 8.x, privilégiez Doctrine DBAL avec ses prepared statements qui éliminent nativement les risques d'injection SQL.",{"q":48,"a":49},"Comment afficher le nombre de favoris sans ralentir la fiche produit PrestaShop ?","Trois stratégies selon le volume de votre catalogue : (1) pour les petits catalogues, un simple COUNT(*) avec l'instance SQL slave suffit, (2) pour les catalogues moyens, utilisez le cache objet PrestaShop (Cache::store\u002Fretrieve) pour éviter de requêter la base à chaque affichage, (3) pour les gros catalogues, dénormalisez le compteur dans une colonne dédiée de ps_product mise à jour via hooks, ou chargez le compteur en AJAX après le rendu de la page.",{"q":51,"a":52},"Pourquoi ne pas utiliser global $smarty dans un module PrestaShop ?","L'utilisation de global $smarty est une pratique héritée de PrestaShop 1.4\u002F1.5 qui est fortement déconseillée depuis la version 1.6. Le pattern recommandé est d'utiliser $this->context->smarty dans les classes de module, ce qui respecte l'architecture orientée objet de PrestaShop et garantit que vous accédez à la bonne instance Smarty avec le bon scope de variables.",{"q":54,"a":55},"Le module blockwishlist est-il compatible avec cette méthode de comptage ?","Oui, mais le nom de la table diffère selon les versions. Le module blockwishlist (PrestaShop 1.7+) utilise la table ps_wishlist_product, tandis que l'ancien module favoriteproducts (PS 1.6) utilisait ps_favorite_product. Vérifiez la structure de votre base de données avec un SHOW TABLES LIKE '%wish%' ou '%favorite%' pour identifier la table correcte dans votre installation.","Pour afficher le nombre de favoris d'un produit PrestaShop, utilisez Db::getInstance()->getValue() avec un COUNT(*) sécurisé par un cast (int), jamais ExecuteS() qui retourne un tableau inutilisable directement dans Smarty.",5,"2026-03-21T15:17:55.000Z",[],"PrestaShop pour les développeurs",{"academy":62,"blog":63,"expertise":75},[],[64,69,72],{"title":65,"url":66,"score":67,"type":68},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back",1,"blog",{"title":70,"url":71,"score":67,"type":68},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":73,"url":74,"score":67,"type":68},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":77},{"logo":78,"topBar":84,"contactEmail":89,"features":90,"navBar":85},{"src":79,"alt":80,"text":81,"href":82,"class":83},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","Alexandre Carette","\u002F","h-10 w-10",{"message":85,"showLanguages":86,"align":87,"languages":88},null,false,"left",[],"contact@alexandrecarette.fr",{"showSearch":86,"showWishlist":86,"showLogin":20,"showContact":86,"showCart":86,"stickyHeader":20,"headerLayout":91},"inline",{"columns":93},[94,109,139,160],{"title":95,"links":96},"Plateforme",[97,100,103,106],{"label":98,"href":99,"external":86},"Offre Starter (2 500 €)","\u002Foffre-starter",{"label":101,"href":102,"external":86},"Devenir Ambassadeur","\u002Fambassadeur",{"label":104,"href":105,"external":86},"Modules PrestaShop","\u002Fmodules",{"label":107,"href":108,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":110,"links":111},"Le Synedre",[112,115,118,121,124,127,130,133,136],{"label":113,"href":114,"external":86},"L'histoire","\u002Fsynedre",{"label":116,"href":117,"external":86},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":119,"href":120,"external":86},"L'équipe","\u002Fequipe",{"label":122,"href":123,"external":86},"Le réacteur en direct","\u002Freacteur",{"label":125,"href":126,"external":86},"Le Drill (entraînement)","\u002Fdrill",{"label":128,"href":129,"external":86},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":131,"href":132,"external":86},"Les agents IA","\u002Fagents-ia",{"label":134,"href":135,"external":86},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":137,"href":138,"external":86},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":140,"links":141},"Ressources",[142,145,148,151,154,157],{"label":143,"href":144,"external":86},"Blog","\u002Fblog",{"label":146,"href":147,"external":86},"Academy","\u002Facademy",{"label":149,"href":150,"external":86},"Dictionnaire","\u002Fdictionnaire",{"label":152,"href":153,"external":86},"Expertise PrestaShop","\u002Fexpertise",{"label":155,"href":156,"external":86},"Flywheel","\u002Fflywheel",{"label":158,"href":159,"external":86},"Manifeste","\u002Fmanifeste",{"title":161,"links":162},"À propos",[163,165,168],{"label":81,"href":164,"external":86},"\u002Fa-propos",{"label":166,"href":167,"external":86},"Dossier de presse","\u002Fpresse",{"label":169,"href":170,"external":86},"Contact","\u002Fcontact",{"items":172},[173,181,186,192,200,208,213,219],{"id":174,"type":175,"label":176,"href":153,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":178,"children":179,"psChildren":180},41,"link",{"fr":177},"Expertise",0,[],[],{"id":182,"type":175,"label":183,"href":144,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":67,"children":184,"psChildren":185},42,{"fr":143},[],[],{"id":187,"type":175,"label":188,"href":105,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":189,"children":190,"psChildren":191},43,{"fr":104},2,[],[],{"id":193,"type":175,"label":194,"href":196,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":197,"children":198,"psChildren":199},44,{"fr":195},"Outils IA","\u002Foutils-ia",3,[],[],{"id":201,"type":175,"label":202,"href":99,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":204,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":205,"children":206,"psChildren":207},45,{"fr":203},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":209,"type":175,"label":210,"href":147,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":57,"children":211,"psChildren":212},46,{"fr":146},[],[],{"id":214,"type":175,"label":215,"href":164,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":216,"children":217,"psChildren":218},47,{"fr":161},6,[],[],{"id":220,"type":175,"label":221,"href":170,"icon":85,"description":85,"badge":85,"groupTitle":85,"style":85,"gridColumns":85,"cssClass":85,"psCategoryId":85,"showPsChildren":86,"position":222,"children":223,"psChildren":224},48,{"fr":169},7,[],[],{"footer":226},{"theme":227,"description":85,"hours":85,"logo":228,"contact":229,"social":230,"bottomBar":240},"dark",{"src":79,"href":82,"alt":81},{"email":85,"phone":85,"address":85,"cta":85},[231,234,237],{"platform":232,"href":233,"label":232},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":235,"href":236,"label":235},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":238,"href":239,"label":238},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":85}]