Importar de xml a Prestashop

Importar de xml a Prestashop

Publicado Por | 29 julio , 2013 | Blog Adrenalina, Desarrollo Web | 9 Comments

Vamos a explicar como hacer una importación de xml a prestashop, para ello incluiremos la opción de modificar el precio de los artículos en un % fijo respecto al precio del catalogo del que importamos.

Si queremos modificar un % los precios del xml del que vamos a importar la información de los productos, podemos introducir en el panel de administración un campo en el que introducir el % que extraeremos durante la importación.

El código extra añadido es:

'PS_INCREASE_PRICE' => array(
'title' => $this->l('Aumento del precio del catálogo importado'),
'desc' => $this->l('Indicar el % a aumentar sobre el precio, como por ejemplo 95'),
'validation' => 'isInt',
'cast' => 'intval',
'type' => 'text',
'default' => '95',
'visibility' => Shop::CONTEXT_ALL
),

En este ejemplo nosotros lo hemos introducido en /controllers/admin en el archivo AdminAdminPreferencesController.php en la línia 83. De esta manera nos aparecerá en el panel de administración en administración/preferencias 5o campo de general.

Para realizar la importación primero cargaremos el archivo xml i nos conectamos a la base datos de nuestra tienda prestashop.

<h1>Importacion datos catalogo Testsexshop</h1>
<?php
//incluimos funciones simples de imagen
include('SimpleImage.php');
// archivo del import (.xml)
$filename = "http://media.grutinet.com/ficheros/productos_xml_sin_dvd.xml";
// recogemos los datos del archivo
$data = str_replace('content:encoded', 'content_encoded', @file_get_contents(
$filename , false, NULL)
);
$dom = new DomDocument();
$dom->loadXML($data);
//datos de nuestra base de datos
$username = "userbddtestpasbd";
$password = "pasbdtest";
$hostname = "localhost"; 
//Conexión con la base de datos
$dbhandle = mysql_connect($hostname, $username, $password) or die("No se ha podido conectar");
echo "Conectado a MySQL
";
$selected = mysql_select_db("testsexshopbd",$dbhandle) or die("No se ha podido conectar a testsexshopbd");
echo "Conectado a testsexshopbd
";

Seguidamente recogeremos el valor del incremento de precio que hemos introducido previamente, para aplicar el cambio de precio.

//Primero recogemos el valor del % por ciento de la base de datos
$incremento_precio = 0; //declaramos la variable que guardara el valor del incremento
$sql_increase = "SELECT `value`";
$sql_increase .= " FROM `ps_configuration`";
$sql_increase .= " WHERE `name` ";
$sql_increase .= "LIKE 'PS_INCREASE_PRICE'";
//Ejecutamos la sentencia
$result = mysql_query($sql_increase)or die("No se ha ejecutado la sentencia select PS_INCREASE_PRICE");
while ($row = mysql_fetch_array($result)) {
//Recogemos el valor del incremento
$incremento_precio = $row{'value'};
}
echo "El incremento del precio es ".$incremento_precio."%
";

Generamos varias funciones para comprobar si las categorias, productos, etc. ya existen en la BD para tomar decisiones durante la importación.

