¿Cómo exportar productos de Prestashop a un archivo CSV?

Es posible que en algún momento, requiera exportar productos de Prestashop 1.6 en CSV, y no sepa cómo hacerlo, y es donde este material viene de perlas, pues mostraremos las fórmulas que deben tenerse a mano y que nunca deben faltar cuando se posee un comercio en línea basado en Prestashop, y se desee pasar a un archivo CSV, por diversas razones, como tener una copia, migrar productos a otra tienda, entre otros.

Cómo exportar productos de Prestashop a un archivo CSV 

Como bien se sabe, Prestashop aplica básicamente para almacenar un gran volumen de información de tiendas en línea, por cuanto supone una eficiente herramienta de importación CSV. No obstante, cuando pretende ubicar datos de algún rubro en un archivo CSV, según el volumen de datos que se deseen, puede desconcertar y complicarle la obtención del total de campos permitidos por la importación. Siendo en este escenario, donde adquiere importancia saber como exportar productos de prestashop 1.7 en CSV, por ejemplo.

Pese a que Prestashop cuenta con comando especial de exportación, como es el catálogo > productos, no obstante, este comando no se puede hacer a la totalidad de datos del rubro, dejando por fuera muchas descripciones fundamentales, combinaciones, marcas, entre otros datos de interés.

Ello en vista que de ciertamente, ofrece un archivo CSV de los productos, pero desafortunadamente solamente contiene los campos dispuestos en la lista de Back Office, con la identificación, imagen de portada, nombre, referencia, categorías predeterminadas, precio base, precio final, cantidad y estado activo.

Mientras que al poder exportar productos de Prestashop, adicional a la importación, se pueden gestionar tipos, conjuntos, usuarios, direcciones, manufacturas y proveedores, además de obtener informes bajo plantillas CSV de forma sencilla, gracias a SQL Manager, ideal para consultar dicha base y lograr resultados en CSV. Pese a que el administrador de SQL, es de gran utilidad, ofrece capacidades limitadas, y no resulta tan sencillo de usar, cuando no se tiene dominio de MySQL.

Adicional a lo anterior, seguramente se requiera exportar imágenes del rubro, u otros campos que permite la herramienta de importación CSV, en cuyo caso, también es oportuno saber exportar productos de Prestashop, pudiendo usar alternativas sin costo, además de plantillas y vídeos que pueden ser de gran ayuda. Pero se debe aclarar, que en estos casos, deben armarse rompecabezas con toda esa información, porque estas fuentes raramente aportar toda la información necesaria.

Cómo debería funcionar la exportación de productos en Prestashop

El tema central de este post sobre exportar productos de Prestashop, a cuyos fines es dar otra visión práctica adicional al botón de exportación de Back Office> Catálogo> Productos de salida de un archivo CSV, contentivo de los campos de rubros que se pueden traer con CSV. Por lo cual, en esta entrada se presentarán muchos códigos, fórmulas o números, que se ven temerosas; pero vale la pena estudiarlo, pues la solución y practicidad la convertirá en la mejor aliada.

Como abreboca de lo que vendrá más adelante, se observará que en Prestashop se ubica una lista que contiene aquellos campos compatibles, cuando se ingresa a Back Office> Parámetros avanzados> Importar CSV, donde se bebe optar por la entidad para importar productos, dispuesta a la derecha, en la sección campos disponibles. Adicionalmente, cuando se quiera observar cómo se visualizará un archivo CSV como este, sólo hay que desplazarse hacia abajo en descargar archivos CSV de muestra, pinchando en el archivo productos de muestra

Empecemos

Vale resaltar, que el lector puede optar por aquella guía que aplique a su necesidad en particular, pues como se observará a lo largo de este post, se explicarán diversas propuestas para exportar productos de Prestashop. Y para ello, comencemos el viaje de las directrices a seguir para obtener los resultados esperados. Primeramente, se requiere desactivar el AdminProductsController, generar un archivo /override/controllers/admin/AdminProductsController.phpy, a fin de adicionar el siguiente código:

