Jump to content

Image API


Recommended Posts

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 by Imaginaerum (see edit history)
Link to comment
Share on other sites

  • 1 month later...

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

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

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

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 by Imaginaerum (see edit history)
Link to comment
Share on other sites

  • 4 weeks later...

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

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

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 by buzionweb (see edit history)
Link to comment
Share on other sites

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...