//funcion para comprobar si la categoria ya existe en la base de datos
function comprobarCategoriaExistente($categoria)
{
//Comprobar si existe categoria
$sql = "SELECT * FROM `ps_category_lang` WHERE `name` LIKE '".$categoria."'";
$result = mysql_query($sql)or die("No se ha ejecturado la sentencia comprobarCategoriaExistente");
$id_categoria = mysql_num_rows($result);
while ($row = mysql_fetch_array($result)) {
//Recogemos el id de la categoria
$id_categoria = $row{'id_category'};
}
echo "El resultado de la busqueda comprobarCategoriaExistente es ".$id_categoria."
";
return $id_categoria;
}
//funcion para comprobar si el producto ya existe en la base de datos
function comprobarExisteProducto($id_articulo)
{
//comprobamos que el producto existe en el sistema o no
$sql = "SELECT * FROM `ps_product` WHERE `reference` LIKE '".$id_articulo."'";
$result = mysql_query($sql)or die("No se ha ejecturado la sentencia comprobarExisteProducto");
$id_articulo = mysql_num_rows($result); 
while ($row = mysql_fetch_array($result)) {
//Recogemos el id del producto en la bd
$id_articulo = $row{'id_product'};
}
echo "El resultado de la busqueda comprobarExisteProducto es ".$id_articulo."
";
return $id_articulo;
}
//funcion para comprobar si la marca ya existe en la base de datos
function comprobarMarcaExistente($marca)
{
//miramos si existe su marca
$sql = "SELECT * FROM `ps_manufacturer` WHERE `name` LIKE '".$marca."'";
$result = mysql_query($sql)or die("No se ha ejecturado la sentencia comprobarMarcaExistente");
$id_fabricante = mysql_num_rows($result);
while ($row = mysql_fetch_array($result)) {
//Recogemos el id de la marca en la bd
$id_fabricante = $row{'id_manufacturer'};
}
echo "El resultado de la busqueda comprobarMarcaExistente es ".$id_fabricante."
";
return $id_fabricante;
}
Creamos una función para cambiar permisos de archivos
//funcion para canviar permisos
function recursiveChmod ($path, $filePerm=0775, $dirPerm=0775) {
// Check if the path exists
if (!file_exists($path)) {
//echo "No existe el directorio";
return(false);
}
// See whether this is a file
if (is_file($path)) {
// Chmod the file with our given filepermissions
chmod($path, $filePerm);
// If this is a directory...
} elseif (is_dir($path)) {
// Then get an array of the contents
$foldersAndFiles = scandir($path);
// Remove "." and ".." from the list
$entries = array_slice($foldersAndFiles, 2);
// Parse every result...
foreach ($entries as $entry) {
// And call this function again recursively, with the same permissions
recursiveChmod($path."/".$entry, $filePerm, $dirPerm);
}
// When we are done with the contents of the directory, we chmod the directory itself
chmod($path, $dirPerm);
}
// Everything seemed to work out well, return true
return(true);
}

Una función que nos genera y coloca los distintos tamaños de imagen que prestashop crea cuando subimos una imagen por la administración.(Recordamos que las imagenes deben ser en .jpg de no serlo es necesario transformarlas antes de la generación de los tamaños)