/override/controllers/admin/AdminProductsController.phpPHP<?php class AdminProductsController extends AdminProductsControllerCore{public function processExport($text_delimiter = ‘»‘){$this->_orderBy = ‘id_product’; // Reference is Reference #$this->_select .= ‘, a.`reference`, ‘;$this->fields_list[‘reference’][‘title’] = ‘Reference #’;// YOUR EXPORT FIELDS CODE HERE parent::processExport($text_delimiter);}}<?phpclass AdminProductsController extends adminProductsControllerCore{public function processExport($text_delimiter = ‘»‘).

Con estos códigos, se amplia la processExport(), cuya función se activa al pinchar para la exportación. Donde, primeramente, hay que cerciorarse de que los productos se ordenen según su identidad. La referencia se encuentra ahí porque no se especificó de manera predeterminada sobre la tabla para su recuperación, una se adicionen las diversas combinaciones para los campos alternos, dejando de tomar los datos de referencia.

Por tanto, para exportar productos de Prestashop lo conveniente, es seleccionar dicha tabla, en el alias de la ps_producttabla. Además de modificar el nombre del campo en referencia #, a fin de que coincida con la herramienta de importación CSV. Asimismo, con el propósito de comprobar que se usa su controlador anulado, hay que eliminar el archivo cache/class_index.php.

¿Qué pasa si me dirijo a ese directorio y el fichero ya existe?

Posiblemente, la plantilla ya se haya creado en el archivo para sobrecolar el AdminProductsController.php. Ante lo cual, habrá que agregar este contenido previo al cierre de la etiqueta de PHP ( ?> ); en cuyo supuesto, se sugiere hacer una copia de seguridad de dicho archivo antes de su edición, es decir, no sea que no funcione bien; de este modo, siempre se puede restaurar el archivo original. Por ello, una vez se consiga lo que se requiere, en el enlace de las imágenes del producto, usando la función processExport() se debe agregar la siguiente codificación:

Image URLs (x,y,z…)PHP// Image URLs (x,y,z…)$this->fields_list[‘image’] = array(‘title’ => $this->l(‘Image URLs (x,y,z…)’),’callback’ => ‘exportAllImagesLink’);// Image URLs (x,y,z…)$this->fields_list[‘image’] = array(‘title’ => $this->l(‘Image URLs (x,y,z…)’),’callback’ => ‘exportAllImagesLink’).

Donde además se puede crear una función fija en exportAllImagesLink(), así como sigue:

Gets all product images linkPHP public static function exportAllImagesLink($cover, $row, $delimiter = ‘,’){if (empty($row) || empty($row[‘id_product’]) || empty($row[‘id_image’])) {return;}$id_product = (int) $row[‘id_product’];$id_shop = Context::getContext()->shop->id; $query = new DbQuery();$query->select(‘i.id_image’)->from(‘image’, ‘i’); $query->leftJoin(‘image_shop’, ‘is’, ‘i.id_image = is.id_image AND is.id_shop = ‘ . $id_shop); $query->where(‘i.id_product = ‘ .

$id_product)->orderBy(‘i.cover DESC, i.position ASC’); $images = Db::getInstance()->executeS($query); foreach ($images as $image) {if (Configuration::get(‘PS_LEGACY_IMAGES’)) {$links[] = Tools::getShopDomain(true) . _THEME_PROD_DIR_ . $id_product . ‘-‘ . $image[‘id_image’] . ‘.jpg’;} else {$links[] = Tools::getShopDomain(true) . _THEME_PROD_DIR_ .image::getImgFolderStatic($image[‘id_image’]) . $image[‘id_image’] . ‘.jpg’;}}return implode($delimiter, $links);} public static function exportAllImagesLink($cover, $row, $delimiter = ‘,’).

Esta función, obedece al enlace de la imagen de portada primeramente, por ello hay que consultar la base de datos para el resto de la identificación de las imágenes, diseñando los respectivos enlaces, para después enlazarlos con comas.

Exportar todas las imágenes del producto

Para exportar productos de Prestashop, especialmente, imágenes de los mismos, lo principal son los o el vínculo del total de las imágenes del o los rubros, para ello existe la función processExport(), agregando los siguientes códigos:

Image URLs (x,y,z…)PHP// Image URLs (x,y,z…)$this->fields_list[‘image’] = array(‘title’ => $this->l(‘Image URLs (x,y,z…)’),‘callback’ => ‘exportAllImagesLink’); // Image URLs (x,y,z…)$this->fields_list[‘image’] = array(‘title’ => $this->l(‘Image URLs (x,y,z…)’), ‘callback’ => ‘exportAllImagesLink’).




Además de lo anterior, se puede crear una función fija con exportAllImagesLink(), así como sigue:

Gets all product images linkPHP public static function exportAllImagesLink($cover, $row, $delimiter = ‘,’){if (empty($row) ||empty($row[‘id_product’]) || empty($row[‘id_image’])) {return;} $id_product = (int) $row[‘id_product’]; $id_shop = context::getContext()->shop->id; $query = new DbQuery(); $query->select(‘i.id_image’)->from(‘image’, ‘i’); $query->leftJoin(‘image_shop’, ‘is’, ‘i.id_image = is.id_image AND is.id_shop = ‘ . $id_shop); $query->where(‘i.id_product = ‘ . $id_product)->orderBy(‘i.cover DESC, i.position ASC’); $images = Db::getInstance()->executeS($query);

foreach ($images as $image) {if (Configuration::get(‘PS_LEGACY_IMAGES’)) {$links[] = Tools::getShopDomain(true). _THEME_PROD_DIR_ . $id_product . ‘-‘ . $image[‘id_image’] . ‘.jpg’; } else {$links[] = Tools::getShopDomain(true). _THEME_PROD_DIR_ . Image::getImgFolderStatic($image[‘id_image’]) . $image[‘id_image’] . ‘.jpg’; }}return implode($delimiter, $links);}public static function exportAllImagesLink($cover, $row, $delimiter = ‘,’){if (empty($row) || empty($row[‘id_product’]) || empty($row[‘id_image’])) {return;}$id_product = (int) $row[‘id_product’].

$id_shop = Context::getContext()->shop->id; $query = new DbQuery();$query->select(‘i.id_image’)->from(‘image’, ‘i’);$query->leftJoin(‘image_shop’, ‘is’, ‘i.id_image = is.id_image AND is.id_shop = ‘ . $id_shop); $query->where(‘i.id_product = ‘ . id_product)->orderBy(‘i.cover DESC, i.position ASC’);$images = Db::getInstance()->executeS($query); foreach ($images as $image) {if (Configuration::get(‘PS_LEGACY_IMAGES’)) {$links[] = Tools::getShopDomain(true).

_THEME_PROD_DIR_ . $id_product . ‘-‘ . $image[‘id_image’] . ‘.jpg’;} else {$links[] = Tools::getShopDomain(true). _THEME_PROD_DIR_ . Image::getImgFolderStatic($image[‘id_image’]) . $image[‘id_image’] . ‘.jpg’;}}return implode($delimiter, $links);}.

Dicha función señala el vínculo de la imagen de portada como primera fase, debiendo consultar la base de datos para la siguientes identificación de las imágenes, requiriendo además, construir los enlaces, para después enlazarlos con comas.

Campo Eliminar imágenes existentes (0 = No, 1 = Sí)

En virtud de que este campo no se encuentra en la base de datos; es posible ajustarlo a 0, o 1 si se pretenden mantener o erradicar las imágenes preexistentes de algún producto. En nuestra caso, se establecerán en 0, basado en processExport(), donde se debe adicionar la siguiente codificación:

Delete existing images (0 = No, 1 = Yes)PHP// Delete existing images (0 = No, 1 = Yes) $this->_select .= ‘0 AS delete_images, ‘;$this->fields_list[‘delete_images’] = array(‘title’ => $this->l(‘Delete existing images (0 = No, 1 = Yes)’));// Delete existing images (0 = No, 1 = Yes)$this->_select .= ‘0 AS delete_images, ‘;$this->fields_list[‘delete_images’] = array(‘title’ => $this->l(‘Delete existing images (0 = No, 1 = Yes)’.

Haga que todos los campos coincidan con los de la herramienta de importación CSV

Para lograr que todo los campos coincidan con la herramienta para exportar productos de Prestashop, se debe seguir la siguiente función de processExport(), agregando lo siguiente:

Rename fieldsPHP // Status is Active (0/1)$this->fields_list[‘active’][‘title’] = ‘Active (0/1)’;// Base price is Price tax excluded $this->fields_list[‘price’][‘title’] = ‘Price tax excluded’; // Final price is Price tax included$this->fields_list[‘price_final’][‘title’] = ‘Price tax included’;// Status is Active (0/1)$this->fields_list[‘active’][‘title’] = ‘Active (0/1)’.

// Base price is Price tax excluded $this->fields_list[‘price’][‘title’] = ‘Price tax excluded’; // Final price is Price tax included $this->fields_list[‘price_final’][‘title’] = ‘Price tax included’.

Ordene los campos para asignarlos fácilmente en productos de importación CSV

Para ordenar los campos, lo ideal es usar la herramienta para la importación CSV, por se muy fácil de usar ordenarse los campos deseados en la respectiva columna. Donde dicha columna se le puede asignar yendo al menú desplegable referido al campo que representa actualmente.

En vista de que se han adicionado los campos compatibles en el archivo CSV, hay que seleccionar las columnas aleatoriamente, lo que tomará algún tiempo en asignarle el total de campos correspondientes. Por tanto, hay que ordenar todas las columnas para que coincidan con el orden prefijado en los campos de herramientas de importación CSV. La función que se usará, es la siguiente processExport() con los respectivos códigos:

Sort CSV fieldsPHP static::sortCSVfields($this->fields_list); static::sortCSVfields($this->fields_list); Y crea una función estática sortCSVfields(): Sort CSV fields to default orderPHP public static function sortCSVfields(&$fields){ksort($fields);$positions =array(2, 27, 53, 40, 39, 38, 37, 47, 48, 41, 44, 54, 22, 31, 9, 11, 10, 12, 17, 19, 45, 21, 1, 52, 6, 55, 43, 36, 16, 35, 34, 33, 25, 3, 4, 8, 46, 51, 5, 56, 13, 24, 30, 42, 15, 14, 32, 50, 29, 28, 18, 49, 26, 23, 7, 20); array_multisort($positions, $fields);}public static functions ortCSVfields(&$fields){ksort($fields).

$positions = array(2, 27, 53, 40, 39, 38, 37, 47, 48, 41, 44, 54, 22, 31, 9, 11, 10, 12, 17, 19, 45, 21, 1, 52, 6, 55, 43, 36, 16, 35, 34, 33, 25, 3, 4, 8, 46, 51, 5, 56, 13, 24, 30, 42, 15, 14, 32, 50, 29, 28, 18, 49, 26, 23, 7, 20);array_multisort($positions, $fields);}.

En vista de existe una columna predeterminada para el Impuesto de precio excluido, esta se debe disponer como la última; donde el botón de exportar productos de Prestashop, operará como se esperaba.

Puedes acceder a temas similares, y reforzar conocimientos sobre el tema, en los siguientes enlaces:

Deja un comentario