Aller au contenu

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

php bin/console fbp:catalog-export [--token=TOKEN] [--all]
  • 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