Jump to content

Recommended Posts

Estoy adaptando este script que me encontrado aquí: https://juanky1969.eu/2015/2015-12-02-Script-PHP-para-la-importacion-de-productos-y-categorias-en-Prestashop-1-6-.html

 

El solo lo hace con productos y categorías yo le he añadido direcciones clientes.

Solo quiero exponerlo para ver si algo esta mal y lo corrijo. Seguro que a alguien le servirá también.

<?php

// definimos la cabecera y el juego de caracteres
header("Content-Type: text/html;charset=utf-8");

// colocamos el directorio de adminxxxxx en la variable cogiendo el directorio donde está este script con getcwd
define('_PS_ADMIN_DIR_', getcwd());

// incluimos los parametros que se definieron en la instalación
include(_PS_ADMIN_DIR_.'/../config/config.inc.php');

// incluimos las funciones php de Prestashop que vamos a usar
include(_PS_ADMIN_DIR_.'/functions.php');

// incluimos el script php que hace las importaciones de CSV de Prestashop
include_once '../controllers/admin/AdminImportController.php';

// Configura bien los parametros:
//
// skip = numero de lineas a saltar, 1 para saltar los títulos de las columnas del csv
// forceIDs = 0 si queremos que los ponga Prestashop (recomendado) 1 si ponemos una columna con los números de id
// match_ref = 0 no usar la referencia como clave o 1 usarla como clave y hacer la referencia clave unica en mysql
// convert = lo dejamos vacio para usar el juego utf-8, el csv debe estar en este formato.
// entity = los dejamos a 1 , que es importar productos para Prestashop, 0 es importar categorías... etc.
// separator = el caracter de separacion de columnas del fichero.csv en nuestro caso ;
// multiple_value_separator' = el caracter de separacion de varios valores dentro de una columna: ,
// iso_lang = el idioma del csv que vamos a importar en formato iso, para español : es
// ***
// En el array vamos poniendo por orden las columnas que tenemos en el CSV
// la 0 es las categorias, la 1 es el nombre, etc.. y asociamos el nombre de la variable de Prestashop
// para decirle que hay en ese numero de columna, es lo mismo que sale en la importacion desde el Back Office
//
// la lista de las variables:
//
// 'no' = 'Ignore this column'
// 'id' = 'ID'
// 'active' = 'Active (0/1)'
// 'name' = 'Name'
// 'category' = Categories (x,y,z...)
// 'price_tex' = Price tax excluded Aquí con poner uno de los 2 price basta, si lo ponemos sin iva incluido
// 'price_tin' = Price tax included calcula este que es con IVA incluido.
// 'id_tax_rules_group' = Tax rules ID
// 'wholesale_price' = Wholesale price
// 'on_sale' = 'On sale (0/1)
// 'reduction_price' = Discount amount
// 'reduction_percent' = Discount percent
// 'reduction_from' = Discount from (yyyy-mm-dd)
// 'reduction_to' = Discount to (yyyy-mm-dd)
// 'reference' = Reference
// 'supplier_reference' = Supplier reference
// 'supplier' = Supplier
// 'manufacturer' = Manufacturer
// 'ean13' = EAN13
// 'upc' = UPC
// 'ecotax' = Ecotax
// 'width' = Width
// 'height' = Height
// 'depth' = Depth
// 'weight' = Weight
// 'quantity' = Quantity
// 'minimal_quantity' = Minimal quantity
// 'visibility' = Visibility
// 'additional_shipping_cost' = Additional shipping cost
// 'unity' = Unit for the unit price
// 'unit_price' = Unit price
// 'description_short' = Short description
// 'description' = Description
// 'tags' = Tags (x,y,z...)
// 'meta_title' = Meta title
// 'meta_keywords' = Meta keywords
// 'meta_description' = Meta description
// 'link_rewrite' = URL rewritten
// 'available_now' = Text when in stock
// 'available_later' = Text when backorder allowed
// 'available_for_order' = Available for order (0 = No, 1 = Yes)
// 'available_date' = Product availability date
// 'date_add' = Product creation date
// 'show_price' = Show price (0 = No, 1 = Yes)
// 'image' = Image URLs (x,y,z...)
// 'delete_existing_images' = Delete existing images (0 = No, 1 = Yes)')
// 'features' = Feature (Name:Value:Position:Customized)
// 'online_only' = Available online only (0 = No, 1 = Yes)
// 'condition' = Condition
// 'customizable' = Customizable (0 = No, 1 = Yes)
// 'uploadable_files' = Uploadable files (0 = No, 1 = Yes)
// 'text_fields' = Text fields (0 = No, 1 = Yes)
// 'out_of_stock' = Action when out of stock
// 'shop' = tienda
//
// Puedes encontrarlas todas mirando el fichero AdminImportController.php
// vas añadiendo el numero de columna que tengas en tu csv y la variable que describe esa columna y pones
// todos los campos que quieras en el array, para el ejemplo CSV de arriba quedaría como ves abajo 0 => Categorias etc..
//