//funcion que genera y coloca en el directorio correspondiente
//los diferentes tamaños de imagen que usa prestashop
function save_img($url_image,$id_image) {
$array_id_image = str_split($id_image);
$num_digits = strlen($id_image);
$cadena_url_mod = NULL;
for($i = 0;$iload("".$path . $filename . "." .$img_ext.""); 
$image->resizeToWidth(45); 
$image->save("".$path . $filename . "-small_default." .$img_ext.""); 
$image2 = new SimpleImage(); 
$image2->load("".$path . $filename . "." .$img_ext.""); 
$image2->resizeToWidth(213); 
$image2->save("".$path . $filename . "-home_alysum." .$img_ext."");
$image3 = new SimpleImage(); 
$image3->load("".$path . $filename . "." .$img_ext.""); 
$image3->resizeToWidth(124); 
$image3->save("".$path . $filename . "-home_default." .$img_ext."");
$image4 = new SimpleImage(); 
$image4->load("".$path . $filename . "." .$img_ext.""); 
$image4->resizeToWidth(310); 
$image4->save("".$path . $filename . "-large_alysum." .$img_ext."");
$image5 = new SimpleImage(); 
$image5->load("".$path . $filename . "." .$img_ext.""); 
$image5->resizeToWidth(264); 
$image5->save("".$path . $filename . "-large_default." .$img_ext."");
$image6 = new SimpleImage(); 
$image6->load("".$path . $filename . "." .$img_ext.""); 
$image6->resizeToWidth(104); 
$image6->save("".$path . $filename . "-medium_alysum." .$img_ext."");
$image7 = new SimpleImage(); 
$image7->load("".$path . $filename . "." .$img_ext.""); 
$image7->resizeToWidth(58); 
$image7->save("".$path . $filename . "-medium_default." .$img_ext."");
$image8 = new SimpleImage(); 
$image8->load("".$path . $filename . "." .$img_ext.""); 
$image8->resizeToWidth(45); 
$image8->save("".$path . $filename . "-small_alysum." .$img_ext."");
$image9 = new SimpleImage(); 
$image9->load("".$path . $filename . "." .$img_ext.""); 
$image9->resizeToWidth(600); 
$image9->save("".$path . $filename . "-thickbox_alysum." .$img_ext."");
$image10 = new SimpleImage(); 
$image10->load("".$path . $filename . "." .$img_ext.""); 
$image10->resizeToWidth(600); 
$image10->save("".$path . $filename . "-thickbox_default." .$img_ext."");
chmod($ruta, 0775);
$valor_permisos = recursiveChmod ($path, $filePerm=0755, $dirPerm=0775);
echo "Se han dado todos los permisos? ".$valor_permisos;
return filesize($filex);
}

Seguidamente procesaremos el xml, en este ejemplo tenemos un xml en el formato siguiente, ejemplo extraido de grutinet:

<articulos>
<articulo ref="10000">
<ean>9999999999999</ean>
<categoria>Categoria</categoria>
<categoria_texto>Texto de la categoria</categoria_texto>
<subcategoria>Subcategoria</subcategoria>
<subcategoria_texto>VTexto de la subcategoria</subcategoria_texto>
<nombre>Nombre del articulo</nombre>
<nombre_original>Nombre original</nombre_original>
<marca>Marca del articulo</marca>
<descripcion>
Descripción del artículo
</descripcion>
<precio>99</precio>
<precio_tarifa>99</precio_tarifa>
<stock>SI</stock>
<stock_disponible>50</stock_disponible>
<reponer>SI</reponer>
<iva>21</iva>
<talla>ST</talla>
<imagen_gr>
http://ejemplo.com/gr_10000.jpg
</imagen_gr>
<imagen_bu>
http://ejemplo.com/bu_10000.jpg
</imagen_bu>
<imagen_or>
http://ejemplo.com/articulos/or/or_10000.jpg
</imagen_or>
<imagen_grande_0>
http://ejemplo.com/lg_10000_0.jpg
</imagen_grande_0>
</articulo>
</articulos>

Por esto, tras el procesado de cada artículo introduciremos toda la información necesaria en la base de datos en caso de no existir el producto. De no existir la categoria o subcategoria las crearemos. En caso que el artículo ya existiera en la base de datos actualizaremos el precio y el stock.

//visitamos todos los nodos
for($i=0; $ichildNodes->length; $i++){
$tag = $dom->childNodes->item($i);
//visitamos los articulos
if ($tag->nodeName=="articulos")
{
$articulos = $tag;
echo "
** ".$tag->nodeName; 
//todos los nodos de articulos
for($j=0; $jchildNodes->length; $j++)
{
$tag = $articulos->childNodes->item($j);
//visitamos el articulo
if ($tag->nodeName=="articulo")
{ 
//ponemos las variables a NULL por cada articulo que visitamos
$id_articulo=NULL;$ean=NULL;$categoria=NULL;$categoria_texto=NULL;$subcategoria=NULL;$subcategoria_texto=NULL;$nombre=NULL;$nombre_original=NULL;$marca=NULL;$descripcion=NULL; $precio=NULL;$precio_tarifa=NULL;$stock=NULL;$stock_disponible=NULL;
$reponer=NULL;$iva=NULL;$talla=NULL;$imagen_video=NULL;$flash_360=NULL;$img=NULL;
$articulo = $tag;
echo "
*** ".$tag->nodeName; 
$id_articulo=$articulo->getAttribute('ref');
echo "
*** ".$id_articulo; 
//visitamos todos los nodos del articulo
for($k=0; $kchildNodes->length; $k++)
{
//guardamos la información en la variable correspondiente
$tag = $articulo->childNodes->item($k);
if      ($tag->nodeName=="ean"){ $ean=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="categoria" ){ $categoria=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="categoria_texto" ){ $categoria_texto=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="subcategoria" ){ $subcategoria=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="subcategoria_texto" ){ $subcategoria_texto=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="nombre" ){ $nombre=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="nombre_original" ){ $nombre_original=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="marca" ){ $marca=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="descripcion" ){ $descripcion=addslashes(utf8_decode($tag->nodeValue)); echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="precio" ){ if(isset($incremento_precio)){$precio=($tag->nodeValue)+($tag->nodeValue)*$incremento_precio/100; echo "
****",$precio;}else{$precio=($tag->nodeValue);echo "
****",$precio;} }
else if ($tag->nodeName=="precio_tarifa" ){ $precio_tarifa=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="stock" ){ $stock=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="stock_disponible" ){ $stock_disponible=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="reponer" ){ $reponer=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="iva" ){ $iva=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="talla" ){ $talla=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_0" ){ $img['imagen_grande_0']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_1" ){ $img['imagen_grande_1']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_2" ){ $img['imagen_grande_2']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_3" ){ $img['imagen_grande_3']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_4" ){ $img['imagen_grande_4']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_5" ){ $img['imagen_grande_5']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_6" ){ $img['imagen_grande_6']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_7" ){ $img['imagen_grande_7']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_8" ){ $img['imagen_grande_8']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_grande_9" ){ $img['imagen_grande_9']=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="imagen_video" ){ $imagen_video=$tag->nodeValue; echo "
****",$tag->nodeValue; }
else if ($tag->nodeName=="flash_360" ){ $flash_360=$tag->nodeValue; echo "
****",$tag->nodeValue; }
}
echo "
**** ####Acabado el cargado del articulo";
$follow=TRUE;
if($follow){
// Aqui empieza todo el trabajo
echo "La subcategoria es".$subcategoria;
$id_articulo_bd = comprobarExisteProducto($id_articulo);
$id_marca = comprobarMarcaExistente($marca);
if(!$id_articulo_bd)
{
echo "El producto no existe en la base de datos
";
//si la marca no existe la creamos        
if(!$id_marca)
{
//Insertamos la marca en la tabla ps_manufacturer
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_manufacturer` (`id_manufacturer` ,`name` ,`date_add` ,`date_upd` ,`active`)";
$sql .= " VALUES (NULL , '".$marca."', '".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."', '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro insertado en ps_manufacturer con exito
";
} 
//Debemos de comprobar el id que acabamos de crear
$id_marca = comprobarMarcaExistente($marca);
//Insertamos la marca en la tabla ps_manufacturer_lang
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_manufacturer_lang` (`id_manufacturer` ,`id_lang`)";
$sql .= " VALUES ('".$id_marca."' , '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro insertado en ps_manufacturer_lang con exito
";
} 
//Insertamos la marca en la tabla ps_manufacturer_shop
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_manufacturer_shop` (`id_manufacturer` ,`id_shop`)";
$sql .= " VALUES ('".$id_marca."' , '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro insertado en ps_manufacturer_shop con exito
";
}
}
//Aqui empiezan las comprobaciones de las categorias
$id_categoria = comprobarCategoriaExistente($categoria);
if(!$id_categoria)
{
echo "La categoria no existe";
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category` (`id_category` ,`id_parent` ,`id_shop_default`,`level_depth`,`date_add` ,`date_upd` ,`active`,`is_root_category`)";
$sql .= " VALUES (NULL , '2','1','2','".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."', '1', '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
//Debemos de comprobar el id que acabamos de crear
$id_categoria = mysql_insert_id();
$state = true;
if ($state) 
{ 
echo "Registro de categoria insertado en ps_category con exito
";	
} 
//Insertamos la categoria en la tabla ps_category_group
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_group` (`id_category` ,`id_group`)";
$sql .= " VALUES ('".$id_categoria."' , '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de categoria de grupo insertado en ps_category_group con exito
";
}
//Insertamos la categoria en la tabla ps_category_group
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_group` (`id_category` ,`id_group`)";
$sql .= " VALUES ('".$id_categoria."' , '2');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro 2 de categoria de grupo insertado en ps_category_group con exito
";
} 
//Insertamos la categoria en la tabla ps_category_group
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_group` (`id_category` ,`id_group`)";
$sql .= " VALUES ('".$id_categoria."' , '3');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro 3 de categoria de grupo insertado en ps_category_group con exito
";
} 
//Insertamos la categoria en la tabla ps_category_lang
$url_categoria = strtolower($categoria);
$url_categoria = str_replace(" ", "-", $url_categoria);
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_lang` (`id_category` ,`id_shop`,`id_lang` ,`name`,`link_rewrite`)";
$sql .= " VALUES ('".$id_categoria."' , '1','1','".$categoria."','".$url_categoria."');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de categoria insertado en ps_category_lang con exito
";
}
//Insertamos la categoria en la tabla ps_category_shop
$url_categoria = strtolower($categoria);
$url_categoria = str_replace(" ", "-", $url_categoria);
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_shop` (`id_category` ,`id_shop`)";
$sql .= " VALUES ('".$id_categoria."' , '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de categoria  insertado en ps_category_shop con exito
";
}
}
//Comprobar si existe la subcategoria y si no crearla, similar al proceso anterior
$id_categoria = comprobarCategoriaExistente($categoria);
$id_subcategoria = comprobarCategoriaExistente($subcategoria);
if($id_subcategoria > 0)
{
echo "Hay subcategoria";
$id_subcategoria = comprobarCategoriaExistente($subcategoria);
}
if((!$id_subcategoria)&&(!empty($subcategoria)))
{
echo "La subcategoria no existe";
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category` (`id_category` ,`id_parent` ,`id_shop_default`,`level_depth`,`date_add` ,`date_upd` ,`active`,`is_root_category`)";
$sql .= " VALUES (NULL , '".$id_categoria."','1','3','".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."', '1', '0');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
//Debemos de comprobar el id que acabamos de crear
$id_categoria = mysql_insert_id();
$state = true;
if ($state) 
{ 
echo "Registro de subcategoria insertado en ps_category con exito
";	
} 
//Insertamos la categoria en la tabla ps_category_group
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_group` (`id_category` ,`id_group`)";
$sql .= " VALUES ('".$id_categoria."' , '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de subcategoria de grupo insertado en ps_category_group con exito
";
} 
//Insertamos la categoria en la tabla ps_category_group
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_group` (`id_category` ,`id_group`)";
$sql .= " VALUES ('".$id_categoria."' , '2');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro 2 de subcategoria de grupo insertado en ps_category_group con exito
";
} 
//Insertamos la categoria en la tabla ps_category_group
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_group` (`id_category` ,`id_group`)";
$sql .= " VALUES ('".$id_categoria."' , '3');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro 3 de subcategoria de grupo insertado en ps_category_group con exito
";
} 
//Insertamos la categoria en la tabla ps_category_lang
$url_subcategoria = strtolower($subcategoria);
$url_subcategoria = str_replace(" ", "-", $url_subcategoria);
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_lang` (`id_category` ,`id_shop`,`id_lang` ,`name`,`link_rewrite`)";
$sql .= " VALUES ('".$id_categoria."' , '1','1','".$subcategoria."','".$url_subcategoria."');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de subcategoria insertado en ps_category_lang con exito
";
}
//Insertamos la categoria en la tabla ps_category_shop
$url_categoria = strtolower($categoria);
$url_categoria = str_replace(" ", "-", $url_categoria);
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_shop` (`id_category` ,`id_shop`)";
$sql .= " VALUES ('".$id_categoria."' , '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de subcategoria  insertado en ps_category_shop con exito
";
$id_subcategoria = comprobarCategoriaExistente($subcategoria);
}
}
if(empty($subcategoria))
{
echo "No hay subcategoria";
$id_subcategoria = comprobarCategoriaExistente($categoria);
}
}
if(!$id_articulo_bd)
{
//definimos las variables del stock
if($stock=='SI'){
$visibilidad_producto = 1;
$disponibilidad = "Disponible";
$total_stock = $stock_disponible;
}else{
$visibilidad_producto = 0;
$disponibilidad = "No disponible";
$total_stock = 0;
}
echo "
Vamos a crear el producto en la base de datos
";
echo "El producto no existe
";
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_product` (`id_product` ,`id_supplier` ,`id_manufacturer`,`id_category_default`,`id_shop_default`,`id_tax_rules_group`,`on_sale`,`minimal_quantity`,`ean13`,`price`,`wholesale_price`,`reference`,`out_of_stock`,`available_for_order`,`condition`,`visibility`,`show_price`,`indexed`,`date_add` ,`date_upd` ,`active`)";
$sql .= " VALUES (NULL , '0','".$id_marca."','".$id_subcategoria."','1','1','0','1','".$ean."','".$precio."','".$precio_tarifa."','".$id_articulo."','2','".$visibilidad_producto."','new','both','1','1','".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."', '1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
//Debemos de comprobar el id que acabamos de crear
$id_articulo_creado = mysql_insert_id();
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_product con exito
";	
}
$url_producto_alias = strtolower($nombre);
$url_producto_alias = str_replace(" ", "-", $url_producto_alias);
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_product_lang` (`id_product` ,`id_shop`,`id_lang` ,`description`,`link_rewrite`,`name`,`available_now`)";
$sql .= " VALUES ('".$id_articulo_creado."' , '1','1','".$descripcion."','".$url_producto_alias."','".$nombre."','".$disponibilidad."');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_product_lang con exito
";
}
//Aquí actualizamos el stock
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_stock_available` (`id_stock_available`,`id_product` ,`id_product_attribute` ,`id_shop` ,`id_shop_group` ,`quantity` ,`depends_on_stock` ,`out_of_stock`)";
$sql .= " VALUES (NULL ,'".$id_articulo_creado."', '0','1','0','".$total_stock."','0','2');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_stock_available con exito
";
}
echo "El id de la categoria es ".$id_subcategoria;
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_product_shop` (`id_product`,`id_category_default`,`id_shop`,`id_tax_rules_group`,`on_sale`,`price`,`wholesale_price`,`available_for_order`,`condition`,`visibility`,`show_price`,`indexed`,`active`,`date_add` ,`date_upd` )";
$sql .= " VALUES ('".$id_articulo_creado."','".$id_subcategoria."','1','1','0','".$precio."','".$precio_tarifa."','1','new','".$visibilidad_producto."','1','1','1','".date("Y-m-d H:i:s")."', '".date("Y-m-d H:i:s")."');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
//Debemos de comprobar el id que acabamos de crear
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_product_shop con exito
";	
}
for($positionimg=0;$positionimg<10;$positionimg++){
if(!empty($img['imagen_grande_'.$positionimg])){
//Primero recogemos la imagen del producto
$url_image=$img['imagen_grande_'.$positionimg];
if($positionimg==0){$cover=1;}else{$cover=0;}
//Ahora se crean las imagenes del producto
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_image` (`id_image`,`id_product` ,`position` ,`cover`)";
$sql .= " VALUES (NULL ,'".$id_articulo_creado."', '".($positionimg+1)."','1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
$id_foto_creado = mysql_insert_id();
if ($state) 
{ 
echo "Registro de producto insertado en ps_image con exito
";
save_img($url_image,$id_foto_creado);
}
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_image_lang` (`id_image`,`id_lang`)";
$sql .= " VALUES ('".$id_foto_creado."' ,'1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_image_lang con exito
";
}
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_image_shop` (`id_image`,`id_shop`,`cover`)";
$sql .= " VALUES ('".$id_foto_creado."' ,'1','1');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_image_shop con exito
";
}   
}
}
echo "El id de la subcategoria es ".$id_subcategoria."
";
$sql = "INSERT INTO `adredb`.`testsexshopbd`.`ps_category_product` (`id_category`,`id_product`)";
$sql .= " VALUES ('".$id_subcategoria."' ,'".$id_articulo_creado."');";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Registro de producto insertado en ps_category_product con exito
";
}
}
//si el articulo ya existia en la bd actualizamos disponibilidad, precio y stock
if($id_articulo_bd)
{
echo "El producto si que existe
";
//Si el producto ya existe comprobaremos el stock y el precio y modificaremos lo necesario
if($stock=='SI'){
$visibilidad_producto = 1;
$disponibilidad = "Disponible";
$total_stock = $stock_disponible;
}else{
$visibilidad_producto = 0;
$disponibilidad = "No disponible";
$total_stock = 0;
}
$sql = "UPDATE `testsexshopbd`.`ps_product` SET `price` = '".$precio."', `wholesale_price` = '".$precio_tarifa."',`available_for_order` = '".$visibilidad_producto."',`show_price` = '1' WHERE `id_product`  ='".$id_articulo_bd."'";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Actualizacion de producto en ps_product realizada
";
}
$sql = "UPDATE `testsexshopbd`.`ps_stock_available` SET `quantity` = '".$total_stock."' WHERE `id_product` ='".$id_articulo_bd."'";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Actualizacion de producto en ps_stock_available realizada
";
}
$sql = "UPDATE `testsexshopbd`.`ps_product_shop` SET `price` = '".$precio."',`wholesale_price` = '".$precio_tarifa."',`visibility` = '".$visibilidad_producto."',`show_price` = '1'  WHERE `id_product` ='".$id_articulo_bd."'";
$res = mysql_query($sql, $dbhandle) or die(mysql_error());
$state = true;
if ($state) 
{ 
echo "Actualizacion de producto en ps_product_shop realizada
";
}
}
}
}
}
}
}
}

