Funzionamento dell'export catalogo¶
Panoramica del pipeline¶
ExportConfig (snapshot di configurazione per esportatore)
└── CatalogExportService::processNextChunk()
├── Acquisisce il lock sul file (export.lock) — impedisce esecuzioni concorrenti
├── Legge state.json — tiene traccia di current_chunk, processed_products, status
├── ProductFetcher::retrieve($config, $offset, $limit) — recupera una pagina di prodotti
├── Per ogni ProductRowEnricherInterface:
│ └── enrich($rows, $config) — aggiunge/trasforma colonne
├── Per ogni ExportType (FULL, LANG, COUNTRY):
│ └── CsvChunkWriter::write(chunkPath, filteredRows, isFirstChunk)
├── Aggiorna state.json
└── Se ultimo frammento: assembleChunks() → rinomina il file frammento in file di output
ExportConfig¶
Un oggetto valore di sola lettura passato attraverso il pipeline. Costruito dal comando console Symfony CatalogExport dall'entità FbpCatalogExporter e dal FbpPixelSetting del negozio.
Campi chiave: exportId, token, shopId, langId, currencyId, countryId, productsPerChunk, isStorePerChunkEnabled, exportCombinations, gtinField, categoryIds, manufacturerIds, supplierIds.
ProductFetcher¶
Interroga il database PS per i prodotti che corrispondono ai filtri della configurazione di esportazione (categorie, produttori, fornitori, stock). Restituisce un array di righe di prodotti grezze. I risultati vengono memorizzati nella cache.
Pipeline degli enricher¶
ProductRowEnricherInterface — implementa questa interfaccia per aggiungere o trasformare colonne nelle righe di prodotto prima che vengano scritte nel CSV.
interface ProductRowEnricherInterface
{
/** @param array<array<string, mixed>> $rows
* @return array<array<string, mixed>> */
public function enrich(array $rows, ExportConfig $config): array;
}
Registra gli enricher come servizi Symfony etichettati con fabfacebookpixel.catalog_enricher.
ExportType¶
Un enum PHP 8.1 con tre casi:
| Caso | File di output | Colonne |
|---|---|---|
FULL |
feed_{token}.csv |
Tutte le colonne del catalogo (id, title, description, image_link, price, gtin, brand, size, color, ecc.) |
LANG |
language_{token}.csv |
Colonne di override specifiche per la lingua (id, title, description, product_type, link, override) |
COUNTRY |
country_{token}.csv |
Colonne di override dei prezzi specifiche per il paese (id, price, sale_price, override, link) |
Modalità frammenti e layout del filesystem¶
Tutti i file di lavoro per un'esportazione sono memorizzati in modules/fabfacebookpixel/var/export/{exportId}/:
| File | Descrizione |
|---|---|
export.lock |
Creato all'inizio del frammento, eliminato al completamento. Impedisce esecuzioni concorrenti. |
state.json |
Stato JSON: status, current_chunk, processed_products, started_at, completed_at |
chunk_full.csv |
CSV in accumulo durante l'esportazione a frammenti |
chunk_lang.csv |
CSV in accumulo (tipo LANG) |
chunk_country.csv |
CSV in accumulo (tipo COUNTRY) |
feed_{token}.csv |
Output finale (FULL) — presente solo dopo il completamento dell'esportazione |
language_{token}.csv |
Output finale (LANG) |
country_{token}.csv |
Output finale (COUNTRY) |
Quando un nuovo ciclo di esportazione inizia e lo stato precedente è complete, tutti i file vengono eliminati e il processo riparte da zero.
Comando console Symfony¶
- Senza
--token: elabora tutti gli esportatori configurati. - Con
--token: elabora solo l'esportatore corrispondente a quel token. - Senza
--all: elabora un frammento per esportatore (sicuro per cron). - Con
--all: esegue un loop fino al completamento dell'esportazione (adatto per la rigenerazione completa manuale).
Endpoint HTTP¶
CatalogExportController — elaborazione per frammenti¶
GET /module/fabfacebookpixel/catalogexport?token={token}
Esegue php bin/console fbp:catalog-export --token={token} (bloccante, un frammento), poi legge state.json e restituisce il progresso. Il poller JavaScript chiama questo endpoint ripetutamente finché lo stato non è complete, quindi recupera il file tramite catalogfeed.
Richiede che exec() sia abilitata in PHP.
- Se il token è assente: HTTP 400
- Se il token non corrisponde a nessun esportatore: HTTP 404
- Se il comando termina con codice di uscita diverso da zero: HTTP 500
- Altrimenti: HTTP 200 con JSON
{ status, currentChunk, processedProducts }
status è uno tra idle, in_progress o complete. L'endpoint restituisce sempre JSON — non invia mai un file CSV.
CatalogfeedController — solo download¶
GET /module/fabfacebookpixel/catalogfeed?token={token}&type={full|lang|country}
Serve il file di output pre-generato. Non attiva la generazione dell'esportazione.
- Se il file di output non esiste (esportazione non ancora eseguita): HTTP 404
- Se il file esiste: invia il CSV come
Content-Type: text/csv