Techno-magis

Ajouter des images et fichiers sur un article dans PrestaShop

2014年3月19日(水曜日)

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.

コード:

/**
 * 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.

コード:

/**
 * 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 :

コード:

// 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 :

コード:

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();
		}
	}
}

カテゴリ:
Zéflingによって、 2014/03/19 20:28:41
719回を読んだ。1件のコメントが投稿されています。

全1コメント

Sladixによって、 2014/12/11 12:19:47
訪問者

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

コメントを書き込む