Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Cómo añadir productos a tu Prestashop 1.6 por código.

18 octubre, 2016

En esta entrada vamos a ver como añadir productos a tu tienda online hecha con Prestashop, la versión para lo que corre bien es 1.6 y 1.7, no he probado en más versiones así que es posible que tengas que realizar algunos ajustes si te sales de estas versiones.

La idea es que recibas los productos desde algun servicio web y después modifiques las variables a tu gusto, subas o bajes los precios, cambies los titulos, las descripciones o lo que quieras. Esto ya queda a tu gusto.

Esto sería así, creamos la instancia $object , qué será un objeto tipo Product, y le añadiremos los atributos necesarios para poder “volcar” el producto a tu tienda.

Los atributos son fáciles de entender, os dejo un ejemplo de como lo he subido yo. Aunque es obvio que tendrás que cambiarlo por los datos que tu quieras.

Las variables que encuentres a la derecha $ean13, $referencia… … previamente las he asignado el valor que quiero que tengan.


ean13 = $ean13;
name =array((int)(Configuration::get('PS_LANG_DEFAULT')) => $name);
id_manufacturer = $numero;
sku = $referencia;
reference = $referencia;
quantity = 0;
minimal_quantity = 1;
additional_shipping_cost = 0; 
wholesale_price = 0;
ecotax = 0;
width = 0;
height = 0;
depth = 0;
weight = 0;
out_of_stock = 0;
active = 0;

id_category_default = (int)$numeroC;
category = (Array)((int)$numeroC);

