Saltar a contenido

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

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