Techno-magis

  • Home
  • March 2014
  • Ajouter des images et fichiers sur un article dans PrestaShop

Ajouter des images et fichiers sur un article dans PrestaShop

Wednesday 19th March 2014

Travaillant avec des webservices, je n'ai pas physiquement mes fichiers à intégrer dans PrestaShop. Il m'a donc fallu trouver des solutions pour pouvoir intégrer des documents venant de l'extérieur. Après quelques recherches, je suis arrivé à trouver comment ajouteras des images (pour le visuel) et des fichiers joints.

J'ai commencé avec les images.

CODE:

/**
 * Ajout d'une photo sur un article
 * @param Product $product l'article où l'on souhaite ajouter l'image
 * @param string $file binaire de la photo
 * @param string $image_format format de la photo (jpg, png, gif)
 */
function addImage(Product $product, $file, $image_format) {
 
	## création et ajout de l'image
	$image = new Image();
	$image->image_format = $image_format; 
	$image->id_product   = intval($product->id);
	// ajouter à la dernière position
	$image->position     = Image::getHighestPosition($product->id) + 1; 
	// si c'est la première, la placer en couverture
	$image->cover        = Image::getImagesTotal($product->id) == 0; 
	$image->add();
 
	## copie du fichier dans le dossier temporaire
	$tmpName = tempnam(_PS_IMG_DIR_, 'PS');
	file_put_contents($tmpName, $file);
 
	## création des différentes images nécessaire
	$new_path = $image->getPathForCreation();
	// Génère l'image par défaut
	ImageManager::resize($tmpName, $new_path.'.'.$image->image_format); 
	// récupére les différents formats
	$images_types = ImageType::getImagesTypes('products');
	// créer un miniature pour toutes la tailles nécessaires pour un article
	foreach ($images_types as $image_type) {
		ImageManager::resize(
			$tmpName,
			$new_path.'-'.stripslashes($imageType['name']).'.'.$image->image_format,
			$image_type['width'],
			$image_type['height'],
			$image->image_format
		);
	}
}

Pour ce qui est cette fois d'attacher un fichier à un article quand le fichier n'est pas physiquement sur le serveur. C'est un peu différent, car les fichiers ne sont pas directement rattachés à un article. On crée une pièce-jointe que l'on va ensuite rattacher à un article.

CODE:

/**
 * Ajout d'une pièce jointe sur un article
 * @param Product $product l'article où l'on souhaite attacher une pièce-jointe
 * @param string $file binaire de la photo
 * @param string $name nom du fichier
 */
function addAttachment(Product $product, $file, $name) {
 
	# écriture du fichier sur le serveur
	// Génération d'un nom de fichier unique
	do $uniqid = sha1(microtime());
	while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));
	// Copie du fichier sur la cible 
	file_put_contents(_PS_DOWNLOAD_DIR_.$uniqid, $file);
 
	# Création de l'attache
	$attachment = new Attachment();
	$attachment->file      = $uniqid;
	// génère automatiquement le MIME type
	$attachment->mime      = finfo_file(finfo_open(FILEINFO_MIME_TYPE), _PS_DOWNLOAD_DIR_.$uniqid);
	// nom du fichier tel qu'il sera vu
	$attachment->file_name = $name;
 
	# description (dans toutes les langues)
	$languages = Language::getLanguages(false);
	foreach ($languages as $language) {
		$attachment->name[(int)$language['id_lang']] = substr($name, 0, 32);
		$attachment->description[(int)$language['id_lang']] = '';
	}
 
	# sauvegarde en base
	$attachment->add();
 
	# attachement du fichier à l'article
	$attachment->attachProduct($product->id);
}

Bien entendu, ça peut être simplifié pour juste créer des pièces jointes et ensuite les rattachés à divers produits.

Il peut être nécessaire de supprimer les précédentes images ou pièces-jointes. Sur l'objet Product c'est assez simple, il suffit de faire comme ceci :

CODE:

// supprime les images
$product->deleteImages();
// supprime les attaches des pièces-jointes (ne supprime pas les fichiers)
$product->deleteAttachments();

Pour supprimer tout les attaches, il faudra le faire manuellement. De préférence avant la suppression du lien avec l'article.
Comme ceci par exemple :

CODE:

function deleteAttachmentsByProduct(Product product, $id_lang) {
	$attaches = Product::getAttachmentsStatic((int) $id_lang, $product->id);
	if(!empty($attaches)) {
		foreach ($attaches as $attache) {
			$attachment = new Attachment((int)($attache['id_attachment']));
			$attachment->delete();
		}
	}
}

Categories:
By Zéfling, the 19/03/2014 at 20:28:41
The ticket was read 749 times, with 1 comment posted.

1 comment posted

By Sladix, the 11/12/2014 at 12:19:47
Guest

Bonne ressource ! Utile et pratique, un copié collé de fonctions et c'est parti !

Write a commentary