available_for_order = 0;
show_price = 1;
on_sale = 0;
online_only = 1;
meta_keywords = $name;
link_rewrite = array((int)(Configuration::get('PS_LANG_DEFAULT')) => $referencia);//
description_short = array((int)(Configuration::get('PS_LANG_DEFAULT')) => $name);
description = array((int)(Configuration::get('PS_LANG_DEFAULT')) => $name.'
'. $description;

logo-2015

Y este sería el ejemplo completo para poder subir productos “por código“:

                $defaultLanguage = new Language((int)(Configuration::get('PS_LANG_DEFAULT')));  
		/* Añadiendo un nuevo producto */
		$object = new Product();
		$object->price = 1000;
		$object->id_tax_rules_group = 0;
		$object->ean13 = $ean13;
		$object->name =array((int)(Configuration::get('PS_LANG_DEFAULT')) => $name);
		$object->id_manufacturer = $numero;
		$object->sku = $referencia;
		$object->reference = $referencia;
		$object->quantity = 0;
		$object->minimal_quantity = 1;
		$object->additional_shipping_cost = 0; 
		$object->wholesale_price = 0;
		$object->ecotax = 0;
		$object->width = 0;
		$object->height = 0;
		$object->depth = 0;
		$object->weight = 0;
		$object->out_of_stock = 0;
		$object->active = 0;
 
		$object->id_category_default = (int)$numeroC;
		$object->category = (Array)((int)$numeroC);
 
		$object->available_for_order = 0;
		$object->show_price = 1;
		$object->on_sale = 0;
		$object->online_only = 1;
		$object->meta_keywords = $name;
		$object->link_rewrite = array((int)(Configuration::get('PS_LANG_DEFAULT')) => $referencia);//notincludes
		$object->description_short = array((int)(Configuration::get('PS_LANG_DEFAULT')) => $name);
		$object->description = array((int)(Configuration::get('PS_LANG_DEFAULT')) => $name.'<br><h3>'.$attribute.'</h3><br><h3>Incluye:</h3><br>'.$includes.'<br> <h3>No Incluye:</h3><br>'.$notincludes.'<br>');
 
		$object->save();
 
 
		//Añade una imagen principal
 
		$id_product = $object->id;
 
		echo '<br>id_product:'.$id_product .'<br>';
 
		$url = 'http://donde-esta-la-imagen.com/img/'.$imagenReferencia.'.jpg';
		echo '<br>imagen:'.$url .'<br>';// traza para ver la ruta e imagen
		$shops = Shop::getShops(true, null, true);    
		$image = new Image();
		$image->id_product = $id_product;
		$image->position = Image::getHighestPosition($id_product) + 1;
		$image->cover = true; // or false;
		if (($image->validateFields(false, true)) === true &&
		($image->validateFieldsLang(false, true)) === true && $image->add())        {
		    $image->associateTo($shops);
		    if (!AdminImportController::copyImg($id_product, $image->id, $url, 'products', false))
		    {
			echo '<br>Borrando!';  //Si quieres borrar la imagen después 
			$image->delete();
		    }
		}
 
                // Añade una categoría Principal
 
		$object->id_category_default = (int)$numeroC;
		$object->category = (Array)((int)$numeroC);
		$object->addToCategories(array($numeroC,2));
		$object->save();
Consideraciones:

He hecho un save() varías veces porque para poder asignar una imagen principal y una categoría principal el producto tiene que estar salvado previamente, es por ello que añado el producto con un save() y después añado el resto de parámetros que quiero añadir a ese producto.

Y voilá! listo, añadido tu producto a tu flamante tienda Prestashop.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Comentarios (10)

Buenas! Tengo un ligero problemilla añadiendo la imagen a mi producto. Parece que la añade bien, pero la deja en blanco… ¿puede ser por temas de permisos o algo? Un saludo crack!

Responder

Buenas,

Después de añadirlas que tienes que regenerar las imágenes para que las coja tu theme del tamaño que tenga puesto.

Dentro del administrador , dónde tienes las imágenes , tienes que darle a regenerar.

Estoy en el móvil no recuerdo la ruta exacta pero ese es el paso que te quedaría para las imágenes

Responder

Nada, parece ser otro problema, al regenerar me salta el error:

Falta la imagen original o está vacía (/img/p/3/3/1/5/1/33151.jpg) para el producto ID 5493

Menudo dolor de cabeza me está dando esto ya.. 🙁

Responder

ummm,
cuando le indicas la imagen en esta linea ,
asegúrate de que está correcta la ruta: (aquí puse .jpg pero no tienen por qué ser jpg)
(asegúrate de mayusculas y minúsculas, también http o https www o sin www.)

$url = \'http://donde-esta-la-imagen.com/img/\'.$imagenReferencia.\'.jpg\';

como en la línea siguiente mostrará el echo visita la imagen y mira que esté visible:
echo \'imagen:\'.$url ;

a ver si alguna regla de Apache o nginx hace que no tengas acceso o una redirección, o que no esté visible.

Responder

Nada, la ruta es totalmente correcta y desde el servidor es accesible 🙁
Ya no se qué puede ser…

ummm, prueba con la solución que te comenta mi compañero Alex.
Y nos cuentas , a ver si te vale

Saludos

La solución:

Edita el archivo controllers/admin/AdminImagesController.php

busca:

•. // No need to display the old image system if the install has been made later than 2013-03-26

•. $this->display_move = (!Configuration::get(‘PS_LEGACY_IMAGES’) && defined(‘_PS_CREATION_DATE_’) && strtotime(_PS_CREATION_DATE_) > strtotime(‘2013-03-26’)) ? false : true $this->

display_move = false;

y cambia lo último por $this->display_move = true;

Después ve dentro de Preferencias -> Imágenes

Ya aparece la opción de poner el almacenamiento por defecto como lo tenías en la anterior versión.

Marca usar almacenamiento por defecto.

Ahora debes usar una copia de seguridad de la carpeta img antes de actualizar y la reemplazas por la que tienes en la actualización.

Después de recuperar la carpeta img debes ir a preferencias, imágenes y pulsa en mover imágenes al nuevo tipo de almacenamiento.

Y por último desmarca usar almacenamiento por defecto y regenera miniaturas…..

Espero que te valga

Responder

Gracias Alex por aportar tu solución

Responder

Creo que no se aplica a mi problema, estoy usando la versión 1.7 y además no encuentro ese código por ningún sitio

Responder

no claro, entonces no te valdría, esto es para 1.5 cuando migran a 1.6
En 1.7, igual no te vale el código, muchas veces si vale pero tendrías que debugar el codigo para ver si da algún problema.
Yo lo probé con 1.6 con 1.7 no sabría decirte si vale o si hay que cambiar alguna cosilla.

suerte!, y cualquier cosa estamos por aquí

Saludos

Responder