Cuando desea insertar una gran cantidad de datos en su tienda, PrestaShop proporciona una buena manera de usar la herramienta de importación de CSV, pero cuando desea obtener los datos del producto en un archivo CSV que luego podría usarse con la herramienta de importación de CSV, dependiendo de En cuanto a la cantidad de datos del producto que necesita, es más probable que se desconcierte de lo mucho más complicado que es obtener todos los campos que admite la importación del producto.

Lo primero que podría haber intentado es ir a Back Office> Catálogo> Productos y hacer clic en el pequeño botón de exportación de la parte superior derecha de la sección que enumera todos los productos.

Eso le da un archivo CSV con sus productos, pero decepcionantemente contiene solo los campos que ve en la lista de Back Office. Tiene ID, solo imagen de portada, nombre, referencia, solo categoría predeterminada, precio base, precio final, cantidad y estado activo. Así es como comienza la búsqueda del resto de los datos.

La herramienta de Importación de CSV, además de importar productos, también puede manejar categorías, combinaciones, clientes, direcciones, fabricantes y proveedores, y la forma más fácil de obtener datos en formato CSV es mediante la herramienta Administrador de SQL , que le permite consultar la base de datos y obtener El resultado en un archivo CSV. Aunque el Administrador de SQL es muy útil, también está limitado en sus capacidades y es difícil de usar sin algún conocimiento de MySQL.

Nemo tiene un excelente artículo sobre cómo exportar productos usando el Administrador de SQL, pero con el Administrador de SQL no puede exportar imágenes de productos y datos como descuentos de productos, categorías, características, etiquetas que es complicado obtener .

Lo más probable es que necesitara exportar las imágenes del producto o muchos de los otros campos que admite la herramienta de importación CSV y hay algunas soluciones gratuitas si comienza a excavar, módulos y tutoriales, pero a menudo no funcionan completamente y tiene que combinar bits de piezas de diferentes fuentes para hacer algo que tipo de obras.

Una alternativa sería comprar un módulo de exportación en PrestaShop Addons Marketplace , pero cuando solo necesite uno o dos campos adicionales (como imágenes de productos), podría encontrarlo injustificable.

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

El objetivo de este artículo es hacer que el botón de exportación de Back Office> Catálogo> Productos de salida de un archivo CSV con todos los campos de productos que se pueden importar con la herramienta Importar CSV .
Puede ver una lista con todos los campos compatibles si va a Back Office> Advance Parameters> CSV Import y selecciona la entidad a importar para que sea Productos , a la derecha, hay la sección de Campos disponibles .

Además, si desea ver el aspecto de un archivo CSV como este, desplácese a la sección Descargar archivos CSV de muestra y haga clic en el archivo de Productos de muestra .

Esto no incluye combinaciones (ver archivo Combinaciones de muestra).
El archivo CSV que se obtendrá al seguir este tutorial NO contendrá combinaciones.

Por supuesto, si no necesita todos los campos, puede elegir los que desee.

Fork en GitHub
El código implementado a continuación está disponible en GitHub

Empecemos

Necesitamos anular el AdminProductsController , crear un archivo /override/controllers/admin/AdminProductsController.phpy agregar el siguiente código:

<?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);
    }
 
}

Esto amplía la processExport()función que se llama cuando hacemos clic en el botón de exportación. Primero, nos aseguramos de que los productos sean ordenados por su identificación. La parte de referencia está allí porque no se especificó de forma predeterminada de qué tabla se recuperará y cuando agregamos varias combinaciones para los campos adicionales, deja de obtener los datos de referencia. Así que le decimos explícitamente que lo seleccione de la atabla, que es el alias de ps_producttabla. También cambiamos el nombre del campo en Referencia # para que coincida con la herramienta de importación CSV.

Para asegurarse de que se utiliza el controlador anulado, debe eliminar el archivo. cache/class_index.php

Exportar todas las imágenes del producto.

