Fonctionnement de l'export catalogue¶
Vue d'ensemble du pipeline¶
ExportConfig (instantané de configuration par exporteur)
└── CatalogExportService::processNextChunk()
├── Acquiert le verrou de fichier (export.lock) — empêche les exécutions concurrentes
├── Lit state.json — suit current_chunk, processed_products, status
├── ProductFetcher::retrieve($config, $offset, $limit) — récupère une page de produits
├── Pour chaque ProductRowEnricherInterface :
│ └── enrich($rows, $config) — ajoute/transforme des colonnes
├── Pour chaque ExportType (FULL, LANG, COUNTRY) :
│ └── CsvChunkWriter::write(chunkPath, filteredRows, isFirstChunk)
├── Met à jour state.json
└── Si dernier fragment : assembleChunks() → renomme le fichier de fragment en fichier de sortie
ExportConfig¶
Un objet valeur en lecture seule passé à travers le pipeline. Construit par la commande console Symfony CatalogExport depuis l'entité FbpCatalogExporter et le FbpPixelSetting de la boutique.
Champs clés : exportId, token, shopId, langId, currencyId, countryId, productsPerChunk, isStorePerChunkEnabled, exportCombinations, gtinField, categoryIds, manufacturerIds, supplierIds.
ProductFetcher¶
Interroge la base de données PS pour les produits correspondant aux filtres de la configuration d'export (catégories, fabricants, fournisseurs, stock). Retourne un tableau de lignes de produits brutes. Les résultats sont mis en cache.
Pipeline d'enrichisseurs¶
ProductRowEnricherInterface — implémentez cette interface pour ajouter ou transformer des colonnes dans les lignes de produits avant qu'elles ne soient écrites dans le CSV.
interface ProductRowEnricherInterface
{
/** @param array<array<string, mixed>> $rows
* @return array<array<string, mixed>> */
public function enrich(array $rows, ExportConfig $config): array;
}
Enregistrez les enrichisseurs comme services Symfony étiquetés avec fabfacebookpixel.catalog_enricher.
ExportType¶
Un enum PHP 8.1 avec trois cas :
| Cas | Fichier de sortie | Colonnes |
|---|---|---|
FULL |
feed_{token}.csv |
Toutes les colonnes du catalogue (id, title, description, image_link, price, gtin, brand, size, color, etc.) |
LANG |
language_{token}.csv |
Colonnes de remplacement spécifiques à la langue (id, title, description, product_type, link, override) |
COUNTRY |
country_{token}.csv |
Colonnes de remplacement de prix spécifiques au pays (id, price, sale_price, override, link) |
Mode fragments et organisation du système de fichiers¶
Tous les fichiers de travail d'un export sont stockés dans modules/fabfacebookpixel/var/export/{exportId}/ :
| Fichier | Description |
|---|---|
export.lock |
Créé au début du fragment, supprimé à la fin. Empêche les exécutions concurrentes. |
state.json |
État JSON : status, current_chunk, processed_products, started_at, completed_at |
chunk_full.csv |
CSV en cours d'accumulation lors de l'export fragmenté |
chunk_lang.csv |
CSV en cours d'accumulation (type LANG) |
chunk_country.csv |
CSV en cours d'accumulation (type COUNTRY) |
feed_{token}.csv |
Sortie finale (FULL) — présent uniquement après la fin de l'export |
language_{token}.csv |
Sortie finale (LANG) |
country_{token}.csv |
Sortie finale (COUNTRY) |
Lorsqu'un nouveau cycle d'export démarre et que l'état précédent est complete, tous les fichiers sont supprimés et le processus repart de zéro.
Commande console Symfony¶
- Sans
--token: traite tous les exporteurs configurés. - Avec
--token: traite uniquement l'exporteur correspondant à ce token. - Sans
--all: traite un fragment par exporteur (sûr pour le cron). - Avec
--all: boucle jusqu'à la fin de l'export (adapté à la régénération complète manuelle).
Endpoints HTTP¶
CatalogExportController — traitement par fragments¶
GET /module/fabfacebookpixel/catalogexport?token={token}
Exécute php bin/console fbp:catalog-export --token={token} (bloquant, un fragment), puis lit state.json et retourne la progression. Le poller JavaScript appelle cet endpoint de manière répétée jusqu'à ce que le statut soit complete, puis récupère le fichier via catalogfeed.
Nécessite que exec() soit activé en PHP.
- Si le token est absent : HTTP 400
- Si le token ne correspond à aucun exporteur : HTTP 404
- Si la commande se termine avec un code de sortie non nul : HTTP 500
- Sinon : HTTP 200 avec JSON
{ status, currentChunk, processedProducts }
status est l'un des suivants : idle, in_progress ou complete. L'endpoint retourne toujours du JSON — il ne diffuse jamais un fichier CSV.
CatalogfeedController — téléchargement uniquement¶
GET /module/fabfacebookpixel/catalogfeed?token={token}&type={full|lang|country}
Sert le fichier de sortie pré-généré. Ne déclenche pas la génération de l'export.
- Si le fichier de sortie n'existe pas (export non encore exécuté) : HTTP 404
- Si le fichier existe : diffuse le CSV en
Content-Type: text/csv