function loadProductsPost() {
	$_POST = array (
		'tab' => 'AdminImport',
		'skip' => '1',
		'csv' => 'productos.csv',
		'forceIDs' => '0',
		'match_ref' => '1',
		'convert' => '',
		'entity' => '1',
		'separator' => ';',
		'multiple_value_separator' => ',',
		'iso_lang' => 'es',
		'import' => 'Importar datos CSV',
		'type_value' =>
		array (
			0 => 'category',
			1 => 'name',
			2 => 'description_short',
			3 => 'reference',
			4 => 'ean13',
			5 => 'weight',
			6 => 'wholesale_price',
			7 => 'price_tex',
			8 => 'ecotax',
			9 => 'manufacturer',
			10 => 'image',
		),
	);
}

$import = New AdminImportController();

loadProductsPost();

$import->productImport();

//______________________________________CATEGORIAS
function loadCategoriesPost() {
	$_POST = array (
		'tab' => 'AdminImport',
		'skip' => '1',
		'csv' => 'categorias.csv',
		'forceIDs' => '1',
		'convert' => '',
		'entity' => '0',
		'separator' => ';',
		'multiple_value_separator' => ',',
		'iso_lang' => 'es',
		'import' => 'Importar datos CSV',
		'type_value' =>
		array (
			0 => 'id',
			1 => 'active',
			2 => 'name',
			3 => 'parent',
			4 => 'is_root_category',
			5 => 'description',
			6 => 'meta_title',
			7 => 'meta_keywords',
			8 => 'meta_description',
			9 => 'link_rewrite',
			10 => 'image',
		),
	);
}

$import = New AdminImportController();

loadCategoriesPost();

$import->categoryImport();

//_________________________DIRECCIONES

/*
'id'
'alias' nombre para la direccion
'active' 
'customer_email' 
'id_customer'
'manufacturer' 
'supplier' ,
'company' 
'lastname' 
'firstname' 
'address1' direccion 1
'address2' direccion 2
'postcode' 
'city' 
'country' 
'state'  provincia
'other' 
'phone' 
'phone_mobile'
'vat_number' 
'dni' 
*/
function loadAddressesPost() {
	$_POST = array (
		'tab' => 'AdminImport',
		'skip' => '1',
		'csv' => 'direcciones.csv',
		'forceIDs' => '0',
		'convert' => '',
		'entity' => '4',
		'separator' => ';',
		'multiple_value_separator' => ',',
		'iso_lang' => 'es',
		'import' => 'Importar datos CSV',
		'type_value' =>
		array (
			0 => 'id',
			1 => 'alias',
			2 => 'address1',
			3 => 'city',
			4 => 'postcode',
			5 => 'state',
			6 => 'phone_mobile',
			7 => 'firstname',
			8 => 'lastname',
			9 => 'other',
			10 => 'country',
		),
	);
}

$import = New AdminImportController();

loadAddressesPost();

$import->addressImport();

