- Comment puis-je modifier les données que Finder télécharge depuis ma boutique ?
- Comment fonctionnent les hooks de Finder ?
- Créer un module pour enregistrer les hooks
- Hooks disponibles pour exclure des données avant de les interroger
- Hooks disponibles pour modifier les données déjà récupérées
- Bonnes pratiques
- Besoin d’aide ?
Comment puis-je modifier les données que Finder télécharge depuis ma boutique ? #
Finder télécharge périodiquement les produits, les catégories, les commandes et d’autres données de votre boutique afin de fournir les résultats de recherche. Si vous devez ajuster ces informations avant leur téléchargement (masquer certains produits, compléter un texte, exclure une caractéristique qui n’apporte rien à la recherche, etc.), vous pouvez le faire à l’aide des hooks que Finder déclenche pendant ce processus, sans modifier le module Finder ni votre catalogue réel.
Comment fonctionnent les hooks de Finder ? #
PrestaShop permet à n’importe quel module de « s’accrocher » à des points précis de l’exécution d’un autre module grâce aux hooks. Finder déclenche une série de hooks qui lui sont propres juste avant d’interroger la base de données et juste après avoir récupéré chaque type de donnée. L’enregistrement d’un hook se fait toujours depuis la méthode install() d’un module. Pour les utiliser, vous avez donc besoin de votre propre module PrestaShop : vous pouvez les ajouter à un module que vous avez déjà installé dans votre boutique ou en créer un nouveau uniquement à cet effet.
Créer un module pour enregistrer les hooks #
Il s’agit d’un module PrestaShop standard, sans rien de particulier : un nom technique qui lui est propre, une classe qui étend Module et, dans install(), l’enregistrement des hooks qui vous intéressent. Pour chaque hook enregistré, vous devez implémenter une méthode nommée hook + le nom du hook :
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class MiTiendaFinderHooks extends Module
{
public function __construct()
{
$this->name = 'mitiendafinderhooks';
$this->tab = 'administration';
$this->version = '1.0.0';
$this->author = 'Mi tienda';
$this->need_instance = 0;
$this->bootstrap = true;
parent::__construct();
$this->displayName = 'Paramètres de Finder';
$this->description = 'Paramètres personnalisés pour les données téléchargées par Finder';
$this->ps_versions_compliancy = ['min' => '1.6', 'max' => '9.999'];
}
public function install()
{
return parent::install()
&& $this->registerHook('sbFinderAfterGetSourceProduct');
// ajoutez ici les autres hooks dont vous avez besoin, voir la liste ci-dessous
}
public function uninstall()
{
return parent::uninstall();
}
public function hookSbFinderAfterGetSourceProduct(array &$params)
{
// votre logique ici
}
}Vous pouvez choisir librement le nom du module et de la classe. Ils doivent simplement être compatibles avec la version de PrestaShop utilisée par votre boutique, en PHP natif et sans dépendances Composer. Une fois le module créé, vous pouvez le compresser au format .zip et l’installer depuis le back office comme n’importe quel autre module, ou téléverser le dossier non compressé dans le dossier modules de votre boutique sur le serveur.
Hooks disponibles pour exclure des données avant de les interroger #
Ces trois hooks sont déclenchés juste avant que Finder construise la requête SQL pour chaque type de donnée. Ils permettent d’exclure des enregistrements complets en ajoutant des conditions à la requête :
- sbFinderBeforeObjectModelNumRowsDBQuery
- sbFinderBeforeObjectModelPaginateDBQuery
- sbFinderBeforeObjectModelSearchByFiltersAndSourceIdDBQuery
Les trois hooks reçoivent les mêmes paramètres : $params[‘model’] (une chaîne qui identifie ce qui est interrogé) et $params[‘query’] (un objet DbQuery de PrestaShop, passé par référence, auquel vous pouvez ajouter une condition where()). Les valeurs possibles de model sont : product, category, order, cms_category, cms, supplier, manufacturer, tag, attribute ou product_attribute (selon la version de PrestaShop), attribute_group, carrier, cart_rule, country, feature, feature_value, currency et group.
La table principale de la requête utilise toujours l’alias a (et, lorsque la requête effectue une jointure avec les langues ou les boutiques, ces alias sont l et s). Par exemple, pour exclure complètement certaines caractéristiques :
public function hookSbFinderBeforeObjectModelNumRowsDBQuery(array &$params)
{
$this->excludeFeatures($params['model'], $params['query']);
}
public function hookSbFinderBeforeObjectModelPaginateDBQuery(array &$params)
{
$this->excludeFeatures($params['model'], $params['query']);
}
public function hookSbFinderBeforeObjectModelSearchByFiltersAndSourceIdDBQuery(array &$params)
{
$this->excludeFeatures($params['model'], $params['query']);
}
private function excludeFeatures(string $model, DbQuery $query)
{
$excludedIds = [12, 15]; // IDs des caractéristiques que vous ne souhaitez pas indexer
if ($model === 'feature' && !empty($excludedIds)) {
$query->where('a.id_feature NOT IN (' . implode(', ', $excludedIds) . ')');
}
}Remarque : pour exclure complètement une donnée, vous devez enregistrer et gérer les trois hooks en même temps, car Finder les utilise à différents moments (pour compter les résultats, effectuer la pagination et effectuer des recherches par filtres).
Hooks disponibles pour modifier les données déjà récupérées #
Ces hooks sont déclenchés après que Finder a récupéré chaque type de donnée et avant de l’envoyer, un par source de données :
- Produits : sbFinderAfterGetSourceProduct
- Catégories : sbFinderAfterGetSourceCategory
- Commandes : sbFinderAfterGetSourceOrder
- Catégories de contenu (CMS) : sbFinderAfterGetSourceCMSCategory
- Pages de contenu (CMS) : sbFinderAfterGetSourceCMS
- Fournisseurs : sbFinderAfterGetSourceSupplier
- Fabricants : sbFinderAfterGetSourceManufacturer
- Étiquettes : sbFinderAfterGetSourceTag
- Attributs : sbFinderAfterGetSourceAttribute
- Déclinaisons de produits : sbFinderAfterGetSourceProductAttribute
- Groupes d’attributs : sbFinderAfterGetSourceAttributeGroup
- Transporteurs : sbFinderAfterGetSourceCarrier
- Règles de panier : sbFinderAfterGetSourceCartRule
- Pays : sbFinderAfterGetSourceCountry
- Caractéristiques : sbFinderAfterGetSourceFeature
- Valeurs des caractéristiques : sbFinderAfterGetSourceFeatureValue
- Devises : sbFinderAfterGetSourceCurrency
- Groupes de clients : sbFinderAfterGetSourceGroup
Tous reçoivent $params[‘records’] : un tableau contenant les enregistrements de cette page, passé par référence, que vous pouvez parcourir et modifier directement. Chaque enregistrement contient notamment les clés meta_keys (par exemple l’id_product d’origine), texts (un tableau contenant une entrée {iso, name, value} pour chaque champ traduisible et chaque langue) et platform_attributes (les autres colonnes de la boutique : prix, stock, statut actif, images, caractéristiques, etc., selon le type de donnée).
Par exemple, pour compléter la description courte d’un produit en espagnol avec des informations supplémentaires avant que Finder ne l’indexe :
public function hookSbFinderAfterGetSourceProduct(array &$params)
{
$products = &$params['records'];
foreach ($products as &$product) {
$extra = $this->getExtraKeywordsForProduct($product);
if (empty($extra) || empty($product['texts'])) {
continue;
}
foreach ($product['texts'] as &$text) {
if ($text['name'] === 'description_short' && $text['iso'] === 'es') {
$text['value'] = trim($text['value'] . '. ' . implode(', ', $extra));
}
}
}
}Par exemple, pour masquer des résultats de recherche un produit qui remplit une condition spécifique à votre boutique, sans le désactiver dans le catalogue :
public function hookSbFinderAfterGetSourceProduct(array &$params)
{
$products = &$params['records'];
foreach ($products as &$product) {
if ($this->shouldBeHiddenFromSearch($product)) {
$product['platform_attributes']['active'] = false;
}
}
}Bonnes pratiques #
- Les hooks « après récupération des données » reçoivent une page entière en une seule fois, et non un enregistrement à la fois. Si vous devez interroger la base de données dans le hook, faites-le une seule fois pour tous les IDs de la page (par exemple avec un WHERE id_product IN (…)) plutôt que d’effectuer une requête par produit.
- Modifiez uniquement les clés qui existent déjà dans l’enregistrement (texts, platform_attributes, etc.) ; ne modifiez pas la structure générale attendue par Finder.
- Pour exclure complètement une donnée, il est plus efficace de le faire avec les hooks « avant interrogation » (elle ne sera ainsi pas téléchargée) plutôt que de la filtrer après coup avec un hook « après récupération des données ».
- Testez vos modifications avec un produit de contrôle avant de les mettre en production.
Besoin d’aide ? #
Si vous avez des questions après avoir consulté la documentation ou si vous avez besoin d’aide pour un cas concret, contactez-nous.