Finalmente, al generar categorias en la base de datos no se indexan como a prestashop “le gustra”, para arreglarlo regeneraremos el arbol de categorias para reparar los errores.

//función para arreglar el arbol de categorias de prestashop
/**
* Re-calculate the values of all branches of the nested tree
*/
function regenerateEntireNtree()
{
$sql = '
SELECT c.`id_category`, c.`id_parent`
FROM `ps_category` c
LEFT JOIN `ps_category_shop` cs
ON (c.`id_category` = cs.`id_category` AND cs.`id_shop` = 1)
ORDER BY c.`id_parent`, cs.`position` ASC';
$result = mysql_query($sql)or die("No se ha ejecturado la sentencia comprobarCategoriaExistente");
$categories = mysql_num_rows($result);
$categories_array = array();
while ($category = mysql_fetch_array($result)){
//foreach ($categories as $category){
$categories_array[$category['id_parent']]['subcategories'][] = $category['id_category'];
echo "loading $categories_array 
";
}
echo "var_dump 
";
var_dump($categories_array);
$n = 1;
if (isset($categories_array[0]) && $categories_array[0]['subcategories']){
_subTree($categories_array, $categories_array[0]['subcategories'][0], $n);
}
return (TRUE);
}
//funcion recursiva de regenerateEntireNtree()
function _subTree(&$categories, $id_category, &$n)
{
echo $n."
";
$left = $n++;
if (isset($categories[(int)$id_category]['subcategories'])){
echo "we are here 
";
foreach ($categories[(int)$id_category]['subcategories'] as $id_subcategory){
_subTree($categories, (int)$id_subcategory, $n);
}
echo "end foreach
";
}
$right = (int)$n++;
echo "UPDATE cat ".$id_category." left ".$left." right ".$right."
";
$sql = '
UPDATE `testsexshopbd`.`ps_category`
SET `nleft` = '.(int)$left.' , `nright` = '.(int)$right.'
WHERE `id_category` = '.(int)$id_category.'
';
echo $sql."
";
$res = mysql_query($sql) or die(mysql_error()."die you biatch");
return (TRUE);
}
//arreglamos inconsistencias en la tabla categorias de prestashop
echo "regenerate tree";
regenerateEntireNtree();