//____________________________________CLIENTES
/*
'id' 
'active' 
'id_gender' 
'email' 
'passwd' 
'birthday' 
'lastname' 
'firstname' 
'newsletter' 
'optin' 
'group' 
'id_default_group' 
'id_shop' 
*/
function loadAddressesPost() {
	$_POST = array (
		'tab' => 'AdminImport',
		'skip' => '1',
		'csv' => 'direcciones.csv',
		'forceIDs' => '0',
		'convert' => '',
		'entity' => '3',
		'separator' => ';',
		'multiple_value_separator' => ',',
		'iso_lang' => 'es',
		'import' => 'Importar datos CSV',
		'type_value' =>
		array (
			0 => 'id',
			1 => 'firstname',
			2 => 'lastname',
			3 => 'email',
			4 => 'passwd',
			5 => 'id_gender',
		),
	);
}

$import = New AdminImportController();

loadAddressesPost();

$import->addressImport();
?>

Edited by vendetta V (see edit history)
  • Like 1
Link to comment
Share on other sites

Sólo un apunte, el archivo CSV debe estar en la carpeta import del directorio de admin y las columnas del CSV deben tener el orden del array , 0 primera columna del CSV, 1 segunda columna del CSV .... y la variable que corresponda a cada columna.

Si eso lo tengo claro, lo que no me queda tan claro es el entity para categorías se utiliza 0 y para productos 1 pero para los demás no se...

Link to comment
Share on other sites

Si eso lo tengo claro, lo que no me queda tan claro es el entity para categorías se utiliza 0 y para productos 1 pero para los demás no se...

Entity le indica al controlador que es lo que va a importar. Mira el código del controlador AdminImport y hay tienes los valores para el resto y sus variables.
Link to comment
Share on other sites

Entity le indica al controlador que es lo que va a importar. Mira el código del controlador AdminImport y hay tienes los valores para el resto y sus variables.

Según veo seria así el orden de entity:

$this->entities = array(

            $this->l('Categories'), -0

            $this->l('Products'), -1

            $this->l('Combinations'), -2

            $this->l('Customers'), -3

            $this->l('Addresses'), -4

            $this->l('Manufacturers'), -5

            $this->l('Suppliers'), -6

            $this->l('Alias'), -7

        );

 

Con esto he corregido el script de arriba.

 

Tengo una duda a la hora de importar categorías, prestashop importa por nombre la categoría padre como puedo hacer para que la categoría padre me la coja por id.

Al importar desde el backend con ids en categoria padre me salta este error:

 

Lo que acepta prestsahop:

parent_category--- ID-- name

HOME---- 100---- INICIO

INICIO--- 110--- subcategoria

 

Lo que quiero que acepte

parent_category -ID- name

2---- 100----- INICIO

100---- 110--- subcategoria

[PrestaShopException]

Parent category does not exist
at line 385 in file classes/Category.php

