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