Imaginaerum Posted July 7, 2014 Share Posted July 7, 2014 (edited) Bonjour à tous ! 2 ou 3eme post pour moi... Je suis développeur php et je débute sur presta... Je suis dev Magento à la base ^^ J'importe bien tout un tas de trucs : produits, categories, attributs, declinaisons, etc... Même les images. Sauf que pour les images : quid des legende et attribution du cover ? Je passe par CURL pour importer mes images... j'ai bien un retour XML de l'image... Mais aprés ? pour la légende... je passerais bien volontier par mysql en direct, mais le webservice (trés complet) de prestashop ne peut il faire ça ? Merci d'avance Edited July 7, 2014 by Imaginaerum (see edit history) Link to comment Share on other sites More sharing options...
Imaginaerum Posted July 7, 2014 Author Share Posted July 7, 2014 Je passe par mysql pour le moment... mais je trouve pas ça top... Même si ca fonctionne... Link to comment Share on other sites More sharing options...
buzionweb Posted August 10, 2014 Share Posted August 10, 2014 Salut, je souhaite faire la même chose que toi. Importer des produits via un script maison pour diverses raisons. Je fais une attaque mysql directe pour tout ce que je peux faire comme ça mais les images je sèche. Tu utilises quelle solution toi ? Merci d'avance, Link to comment Share on other sites More sharing options...
Imaginaerum Posted August 11, 2014 Author Share Posted August 11, 2014 Tout par mysql, du code et des portions de code du core... C'est à dire que suivant l'id shop et lang je génére un nom de legende assez unique en fait (pas top, mais obligé)... Du coup je check si ma legende existe. Si oui, on ne fait rien ou on update l'image si elle est différente. Si non, j'importe celle-ci... Par le biais de bouts de code du core et des insertion mysql. Y a un controller qui donne une partie de la solution : \controllers\admin\AdminImportController.php où l'oin retrouve une methode $image->add(); Si la methode resize echoue, presta supprime l'image qu'il a inseré dans la base et le fichier temporaire qu'il a tenté d'importé... Link to comment Share on other sites More sharing options...
buzionweb Posted August 11, 2014 Share Posted August 11, 2014 Je ne sais pas si j'ai tout compris. Mais en fait, si je comprends bien. Si je vais chercher les fonctions/classes utilisées par \controllers\admin\AdminImportController.php et que j'appel convenablement $image->add(); je dois pouvoir ajouter mes images aux produits juste après les avoir créé ? Link to comment Share on other sites More sharing options...
Imaginaerum Posted August 12, 2014 Author Share Posted August 12, 2014 (edited) C'est tout à fait ça... je te laisserais bien volontiers mon coe source, mais il y a trop d'éléments et methodes liées à mon script. du coup ca serait plus compliqué à comprendre... Mais voilà comment ca fonctionne. On a une image source (http, ftp, etc...). De mon côté, je fait un @file_get_contents de cette image. Il faut egalement avoir un id_product pour créer un nouvel objet image: $image_content = @file_get_contents('/path/vers/l_images'); (On peut faire notre file_get_contents vers une url pour peut que la lecture http soit faisable depuis la source) $image = new Image; $image->id_product = $product_id; $image->position = Image::getHighestPosition($product_id) + 1; $image->cover = 0; $image->legend = array($lang_id => $legend); puis enfin: if (($image->validateFields(false, true)) === true && ($image->validateFieldsLang(false, true)) === true && $image->add()) { /* SEE \controllers\admin\AdminImportController.php */ $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import'); $path = $image->getPathForCreation(); $fp = fopen($tmpfile, 'w+'); fputs($fp, $image_content); fclose($fp); if (is_file($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']); } unlink($tmpfile); return $image->id; } else { $image->delete(); } } On notera qu'on met directement l'extension .jpg. Si on veut être "propre" et strict, il faudrait recupérer la config presta et determiner si on est jpg ou png Il faut donc pour la recette : - un id_product - une image - créer un objet image Il faut faire attention a: - ce que l'image existe pas déjà et qu'elle soit affectée à un produit, sinon on aura a chaque fois la même image affectée au produit (d'où la necessité d'avoir une clé unique qui dans ce cas est la légende (car on a pas trop le choix au final). sauf si on commence à comparer le contenu de l'image, sa taille en octet, etc... Edited August 12, 2014 by Imaginaerum (see edit history) Link to comment Share on other sites More sharing options...
buzionweb Posted August 12, 2014 Share Posted August 12, 2014 Merci. Si j'ai bien compris le script, on ajoute systématiquement l'image après les images existantes en prenant l'id de la précédente image c'est ça ? Link to comment Share on other sites More sharing options...
Imaginaerum Posted August 12, 2014 Author Share Posted August 12, 2014 On peut faire comme on veut en fait... là c'est la facilité de les placer les unes derrières les autres. si ona besoin de changer l'ordre il surffit de recuperer les images associées au produit et de reaffecter la position Link to comment Share on other sites More sharing options...
buzionweb Posted September 3, 2014 Share Posted September 3, 2014 Salut, Je viens d'attaquer la partie chargement des images, mais, je ne trouve pas quels sont les fichiers prestashop que je dois inclure dans le fichier de mon script pour que le chargement des images fonctionne. J'ai regardé adminimportcontroller mais il ne fait l'inclusion d'aucun fichier presta pour les fonctions qu'il utilise. Elle doivent être chargé plus haut dans la hiérarchie des fichiers mais je ne sais pas où trouver ça. Tu pourrais me dire quels fichier je dois includer pour que ton script fonctionne ? Link to comment Share on other sites More sharing options...
Imaginaerum Posted September 3, 2014 Author Share Posted September 3, 2014 Il faut inclucre le fichier config.php de prestashop $config = dirname(dirname(dirname(__FILE__))) . '/config/config.inc.php'; include_once $config; dirname(dirname(dirname(__FILE__))) fait pointer vers la racine, il faut donc peut être modifier l'inclusion des dirname pour avoir le bon chemin. car dans le code que je donne plus haut, j'inclus depuis un fichier situé dans un de mes plugins Link to comment Share on other sites More sharing options...
buzionweb Posted September 3, 2014 Share Posted September 3, 2014 (edited) Merci. J'ai un soucis avec cette inclusion. J'ai fais ça : include_once ("mon_chemin/config/config.inc.php"); mais quand je lance le script dans lequel j'ai fais cette inclusion et dans lequel j'ai mis ton script d'ajout d'image ça me redirige sur la home de la boutique. La solution que j'ai trouvé pour contourner le problème est de placer mon script à la racine du site. J'avais créé un sous domaine pour héberger mon script. Une idée ? Edit : Si je boucle sur ton script pour ajouter plusieurs photo ou par exemple si il est dans une boucle de plusieurs produits il provoque l'arrêt de la boucle après le premier ajout d'iimage. Edited September 4, 2014 by buzionweb (see edit history) Link to comment Share on other sites More sharing options...
buzionweb Posted September 5, 2014 Share Posted September 5, 2014 Pas d'idée ? Link to comment Share on other sites More sharing options...
buzionweb Posted September 8, 2014 Share Posted September 8, 2014 Bon, j'ai contourné les problèmes. - Pour éviter le problème de redirection j'ai installé le script d'enregistrement d'images à la racine de la boutique. - Pour éviter la rupture de la boucle php au lieux d'inclure le fichier d'enregistrement d'image, ou de l'appeler en tant que fonction, je fait un filegetcontent dessus puisque maintenant il n'est plus dans le même domaine que mon script de gestion ; Ce dernier étant dans un sous repertoire. Par contre Je n'ai pas trouvé de logique dans le code pour enregistrer des images pour les déclinaisons. Une idée ? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now