380. 		if (!$this->id_parent)
381. 			return 0;
382. 
383. 		$parent_category = new Category((int)$this->id_parent);
384. 		if (!Validate::isLoadedObject($parent_category))
385. 			throw new PrestaShopException('Parent category does not exist');
386. 		return $parent_category->level_depth + 1;
387. 	}
388. 
389. 	/**
390. 	 * Re-calculate the values of all branches of the nested tree

    CategoryCore->calcLevelDepth - [line 150 - classes/Category.php]
    CategoryCore->add - [line 1254 - controllers/admin/AdminImportController.php]
    AdminImportControllerCore->categoryImport - [line 3457 - controllers/admin/AdminImportController.php]
    AdminImportControllerCore->postProcess - [line 171 - classes/controller/Controller.php]
    ControllerCore->run - [line 373 - classes/Dispatcher.php]
    DispatcherCore->dispatch - [line 54 - admin546fuzfnw/index.php]

Edited by vendetta V (see edit history)
Link to comment
Share on other sites

Tengo una duda a la hora de importar categorías, prestashop importa por nombre la categoría padre como puedo hacer para que la categoría padre me la coja por id.

Al importar desde el backend con ids en categoria padre me salta este error:

 

Lo que acepta prestsahop:

parent_category--- ID-- name

HOME---- 100---- INICIO

INICIO--- 110--- subcategoria

 

Lo que quiero que acepte

parent_category -ID- name

2---- 100----- INICIO

100---- 110--- subcategoria

Me cito a mi mismo solucionando el tema, a la hora de importar tiene que  haber esta categoría englobando a todas  las demas

cat_padre---id----nombre

2---- 100----- INICIO
Link to comment
Share on other sites

Entity le indica al controlador que es lo que va a importar. Mira el código del controlador AdminImport y hay tienes los valores para el resto y sus variables.

Me ha surgido una duda si quiero importar el producto en multilenguaje con cambiar el 'iso_lang' => 'es', a 'en' me funcionaria?

Link to comment
Share on other sites

Estoy con lo mismo que tu, estoy intentando importar productos y no lo consigo. No me da ningun mensaje de error, pero tampoco me importa nada, he reducido la cantidad de campos que importo, no se si habre eliminado algun campo obligatorio, pone que los campos obligatorios estan marcados con asterisco, pero yo no he visto ninguno en el listado. Estos son los campos que intento importar.

 

0 => 'id',
1 => 'active',
2 => 'name',
3 => 'category',
4 => 'price_tex',
5 => 'tax_rate',
6 => 'on_sale',
7 => 'reference',
8 => 'supplier_reference',
9 => 'supplier',
10 => 'manufacturer',
11 => 'description_short',
12 => 'description',
13 => 'tags',
16 => 'available_for_order',
17 => 'show_price',
18 => 'image',
19 => 'delete_existing_images',
Link to comment
Share on other sites

Me ha surgido una duda si quiero importar el producto en multilenguaje con cambiar el 'iso_lang' => 'es', a 'en' me funcionaria?

En respuesta a tu pregunta, puedes saber que parámetros se pasan y como afecta la configuración viendo el código fuente de la página de importación, en principio tu suposición es correcta, pero comprueba para asegurarte.

thump_9507540codigo.png

Link to comment
Share on other sites

En respuesta a tu pregunta, puedes saber que parámetros se pasan y como afecta la configuración viendo el código fuente de la página de importación, en principio tu suposición es correcta, pero comprueba para asegurarte.

thump_9507540codigo.png

Si no pues trabajo sobre la tabla de prestashop directamente en la base de datos.

Iré haciendo pruebas, os mantendré informados.

Link to comment
Share on other sites

Yo ahora estoy intentando averiguar como obtener el restultado. Se que prestashop lo obtiene de aqui, en el submit de la importación.

 

<button id="import" name="import" type="submit" onclick="return (validateImportation(new Array()));" class="btn btn-default pull-right">, ahora a ver como se captura...... Seguiremos informando.

 

Edito despues de investigar.

 

El validateImportation es para comprobar que todo este bien antes de hacer el envío. Sigo buscando como saber el resultado de la importación (OK, Error, ....)

Edited by cardo (see edit history)
Link to comment
Share on other sites

Yo ahora estoy intentando averiguar como obtener el restultado. Se que prestashop lo obtiene de aqui, en el submit de la importación.

 

<button id="import" name="import" type="submit" onclick="return (validateImportation(new Array()));" class="btn btn-default pull-right">, ahora a ver como se captura...... Seguiremos informando.

 

Edito despues de investigar.

 

El validateImportation es para comprobar que todo este bien antes de hacer el envío. Sigo buscando como saber el resultado de la importación (OK, Error, ....)

Puedes mirar también en controllers/admin/AdminImportController.php

 

Pero si estas con las traducciones creo que es mas rápido ir a bps_product_lang conocerse el id del producto el id del lenguaje y crear un csv para hacer el insert directamente sobre la base de datos de prestashop

Link to comment
Share on other sites

No, por el momento no estoy con traducciones, primero quiero poder saber que la importación se ha realizado correctamente, en AdminImportControler he encontrado algunos de los textos que se presentan, ahora toca averiguar como obtenerlos, sino siempre queda la chapuza de repasar el fichero de productos y comprobar si estan ahí.

Link to comment
Share on other sites

 

Según veo seria así el orden de entity:

Categories=0

Products=1

Customers=2

Addresses=3

Combinations=4

Manufacturers=5

Suppliers=6

Alias=7

Tienes un cruce con los valores de entity, no se si es que ha ido cambiando con las nuevas versiones, pero para Prestashop 1.6.1.1 y siguientes (por el momento, no se si para anteriores también ni a partir de que versión), el entity es:

        $this->entities = array(
            $this->l('Categories'), -> Categorias - 0
            $this->l('Products'), -> Productos - 1
            $this->l('Combinations'), -> Combinaciones - 2
            $this->l('Customers'), -> Clientes - 3
            $this->l('Addresses'), -> Direcciones - 4
            $this->l('Manufacturers'), -> Fabricantes - 5
            $this->l('Suppliers'), -> Proveedores - 6
            $this->l('Alias'), -> Alias - 7
        );

 

Link to comment
Share on other sites

Tienes un cruce con los valores de entity, no se si es que ha ido cambiando con las nuevas versiones, pero para Prestashop 1.6.1.1 y siguientes (por el momento, no se si para anteriores también ni a partir de que versión), el entity es:

        $this->entities = array(
            $this->l('Categories'), -> Categorias - 0
            $this->l('Products'), -> Productos - 1
            $this->l('Combinations'), -> Combinaciones - 2
            $this->l('Customers'), -> Clientes - 3
            $this->l('Addresses'), -> Direcciones - 4
            $this->l('Manufacturers'), -> Fabricantes - 5
            $this->l('Suppliers'), -> Proveedores - 6
            $this->l('Alias'), -> Alias - 7
        );

 

 

Si es así, se me fue al copiar, en la 1.6.1.0 esta así;

$this->entities = array(

            $this->l('Categories'),

            $this->l('Products'),

            $this->l('Combinations'),

            $this->l('Customers'),

            $this->l('Addresses'),

            $this->l('Manufacturers'),

            $this->l('Suppliers'),

            $this->l('Alias'),

        );

 

Respecto a recolección de errores puedes probar en el adminimportcontroller.php en la linea:

 

1108 esta -> public function categoryImport()

1305 esta -> public function productImport()

 

etc.. hacia abajo seguido

Dentro de esas funciones están los displayError lo que se me ocurre es duplicar la linea y meter los mensajes en un .txt

 

O se puede comprobar los ID de la tabla de prestashop con la local para ver cuales faltan (LINKED SERVER).

Edited by vendetta V (see edit history)
Link to comment
Share on other sites

  • 1 month later...

Hola,

 

Antes de todo, gracias por el aporte. El script funciona perfectamente pero tengo una duda. El proveedor del ERP de mi cliente me dice que me pasa en el csv que tengo que importar, un código de referencia en el que va incluido modelo, color, talla, etc (todas las combinaciones). y por supuesto las cantidades. 

 

Claro que yo si importo ese csv lo que me hace es ir a la referencia  y las cantidades generales del producto y no a cada una de las combinaciones. Habría alguna manera de llegar directamente a las variaciones del producto actualizar el stock ?

 

Gracias

Link to comment
Share on other sites

Hola,

 

Antes de todo, gracias por el aporte. El script funciona perfectamente pero tengo una duda. El proveedor del ERP de mi cliente me dice que me pasa en el csv que tengo que importar, un código de referencia en el que va incluido modelo, color, talla, etc (todas las combinaciones). y por supuesto las cantidades. 

 

Claro que yo si importo ese csv lo que me hace es ir a la referencia  y las cantidades generales del producto y no a cada una de las combinaciones. Habría alguna manera de llegar directamente a las variaciones del producto actualizar el stock ?

 

Gracias

 

Que es lo que quieres hacer? Importar productos? Importar combinaciones? o actualizar combinaciones?

 

Teniendo en cuenta que la referencia para las combinaciones tiene que ser única, es posible que tengas que manipular el fichero antes de hacer la importación.

Link to comment
Share on other sites

Que es lo que quieres hacer? Importar productos? Importar combinaciones? o actualizar combinaciones?

 

Teniendo en cuenta que la referencia para las combinaciones tiene que ser única, es posible que tengas que manipular el fichero antes de hacer la importación.

 

Perdonad por no haberme explicado bien. Lo que yo quiero es actualizar las combinaciones de productos. Ejemplo, si en la tienda física compran una camisa azul, talla S, ellos me pasarían el stock actualizado con una referencia (que contendría esa info: camisa azul, talla S). 

Link to comment
Share on other sites

Hola a todos, una cosa, aparte de que el código funciona muy bien, alguien sabe como es el parámetro para el "archivo ISO 8859-1 codificado?", si no lo tengo activado, por como tengo el archivo no me importa bien los productos y si podría ser también el código para el parámetro de borrar los productos y/o categorías anteriores, gracias!

Edited by Daisoujou (see edit history)
Link to comment
Share on other sites

Perdonad por no haberme explicado bien. Lo que yo quiero es actualizar las combinaciones de productos. Ejemplo, si en la tienda física compran una camisa azul, talla S, ellos me pasarían el stock actualizado con una referencia (que contendría esa info: camisa azul, talla S). 

Eso es lo que queremos todos, pero no es posible hacerlo por CSV, con el CSV " SUSTITUYES " un valor por otro, no restas o sumas (devolución o cambio) unidades, para eso hay que programar un script que trabaje directamente contra las bases de datos de prestashop.

Link to comment
Share on other sites

Hola a todos, una cosa, aparte de que el código funciona muy bien, alguien sabe como es el parámetro para el "archivo ISO 8859-1 codificado?", si no lo tengo activado, por como tengo el archivo no me importa bien los productos y si podría ser también el código para el parámetro de borrar los productos y/o categorías anteriores, gracias!

 

Mira la captura de pantalla que puse de la importación de poductos, ahí puedes ver los parámetros que se envían al hacer la importación

Link to comment
Share on other sites

Eso es lo que queremos todos, pero no es posible hacerlo por CSV, con el CSV " SUSTITUYES " un valor por otro, no restas o sumas (devolución o cambio) unidades, para eso hay que programar un script que trabaje directamente contra las bases de datos de prestashop.

OK, gracias.

Link to comment
Share on other sites

Mira la captura de pantalla que puse de la importación de poductos, ahí puedes ver los parámetros que se envían al hacer la importación

Al menos para mi al descargar o simplemente mirar la captura me sale muy pequeña, haciéndome imposible leer nada, podrías volver a subirla, pero mas grande?(lo he intentado en ubuntu y win10 en diferentes navegadores y me sale igual de pequeña)

Link to comment
Share on other sites

La reducción es cosa del foro, yo la subí a tamaño completo, pero lo que tienes que hacer es con las herramientas de desarrollador ver que parámetros pasa tu aplicación.

 

 

Al menos para mi al descargar o simplemente mirar la captura me sale muy pequeña, haciéndome imposible leer nada, podrías volver a subirla, pero mas grande?(lo he intentado en ubuntu y win10 en diferentes navegadores y me sale igual de pequeña)

Link to comment
Share on other sites

Perdonad por no haberme explicado bien. Lo que yo quiero es actualizar las combinaciones de productos. Ejemplo, si en la tienda física compran una camisa azul, talla S, ellos me pasarían el stock actualizado con una referencia (que contendría esa info: camisa azul, talla S). 

 

 

Eso es lo que queremos todos, pero no es posible hacerlo por CSV, con el CSV " SUSTITUYES " un valor por otro, no restas o sumas (devolución o cambio) unidades, para eso hay que programar un script que trabaje directamente contra las bases de datos de prestashop.

 

Si le pasan ellos el stock actualizado no habría problema solo tendría que importar el csv y sobrescribir el stock. El problema es si es sincronizancion bidireccional.

 

Hola a todos, una cosa, aparte de que el código funciona muy bien, alguien sabe como es el parámetro para el "archivo ISO 8859-1 codificado?", si no lo tengo activado, por como tengo el archivo no me importa bien los productos y si podría ser también el código para el parámetro de borrar los productos y/o categorías anteriores, gracias!

Es el parametro convert prueba con iso_lang. Pot defecto si esta vació coge UTF8.

Para borrar pues con un script directoa la base de datos.

Edited by vendetta V (see edit history)
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...