En primer lugar, obtengamos lo que más se busca, todas las imágenes de productos se vinculan.
En la función processExport()agregar:

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

Y crea una función estática exportAllImagesLink():

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);
}

La función anterior establece primero el enlace de la imagen de portada, consulta la base de datos para el resto de la identificación de las imágenes, construye los enlaces y luego los une mediante comas.

Consigue que todas las categorías de productos estén asignadas a.

Por defecto, solo obtiene el nombre de la categoría predeterminada, así que vamos a obtenerlos todos.
En la función processExport()agregar:

// Categories (x,y,z...)
$this->fields_list['name_category'] = array(
    'title' => $this->l('Categories (x,y,z...)'),
    'callback' => 'exportAllProductCategories'
);

Y crea una función estática exportAllProductCategories():

public static function exportAllProductCategories($defaultCategory, $row, $delimiter = ',')
{
    if (empty($row) || empty($row['id_product'])) return;

    $id_product = (int) $row['id_product'];
    $id_lang = Context::getContext()->language->id;
    $id_shop = Context::getContext()->shop->id;

    $query = new DbQuery();
    $query->select('cl.name')->from('category_lang', 'cl');
    $query->leftJoin('category_shop', 'cs', 'cl.id_category = cs.id_category AND cs.id_shop = ' . $id_shop);
    $query->leftJoin('category_product', 'cp', 'cl.id_category = cp.id_category AND cp.id_product = ' . $id_product);
    $query->leftJoin('product', 'p', 'cp.id_product = p.id_product');
    $query->where('cl.id_lang = ' . $id_lang . ' AND p.id_category_default != cl.id_category');

    $categories = array($defaultCategory); // the first category is the default one
    foreach (Db::getInstance()->executeS($query) as $category) {
        $categories[] = $category['name'];
    }

    return implode($delimiter, $categories);
}

La función anterior establece la categoría predeterminada como primera, consulta la base de datos para el resto del nombre de las categorías y luego las une mediante comas.

Si tiene varias categorías con el mismo nombre, es posible que desee exportar las ID de categorías para poder identificar correctamente las categorías cuando decida importar los productos (quizás vuelva a la misma tienda o una tienda nueva en la que haya importado también) las categorías con el mismo id).

La devolución de llamada en este caso debe apuntar a exportAllProductCategoriesId:

// Categories (x,y,z...)
$this->fields_list['name_category'] = array(
    'title' => $this->l('Categories (x,y,z...)'),
    'callback' => 'exportAllProductCategoriesId'
);

Y crea una función estática exportAllProductCategoriesId():

Antes de importar los productos utilizando las ID de categorías en lugar del nombre, asegúrese de que esas categorías realmente existan en la tienda que está importando.
De lo contrario, se crearán nuevas categorías que tienen como nombre los números de identificación proporcionados.

Exportar características del producto.

El nombre del campo es Función (Nombre: Valor: Posición: Personalizado) y aunque el nombre no lo sugiere, puede ingresar varias funciones separadas por comas.
Ejemplo: Composiciones: Algodón: 4: 0, Estilos: Casual: 5: 0, Propiedades: Manga corta: 6: 0

En la función processExport()agregar:

Y crea una función estática exportFeatures():

Haga que todos los campos coincidan con los de la herramienta Importar CSV

En la función processExport()agregar:

// 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';

La herramienta de importación CSV tiene una manera fácil de decirle qué campo es qué columna. Puede asignar la columna seleccionando de su desplegable el campo que representa

Dando el hecho de que hemos incluido todos los campos compatibles en el archivo CSV, tener las columnas en un orden aleatorio tomará un tiempo para asignar todos los campos correspondientes.
Entonces, ordenemos todas las columnas para que coincidan con el orden predeterminado de los campos de herramientas de Importación CSV.

En la función processExport()agregar:

static::sortCSVfields($this->fields_list);

Y crea una función estática sortCSVfields():

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *