Crear un producto en Prestashop 1.7 con PHP

Crear un producto en Prestashop 1.7 con PHP

PHP

Crear un producto en Prestashop 1.7 con PHP no es nada complicado si conoces un poco la forma de funcionar de esta plataforma.

Si estás implementando un sistema de sincronización de datos o una integración entre distintas plataformas con Prestashop, puede resultarte útil conocer cómo crear productos en Prestashop 1.7 mediante PHP.

Sobre Prestashop

Prestashop es una plataforma de comercio online de código libre u open source construída en PHP.

Actualmente, es muy utilizado a nivel mundial para la creación de ecommerce de pequeñas y medianas empresas.

Su funcionalidad puede ser ampliada mediante módulos existentes, los cuales pueden ser gatuitos o de pago.

Instanciar un producto

Prestashop tiene una clase llamada Product que podremos instanciar sin parámetros, o pasándole un número. Si instanciamos la clase Product sin parámetro será para crear un producto. En cambio, si le pasamos un parámetro, será para modificar un producto cuyo id será ese número.

$producto1 = new Product(); // Crearemos uno nuevo
$producto2 = new Product(8); // Modificaremos el producto con id 8

Campos de un producto en Prestashop 1.7

El número y tipo de campos que necesitaremos para crear un producto en Prestashop 1.7 con PHP puede cambiar según la versión de Prestashop en la que estemos trabajando.

La mejor forma de comprobar qué campos tenemos, es abrir el fichero php en el que se encuentra la clase Product.

Este fichero se llama Product.php y podremos encontrarlo en nuestar instalación de Prestashop, dentro del directorio classes.

Dentro de este fichero se encuentra la clase Product, con sus atributos y métodos.

Uno de esos atributos se llama $definition y, al igual que en otras clases de Prestashop, especifica parámetros y los campos que utiliza la clase a la que pertenece. Estos campos se encuentran dentro del índice llamado fields.

Crear un producto en Prestashop 1.7 con PHP

Dependiendo de la tipología de nuestros productos utilizaremos más o menos campos cuando decidamos crearlos en nuestra tienda online.

También deberemos tener en cuenta que si lo que buscamos es sincronizar los datos, deberemos utilizar los id de Prestashop para poder instanciar el objeto asociado al dato que queremos actualizar.

Por ejemplo, si queremos crear o modificar un producto necesitaremos saber los id de los datos relacionados, como por ejemplo el id de la marca o el id de las categorías a las que pertenece nuestro producto.

Cómo crear un producto en Prestashop 1.7 utilizando PHP

Crear un producto en Prestashop mediante PHP no es nada complicado. A continuación veremos un ejemplo muy simple en el que utilizaremos varios de los campos disponibles (no todos).

Crearemos un producto de ejemplo en nuestra tienda de Prestashop 1.7 utilizando sólo PHP.

Para ello, podemos crear un archivo PHP dentro del directorio de nuestro módulo (si es que estamos creando uno) con el siguiente contenido:

/* Necesario para trabajar con las clases de Prestashop */
include(dirname(__FILE__).'../../../../config/config.inc.php');

/* Información de nuestro producto */
$data = array(
	"active" => true, 
	"show_price" => true, 
	"price" => 20.99,
	"wholesale_price" => 9.58,
	"available_for_order" => true, 
	"minimal_quantity" => 10, 
	"ecotax" => 2.55, 	
	"width" => 12.56, 
	"height" => 25, 
	"depth" => 4.10, 
	"weight" => 0.98, 
	"additional_shipping_cost" => 12.25,
	"delivery_in_stock" => "Delivery between 2 and 5 days", 
	"delivery_out_stock" => "Delivery between 20 and 25 days", 
	"low_stock_alert" => true, 
	"online_only" => true, 
	"low_stock_threshold" => 6, 
	"stock" => 625, 
	"reference" => "TEST00001",
	"isbn" => "978-3-16-148410-0", 
	"name" => "Book The prime price",
	"description_short" => "Buy now The prime price book!",
	"description" => "This book has been written in 2022 by one of the best authors of the moment.",
	"meta_title" => "Buy the Book The prime price here!",
	"meta_keywords" => "Book, Prime price, Books",	
	"meta_description" => "Buy the best book now! This book has been written in 2022 by the best author of the moment",
	"ean13" => "8435407113015", 
	"redirect_type" => "301-category", 
	"id_manufacturer" => 246,
	"id_language" => 3,
	"id_category_default" => 2,
	"id_categories" => array(1781, 1669),
);


/* Create */
$product = new Product();

/* Product identification */
$product->reference = $data["reference"];
$product->ean13 = $data["ean13"];
$product->isbn = $data["isbn"];
$product->id_manufacturer = $data["id_manufacturer"];

/* Product name and descriptions */
$product->name[$data["id_language"]] = $data["name"];
$product->description_short[$data["id_language"]] = $data["description_short"];
$product->description[$data["id_language"]] = $data["description"];

/* SEO */
$product->redirect_type = $data["redirect_type"];
$product->meta_keywords[$data["id_language"]] = $data["meta_keywords"];
$product->meta_title[$data["id_language"]] = $data["meta_title"];
$product->meta_description[$data["id_language"]] = $data["meta_description"];

/* Categorization */
$product->id_category_default = $data["id_category_default"];

/* About stocks */
$product->low_stock_threshold = $data["low_stock_threshold"];
$product->low_stock_alert = $data["low_stock_alert"];

/* About delivery */
$product->width = $data["width"];
$product->height = $data["height"];
$product->depth = $data["depth"];
$product->weight = $data["weight"];
$product->additional_shipping_cost = $data["additional_shipping_cost"];
$product->delivery_in_stock = $data["delivery_in_stock"];
$product->delivery_out_stock = $data["delivery_out_stock"];

/* About sell */
$product->online_only = $data["online_only"];
$product->price = $data["price"];
$product->show_price = $data["show_price"];
$product->ecotax = $data["ecotax"];
$product->minimal_quantity = $data["minimal_quantity"];
$product->available_for_order = $data["available_for_order"];
$product->id_tax_rules_group = (int)Configuration::get('JS_B2B_DEFAULT_TAX_RULE');

/* Others */
$product->wholesale_price = $data["wholesale_price"];
$product->indexed = 1;
$product->active = $data["active"];


/* Process */

/* Add product */
$result = $product->add();

/* Set stock */
StockAvailable::setQuantity($product->id, null, $data["stock"]);

/* Set categories */
$product->addToCategories($data["id_categories"]);

Aunque puede parecer mucho código, la realidad es que se trata de un ejemplo muy simple.

En primer lugar, hemos creado un array para definir la información de nuestro producto. En tu caso, esta información puede venir de un archivo CSV, una base de datos, etc.

A continuación hemos creado una instancia de la clase Product propia de Prestashop.

En la instancia de esta clase, hemos asignado el valor a los distintos atributos según la información de nuestro array de información.

Después, llamando al método add se crea el producto realmente en nuestra tienda.

A continuación, cuando ya disponemos de un id de producto, establecemos el stock y asignamos las categorías a nuestro producto.

Como puedes comprobar, todo el código del ejemplo está comentado para que se pueda entender facilmente el funcionamiento y cómo crear un producto en Prestashop programando en PHP.

Cómo añadir imagen principal a un producto en Prestashop

Siguiendo con el ejemplo anterior, probablemente necesites añadir una imagen al producto que acabamos de crear.

Para ello, aunque puedes encontrar varias formas y funciones en la red, nosotros te proponemos utilizar la siguiente función:

/**
 * copyProductImage copy an image located in $url and save it in a path
 *
 *
 * @param int $id_product id of product
 * @param int $id_image id of the image
 * @param string $url path or url to use
 *
 * @return bool
 */
function copyProductImage($id_product, $id_image, $url) {
	$tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import');
	$watermark_types = explode(',', Configuration::get('WATERMARK_TYPES'));

	$image_obj = new Image($id_image);
	$path = $image_obj->getPathForCreation();

	$url = str_replace(' ', '%20', trim($url));
	if(!ImageManager::checkImageMemoryLimit($url)) return false;

	if(Tools::copy($url, $tmpfile)) {
		ImageManager::resize($tmpfile, $path . '.jpg');
		$images_types = ImageType::getImagesTypes('products');
		foreach($images_types as $image_type){
			ImageManager::resize($tmpfile, $path . '-' . stripslashes($image_type['name']) . '.jpg', $image_type['width'], $image_type['height']);
			if(in_array($image_type['id_image_type'], $watermark_types)){
				Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_product));
			}
		}
	}else{
		unlink($tmpfile);
		return false;
	}
	unlink($tmpfile);
	return true;
}

En Prestashop 1.7 existe un método similar dependiente de la clase AdminImportControllerCore que se llama copyImg, pero al tratarse de un método protected no podremos utilizarlo en nuestro caso.

Para utilizar la función que hemos creado, necesitarás pasarle e id de producto, id de la imagen y la url de la propia imagen que queremos asignar.

Continuando el ejemplo anterior, podríamos hacer esto para asignar una imagen a nuestro producto:

/* Set image */
$url = 'https://img.freepik.com/free-vector/open-blue-book-white_1308-69339.jpg';
$image = new Image();
$image->id_product = $product->id;
$image->position = 1;
$image->cover = true;

if (($image->validateFields(false, true)) === true &&
	($image->validateFieldsLang(false, true)) === true && $image->add()){
	if(!copyProductImage($product->id, $image->id, $url)){
		$image->delete();
	}
}

Si los campos que tenemos de la imagen son válidos y el resultado de invocar el método add del objeto imagen devuelve true, llamamos a nuestra función para copiar físicamente la imagen. En caso de que esto falle, eliminaremos la imagen para que no queden entradas rotas en nuestra base de datos.

Leave a reply