Vai al contenuto

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

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