aide prestashop PhenixSuite Help
    • Catégories
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Recherche
    • S'inscrire
    • Se connecter

    Images produit qui disparaissent

    Planifier Épinglé Verrouillé Déplacé Bugs & Améliorations
    30 Messages 4 Publieurs 1.4k Vues 4 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • C Hors-ligne
      camille
      dernière édition par

      Bonjour,
      Depuis quelques jours, je rencontre une bizarrerie soit sur des produits existant, soit sur de nouveaux produits. J'ajoute une image, j'enregistre. Mais l'image est absente sur la fiche produit en FO. Vérification faite, elle n'est effectivement pas dans le dossier p, son dossier n'est pas créé (ou a disparu). C'est aléatoire, des fois ça marche, des fois pas.
      Je ré-envoie l'image, et là ça fonctionne.
      Que dois-je vérifier ?

      Merci d'avance

      1 réponse Dernière réponse Répondre Citer 0
      • herve_02H Hors-ligne
        herve_02
        dernière édition par

        il me semble que moi assis cela le fait , mais je ne manipule pas beaucoup. si je refais çà passe. À un moment j'ai pensé à des problèmes de droits parce que je bidouille pas mal.

        1 réponse Dernière réponse Répondre Citer 0
        • eoliaE Hors-ligne
          eolia
          dernière édition par

          Avant d'enregistrer vous voyez bien l'image dans la liste ? Il n'est pas nécessaire d'enregistrer ensuite car elle est déjà enregistrée normalement.

          Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

          herve_02H C eoliaE 3 réponses Dernière réponse Répondre Citer 0
          • herve_02H Hors-ligne
            herve_02 @eolia
            dernière édition par

            @eolia
            moi si je ne fais pas enregistrer, elle "disparait" (je crois me souvenir, mais je ne manipule pas cette partie là) je me bats avec mondial relay et la livraison à domicile.

            1 réponse Dernière réponse Répondre Citer 0
            • C Hors-ligne
              camille @eolia
              dernière édition par

              @eolia ok mais si on enregistre par habitude, cela ne devrait quand même pas faire disparaître l'image ? C'est récent, je me demande si c'est pas depuis la mise à jour vers la dernière version ?

              1 réponse Dernière réponse Répondre Citer 0
              • eoliaE Hors-ligne
                eolia @eolia
                dernière édition par

                @eolia a dit dans Images produit qui disparaissent :

                Avant d'enregistrer vous voyez bien l'image dans la liste ? Il n'est pas nécessaire d'enregistrer ensuite car elle est déjà enregistrée normalement.

                Pouvez-vous répondre à cette question svp ?

                Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

                1 réponse Dernière réponse Répondre Citer 0
                • eoliaE Hors-ligne
                  eolia
                  dernière édition par

                  add_product_image.gif

                  Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

                  1 réponse Dernière réponse Répondre Citer 0
                  • C Hors-ligne
                    camille
                    dernière édition par

                    Pour ma part, oui, je les vois bien après les avoir ajoutées. C'est après qu'elles "disparaissent" et aucune trace dans le ftp. Ce n'est même pas systématique.

                    1 réponse Dernière réponse Répondre Citer 0
                    • eoliaE Hors-ligne
                      eolia
                      dernière édition par eolia

                      Vous n'avez pas 2 onglets ouverts sur la même page produit ? Un sur lequel vous avez enregistré l'image et pas sur l'autre par exemple et ensuite vous modifiez l'autre (texte ou prix par exemple) et vous l'enregistrez mais lui n'a pas connaissance de l'image.

                      Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

                      1 réponse Dernière réponse Répondre Citer 0
                      • C Hors-ligne
                        camille
                        dernière édition par

                        ah pas bête ça ! je vais y faire attention pour voir si c'est le cas, ce qui ne serait pas étonnant. Merci pour cette piste !
                        Ah, je suis considérée comme nouvel utilisateur, je dois attendre avant de pouvoir envoyer cette réponse !

                        1 réponse Dernière réponse Répondre Citer 0
                        • C Hors-ligne
                          camille
                          dernière édition par

                          bonjour Eolia,
                          Le souci est toujours là. Le matin, on constate que des images ont disparu alors qu'il n'y a eu aucune intervention sur le site.
                          Aujourd'hui, cette page n'a quasiment plus aucune image. Les dossiers correspondants dans le ftp se sont évaporés. J'ai vérifié dans la bdd si ces produits avaient été mis à jour récemment, mais le premier testé ne l'a été qu'en janvier de cette année. Les lignes correspondant à ces produits dans la table image sont toujours là.
                          Sur le clone servant aux tests, en mode maintenance, à priori aucune image n'a disparu, mais on n'y a plus touché depuis un moment.
                          Tout à fait par hasard, cela pourrait-il être lié à la suppression des images orphelines ? La fonctionnalité n'est pas activée et je ne l'ai jamais utilisée mais on ne sait jamais ...

                          1 réponse Dernière réponse Répondre Citer 0
                          • eoliaE Hors-ligne
                            eolia
                            dernière édition par

                            Bonjour,
                            Non la fonctionnalité de nettoyage des orphelines ne s'exécute que si on la met sur OUI et uniquement une fois (ensuite le paramètre repasse à non).
                            Ne sont supprimées que les images qui ne sont liées à aucun produit dans la table ps_image.
                            Le produit de la page concernée a été modifié récemment ? (on peut le voir dans les logs Presta)

                            Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

                            1 réponse Dernière réponse Répondre Citer 0
                            • C Hors-ligne
                              camille
                              dernière édition par

                              Non, j'ai juste vérifié le premier affiché sur la page dont j'ai donné le lien et ai vérifié dans la bdd la date_upd dans la table products. A priori, sa dernière modif date de janvier de cette année.

                              1 réponse Dernière réponse Répondre Citer 0
                              • eoliaE Hors-ligne
                                eolia
                                dernière édition par

                                Je viens de re-scanner le code et les seuls endroits où les images sont supprimées (unlink()) sont dans la classe Image.php mais il faut appeler la fonction deleteImage(), il n'y a rien d'automatique.
                                Pas d'imports, de module de nettoyage ou autre parce que là je ne vois vraiment pas 😞

                                Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

                                1 réponse Dernière réponse Répondre Citer 0
                                • C Hors-ligne
                                  camille
                                  dernière édition par

                                  Ben non, pas d'imports, les produits sont ajoutés manuellement via le BO. Pas de module de nettoyage non plus.
                                  Je vous joins la liste des modules actifs. Certains sont de mon cru, mais aucun n'agit sur les images produits.
                                  C'est vraiment curieux car le problème est survenu il n'y a pas longtemps. On est resté longtemps sur le site de dev (bp de modif dans les textes à faire) sans aucun souci. Cela touche des produits sur lesquels on n'est pas intervenus depuis un moment comme des produits mis à jour ou des nouveaux produits. C'est aléatoire. C'est la surprise du matin ...! J'ai vérifié le module créé pour ajouter le webp aux images des catégories, mais il ne cible que celles-ci et il n'y a pas de deleteImage.
                                  Au début, cela ne semblait concerner que quelques produits. Là (ou est-ce parce cette fois ça touche une page entière) c'est quasi 30 produits.
                                  liste-modules-actifs.jpg

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • C Hors-ligne
                                    camille
                                    dernière édition par

                                    Bonjour, aujourd'hui 30 images ont "disparu".
                                    Alors je cherche.

                                    1. J'ai vu que la régénération des images était automatique. Utilise-t-elle la même procédure que celle de Prestashop ? (qui génère des erreurs 500 quand il y a beaucoup d'images).
                                      Si oui, j'ai peut-être alors une explication sur le nombre de pannes avec erreur 500
                                    2. Si elle est automatique et que le bouton "Supprimer les anciennes images" est activé, alors à chaque fois ces images sont supprimées pour être régénérées.
                                      Sauf que, à première vue, si des produits sont désactivés, les déclinaisons d'images sont supprimées et pas régénérées (home, cart, etc). Mais l'image de base est gardée. Ex 160.jpg
                                      => je n'ai pas encore tout vérifié, mais les images qui disparaissent sont, à priori, toutes dans des sous-dossiers d'images de produits désactivés.
                                      Ex : le produit 946 a une image id 1608, le 947 image id 1609, etc
                                      Dans le dossier 1>0>6 j'ai l'image 160.jpg (produit désactivé) mais je n'ai plus aucun sous-dossier

                                    J'ai désactivé la suppression des images dans la régénération. Il ne m'avait jamais semblé que l'état de ce bouton était pris en compte dans Prestashop.
                                    Donc, est-il possible que le processus de Phenix fasse comme la régénération manuelle de PS, avec prise en compte de l'état du bouton ? Et en provoquant autant d'erreurs 500 ? (au point qu'en général, sur PS, j'installe un module pour le faire, sans surcharge serveur)

                                    Merci d'avance

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • C Hors-ligne
                                      camille
                                      dernière édition par

                                      Je confirme mon doute. J'ai testé sur le dev, à 2 reprises.
                                      Dans la bdd j'ai vu des images "soeurs"
                                      img id = 130 -> prod id = 166
                                      img id = 1301 - prod id = 840
                                      img id = 1302 - prod id = 841
                                      Donc j'ai ajouté une image au prod id 166.
                                      -> tout est ok
                                      J'ai alors supprimé l'ancienne image du prod 166 (img id 130)
                                      -> les produits 840 et 841 ont perdu leurs images, les dossiers 1>3>0>1 et 1>3>0>2 ont été effacés immédiatement.

                                      Je ne sais pas si il y a un lien mais j'ai testé ceci aussi sur le site de dev :
                                      img id 120 prod id 100.
                                      Ajout d'une image que je mets en couv
                                      -> dans le ftp la 120.jpg a perdu ses vignettes (home, cart, etc).
                                      Mais les dossiers 120x sont (encore) là.

                                      Sur le site de prod, hier, il y avait aussi des images "seules", elles semblent avoir toutes disparu aujourd'hui. Et, à priori, personne ne les a supprimées dans les fiches produit. Peut-être un script qui les considérait comme "orphelines" parce que sans vignettes ?

                                      voilà ...
                                      peut-être cela peut-il donner une piste ? un script trop gourmand ?
                                      Et comment savoir à quel moment la régénération automatique se fait ? Pour savoir si cela concorde avec les nombreuses erreurs 500 ?

                                      Merci d'avance !

                                      doekiaD 1 réponse Dernière réponse Répondre Citer 0
                                      • eoliaE Hors-ligne
                                        eolia
                                        dernière édition par

                                        Je vais regarder vos pistes.
                                        Concernant la regénération:

                                        • Plus d'erreur 500 car on ne les regénère plus, c'est en direct au 1er appel en FO ou BO.
                                        • Si vous cochez "Effacer les images précédentes" cela supprime uniquement les miniatures mais jamais l'image d'origine

                                        Créateur de PhenixSuite. Pour plus d'infos : https://eoliashop.com

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • C Hors-ligne
                                          camille
                                          dernière édition par

                                          Merci Eolia. A première vue, avec ChatGpt, nous avons réussi à faire un override de la class Image.php et du controller admin AdminImagesController.php. Testé sur 2 copies du prod, la dernière version semble être ok.
                                          Voici le code de AdminImagesController.php

                                          <?php
                                          /**
                                           * Override anti-cascade pour la suppression/régénération des vignettes
                                           * Phenix/PS 1.6.x – DEV
                                           */
                                          class AdminImagesController extends AdminImagesControllerCore
                                          {
                                              /**
                                               * SAFE: supprime uniquement les tailles explicites, jamais l’original id.jpg,
                                               * et n'exécute pas de nettoyage récursif global (pas de "cascade" sur les soeurs).
                                               */
                                              protected function _deleteOldImages($dir, $type, $product = false)
                                              {
                                                  // TRACE facultative (décommente pour vérifier l’override)
                                                  // @error_log("[IMG] override _deleteOldImages CALLED in ".__FILE__."\n", 3, _PS_ROOT_DIR_."/var/log/img_trace.log");
                                          
                                                  if (!is_dir($dir)) {
                                                      return true;
                                                  }
                                          
                                                  // OK : purge du /img/tmp uniquement
                                                  Tools::deleteDirectory(_PS_TMP_IMG_DIR_, false);
                                          
                                                  // Liste blanche stricte des tailles
                                                  if (!is_array($type) || empty($type)) {
                                                      return true;
                                                  }
                                                  $allowed = array();
                                                  foreach ($type as $t) {
                                                      if (!empty($t['name'])) {
                                                          $allowed[] = $t['name'];
                                                      }
                                                  }
                                                  if (empty($allowed)) {
                                                      return true;
                                                  }
                                          
                                                  $entries = scandir($dir);
                                                  if (!is_array($entries)) {
                                                      return true;
                                                  }
                                          
                                                  foreach ($entries as $d) {
                                                      // Ne JAMAIS toucher à l'original (ex: 130.jpg)
                                                      if (preg_match('/^[0-9]+\.jpe?g$/i', $d)) {
                                                          continue;
                                                      }
                                          
                                                      // Supprimer uniquement :
                                                      //  - id[-id_product]-<type>.jpg|webp
                                                      //  - <lang>-default-<type>.jpg|webp
                                                      foreach ($allowed as $name) {
                                                          $reBase = '/^[0-9]+-'.($product ? '[0-9]+-' : '').preg_quote($name,'/').'\.(?:jpe?g|webp)$/i';
                                                          $reLang = '/^[a-z]{2}-default-'.preg_quote($name,'/').'\.(?:jpe?g|webp)$/i';
                                          
                                                          if (preg_match($reBase, $d) || preg_match($reLang, $d)) {
                                                              $full = $dir.$d;
                                                              if (file_exists($full)) {
                                                                  @unlink($full);
                                                              }
                                                              break;
                                                          }
                                                      }
                                                  }
                                          
                                                  // pas de nettoyage récursif global (source de suppression en cascade)
                                                  // if ($product) { $this->cleanAllImages(_PS_PROD_IMG_DIR_); }
                                          
                                                  return true;
                                              }
                                          
                                              /**
                                               * Par sécurité, si du code legacy appelle encore cleanAllImages(),
                                               * on le rend inoffensif (pas de suppression récursive).
                                               */
                                              public function cleanAllImages($path)
                                              {
                                                  // TRACE facultative
                                                  // @error_log("[IMG] cleanAllImages bypassed in ".__FILE__."\n", 3, _PS_ROOT_DIR_."/var/log/img_trace.log");
                                                  return true;
                                              }
                                          }
                                          

                                          et de Image.php

                                          <?php
                                          /**
                                           * Override SAFE de la classe Image (suppression non-destructive)
                                           * - Ne touche jamais à l’original id.jpg
                                           * - Ne supprime que les tailles de l’image courante
                                           * - Pas de nettoyage récursif / pas de prune des dossiers parents
                                           */
                                          class Image extends ImageCore
                                          {
                                              /**
                                               * Journalise l’appel puis délègue au parent.
                                               * Le parent appellera $this->deleteImage(), qui est overridée ci-dessous.
                                               */
                                              public function delete()
                                              {
                                                  @file_put_contents(
                                                      _PS_ROOT_DIR_.'/var/log/img_trace.log',
                                                      date('c')." Image::delete id_image={$this->id} id_product={$this->id_product}\n",
                                                      FILE_APPEND
                                                  );
                                                  // On laisse le parent gérer la partie BDD (ps_image*, position, cover…)
                                                  return parent::delete();
                                              }
                                          
                                              /**
                                               * Suppression des fichiers sur disque (override SAFE)
                                               * $force_delete est ignoré volontairement pour NE PAS supprimer l’original.
                                               */
                                              public function deleteImage($force_delete = false)
                                              {
                                                  // Chemin de base sans extension, ex: /img/p/1/3/0/0/1300
                                                  $basePath = $this->getPathForCreation();
                                                  $dir      = dirname($basePath).'/';
                                          
                                                 
                                          // 1) SUPPRIMER l’original et ses variantes (jpg, png, webp)
                                          $exts = array('jpg','png','webp');
                                          foreach ($exts as $ext) {
                                              $orig = $basePath.'.'.$ext;
                                              if (file_exists($orig)) {
                                                  @unlink($orig);
                                                  @file_put_contents(
                                                      _PS_ROOT_DIR_.'/var/log/img_trace.log',
                                                      date('c')." unlink original: ".$orig."\n",
                                                      FILE_APPEND
                                                  );
                                              }
                                          }
                                                  // 2) Supprimer UNIQUEMENT les déclinaisons de CETTE image
                                                  $types = ImageType::getImagesTypes('products', false);
                                                  $exts  = array('jpg','webp'); // on couvre les 2 familles
                                                  foreach ($types as $t) {
                                                      $name = stripslashes($t['name']);
                                                      foreach ($exts as $ext) {
                                                          $file = $basePath.'-'.$name.'.'.$ext;
                                                          if (file_exists($file)) {
                                                              @unlink($file);
                                                              @file_put_contents(
                                                                  _PS_ROOT_DIR_.'/var/log/img_trace.log',
                                                                  date('c')." unlink variant: ".$file."\n",
                                                                  FILE_APPEND
                                                              );
                                                          }
                                                          // variante 2x si jamais utilisée
                                                          $file2x = $basePath.'-'.$name.'2x'.'.'.$ext;
                                                          if (file_exists($file2x)) {
                                                              @unlink($file2x);
                                                              @file_put_contents(
                                                                  _PS_ROOT_DIR_.'/var/log/img_trace.log',
                                                                  date('c')." unlink variant2x: ".$file2x."\n",
                                                                  FILE_APPEND
                                                              );
                                                          }
                                                      }
                                                  }
                                          
                                                  // 3) NE PAS remonter dans l’arbo, NE PAS pruner les dossiers parents
                                                  //    (donc pas de rmdir(), pas de cleanAllImages())
                                          
                                                  // On considère l’opération disque OK même si certaines variantes n’existaient pas.
                                                  return true;
                                              }
                                          }
                                          
                                          

                                          Je ne suis hélas pas dév PHP, je peux y apporter des changements, mais pour créer des overrides, j'ai préféré me faire aider. Car pour la gestion du site, cela commençait à devenir vraiment compliqué, ces disparitions d'images. Pour les anciennes, je pouvais les récupérer du clone d'origine. Mais pour les nouvelles, on est obligé de les renvoyer. Avec, en plus, un souci au niveau de la bdd vu que les anciennes assos img/prod n'étaient pas supprimées.

                                          Pour les erreurs 500, si elles ne peuvent être liées à un script auto de régénération, alors d'où peuvent-elles venir ? J'attends un avis de spécialiste demain chez O2Switch car ni eux, ni moi, n'arrivons à trouver une piste 😞

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • C Hors-ligne
                                            camille
                                            dernière édition par

                                            Par contre, est-ce normal que, d'office, le bouton "Effacer les anciennes images" reste actif ? J'ai beau le mettre sur non, quand je reviens sur la page il est de nouveau actif.

                                            1 réponse Dernière réponse Répondre Citer 0
                                            • Premier message
                                              Dernier message
                                            bug
                                            26 sujets
                                            1.6
                                            24 sujets
                                            front-office
                                            11 sujets
                                            1.5
                                            8 sujets
                                            1.7
                                            5 sujets
                                            système
                                            4 sujets
                                            administration
                                            3 sujets
                                            hack
                                            3 sujets
                                            module
                                            3 sujets
                                            performance
                                            3 sujets
                                            smtp
                                            3 sujets
                                            transporteurs
                                            3 sujets
                                            dashboard
                                            2 sujets
                                            https
                                            2 sujets
                                            paypal
                                            2 sujets
                                            promotions
                                            2 sujets