Funcionamiento de la exportación del catálogo¶
Visión general del pipeline¶
ExportConfig (instantánea de configuración por exportador)
└── CatalogExportService::processNextChunk()
├── Adquiere bloqueo de archivo (export.lock) — evita ejecuciones concurrentes
├── Lee state.json — rastrea current_chunk, processed_products, status
├── ProductFetcher::retrieve($config, $offset, $limit) — obtiene una página de productos
├── Para cada ProductRowEnricherInterface:
│ └── enrich($rows, $config) — añade/transforma columnas
├── Para cada ExportType (FULL, LANG, COUNTRY):
│ └── CsvChunkWriter::write(chunkPath, filteredRows, isFirstChunk)
├── Actualiza state.json
└── Si es el último fragmento: assembleChunks() → renombra el archivo de fragmento al archivo de salida
ExportConfig¶
Un objeto de valor de solo lectura pasado a través del pipeline. Construido por el comando de consola de Symfony CatalogExport desde la entidad FbpCatalogExporter y la FbpPixelSetting de la tienda.
Campos clave: exportId, token, shopId, langId, currencyId, countryId, productsPerChunk, isStorePerChunkEnabled, exportCombinations, gtinField, categoryIds, manufacturerIds, supplierIds.
ProductFetcher¶
Consulta la base de datos de PS en busca de productos que coincidan con los filtros de la configuración de exportación (categorías, fabricantes, proveedores, stock). Devuelve un array de filas de productos sin procesar. Los resultados se almacenan en caché.
Pipeline de enriquecedores¶
ProductRowEnricherInterface — implementa esta interfaz para añadir o transformar columnas en las filas de productos antes de que se escriban en CSV.
interface ProductRowEnricherInterface
{
/** @param array<array<string, mixed>> $rows
* @return array<array<string, mixed>> */
public function enrich(array $rows, ExportConfig $config): array;
}
Registra los enriquecedores como servicios de Symfony etiquetados con fabfacebookpixel.catalog_enricher.
ExportType¶
Un enum respaldado de PHP 8.1 con tres casos:
| Caso | Archivo de salida | Columnas |
|---|---|---|
FULL |
feed_{token}.csv |
Todas las columnas del catálogo (id, title, description, image_link, price, gtin, brand, size, color, etc.) |
LANG |
language_{token}.csv |
Columnas de anulación específicas del idioma (id, title, description, product_type, link, override) |
COUNTRY |
country_{token}.csv |
Columnas de anulación de precios específicas del país (id, price, sale_price, override, link) |
Modo de fragmentos y disposición del sistema de archivos¶
Todos los archivos de trabajo de una exportación se almacenan en modules/fabfacebookpixel/var/export/{exportId}/:
| Archivo | Descripción |
|---|---|
export.lock |
Creado al inicio del fragmento, eliminado al completarse. Evita ejecuciones concurrentes. |
state.json |
Estado JSON: status, current_chunk, processed_products, started_at, completed_at |
chunk_full.csv |
CSV acumulado durante la exportación por fragmentos |
chunk_lang.csv |
CSV acumulado (tipo LANG) |
chunk_country.csv |
CSV acumulado (tipo COUNTRY) |
feed_{token}.csv |
Salida final (FULL) — presente solo después de que la exportación se completa |
language_{token}.csv |
Salida final (LANG) |
country_{token}.csv |
Salida final (COUNTRY) |
Cuando se inicia un nuevo ciclo de exportación y el estado anterior es complete, todos los archivos se eliminan y el proceso comienza desde cero.
Comando de consola de Symfony¶
- Sin
--token: procesa todos los exportadores configurados. - Con
--token: procesa solo el exportador que coincide con ese token. - Sin
--all: procesa un fragmento por exportador (seguro para cron). - Con
--all: itera hasta que la exportación esté completa (adecuado para regeneración completa manual).
Endpoints HTTP¶
CatalogExportController — procesamiento por fragmentos¶
GET /module/fabfacebookpixel/catalogexport?token={token}
Ejecuta php bin/console fbp:catalog-export --token={token} (bloqueante, un fragmento), luego lee state.json y devuelve el progreso. El poller JavaScript llama a este endpoint repetidamente hasta que el estado es complete, y entonces obtiene el archivo a través de catalogfeed.
Requiere que exec() esté habilitado en PHP.
- Si falta el token: HTTP 400
- Si el token no coincide con ningún exportador: HTTP 404
- Si el comando termina con código de salida distinto de cero: HTTP 500
- En caso contrario: HTTP 200 con JSON
{ status, currentChunk, processedProducts }
status es uno de idle, in_progress o complete. El endpoint siempre devuelve JSON — nunca transmite un archivo CSV.
CatalogfeedController — solo descarga¶
GET /module/fabfacebookpixel/catalogfeed?token={token}&type={full|lang|country}
Sirve el archivo de salida pregenerado. No activa la generación de la exportación.
- Si el archivo de salida no existe (exportación no ejecutada aún): HTTP 404
- Si el archivo existe: transmite el CSV como
Content-Type: text/csv