Esperamos haberos ayudado a hacer importaciones de catalogos xml a prestashop, cualquier consulta no dudeis en poneros en contacto con nosotros y os asesoraremos.

Autor: Lluis Torns

  • Alberto

    buenas, tienes un .php con el contenido? Gracias

  • Miguel Garcia

    Igual que Alberto.

    Está para descargar el archivo o archivos en php? porque por más que estoy intentando que me funcione, únicamente me sale la pantalla de “Importacion datos catalogo Testsexshop” y no hace nada más.

    Supongo que algo estaré haciendo mal.

    Espero tu respuesta Lluis.

    Gracias

    • Hola Miguel

      Has de pensar que este ejemplo de importación por un lado tiene su tiempo y la estructura del xml de muestra puede haber sido modificada, por otro es simplemente una guía para la que hacen falta conocimientos de programación para poder aprovechar a fondo.
      En Adrenalina nos dedicamos a realizar estas importaciones de forma profesional por lo que cualquier duda se puede comentar con nuestro departamento comercial.

      Saludos cordiales.

  • Maria

    He seguido las instrucciones, me conecta a la base de datos, etc… Pero no me hace nada y me surge la duda de si tengo que llamar a las funciones una a una, me refiero a estas: ” funciones para comprobar si las categorias, productos, etc.”. por que parece que no hace nada

    Esto es lo que me sale : (la palabra “aqui” es lo unico que he añadido yo.

    Conectado a MySQLConectado a u530923720_movEl incremento del precio es 5%regenerate treeloading Arrayloading Arrayloading Arrayloading Arrayloading Arrayloading Arrayloading Arrayloading Arrayvar_dump array(4) { [0]=> array(1) { [“subcategories”]=> array(1) { [0]=> string(1) “1” } } [1]=> array(1) { [“subcategories”]=> array(1) { [0]=> string(1) “2” } } [2]=> array(1) { [“subcategories”]=> array(4) { [0]=> string(1) “3” [1]=> string(1) “4” [2]=> string(1) “5” [3]=> string(1) “6” } } [6]=> array(1) { [“subcategories”]=> array(2) { [0]=> string(1) “7” [1]=> string(1) “8” } } } 1- aqui2- aqui3- aqui5- aqui7- aqui9- aqui10- aqui12- aqui

    Lo que he hecho es meter todo el codigo seguido en importar.php

    ah! y el primer paso de PS_INCREASE_PRICE tambien esta hecho y no se me refleja dentro de mis bakcend.

    Me salvarias la vida si me podeis ayudar. Muchas gracias

  • Rubén Nieto Carrasco

    Hola. Me da el mismo error que a Maria. Podrias explicarlo mejor¿? como debemos de ordenarlo? gracias

  • Verónica

    Hola muy buenas, de primeras daros las gracias por compartir vuestros conocimientos con los demás, es un gran gesto.

    Me ha venido genial para poder documentarme e iniciar mi propio script de importación de productos para mi tienda.

    La única consulta que me gustaría haceros es ¿bajo que versión de Prestashop hicisteis el script? ¿1.4?

    Muchas gracias y enhorabuena.

  • Rafael Ortega Jimenez

    Donde está el fichero SimpleImage.php?

  • Luis

    Buenas, me he encontrado con este artículo por casualidad, y me da un error que no consigo adivinar a que se debe,

    Parse error: syntax error, unexpected ‘;’, expecting ‘)’ in /homepages/46/d446722779/htdocs/********.com/ImportadorXML.php on line 132

    131. for($i = 0;$iload(“”.$path . $filename . “.” .$img_ext.””);
    132. $image->resizeToWidth(45);
    133. $image->save(“”.$path . $filename . “-small_default.” .$img_ext.””);

Estudiamos y analizamos su negocio en profundidad, definimos objetivos y planteamos la estrategia de marketing más adecuada centrándonos en conseguir cada uno de los objetivos propuestos. Solicita Presupuesto Ahora

Uso de cookies

En este sitio web utilizamos cookies propias y de terceros para mejorar nuestros servicios, para que usted tenga la mejor experiencia de usuario y analizar su visita. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.