Bildupload & Ultrapics

jeans-base.de

Aktives Mitglied
4. Februar 2007
27
0
Nähe Chemnitz
Hallo,

ich habe mir mal die Mühe gemacht und den Bild-Upload (auch Ultra-Pics) näher betrachtet.
Grundlage meiner Ausführung ist der Tread
[url]http://www.jtl-software.de/forum/viewtopic.php?t=3555 [/url]

Generell gefällt mir die Lösung schon sehr gut, nur leider fehlt das löschen von Dateien in diesen Scripten völlig... damit entstehen mehr und mehr Dateileichen auf dem Server.

Kurz zu Situation. Ich verwende nicht die offizielle Contri Ultra-Pics, da ich davor erkannte, dass in der Originalversion von OSC alle Bilder immer die gleiche riesige Dateigröße haben... nur werden sie als vermeindliches "Vorschaubild" im richtigen Seitenverhältnis skaliert, die Dateigröße des Bildes bleibt dabei erhalten.

Nun hab ich mir mal einen Kopf gemacht und OSC so verändert, dass alle Bilder autom. als kleines Thumbnail in einem separaten Ordner abgelegt werden. Diese werden autom. beim ersten Gebrauch erzeugt.
Warum nicht UltraPics? Da ich ungern Datenbanken und Tabellen leichtfertig erweitere, hab ich mir erst einmal Gedanken gemacht, wie man es anders lösen kann. Mein erstes Bild wird in die Tabelle products geschrieben und alle weiteren Bilder werden laut Schema 25_0.jpg, 25_1.jpg usw... auf dem Server abgelegt. Beim Aufruf eines Artikels im OSC schaue ich zur Laufzeit nach, ob das Bild mittels file_exists(string filename) existiert. Wenn ja, wird es zur Anzeige gebracht. Wenn nicht, dann nicht.

Soviel zu meiner Version, ich schreib mal, was mir beim intensiven Testen aufgefallen ist.

Code:
if (intval($_POST['kArtikelBild'])>0 && intval($_POST['nNr'])==2 && $_FILES['bild']) 
   { 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['kArtikelBild'])); 
      if ($products_id>0) 
      { 
         $bildname=$products_id."_".(intval($_POST['nNr'])-1).".jpg"; 
         move_uploaded_file($_FILES['bild']['tmp_name'],DIR_FS_CATALOG_IMAGES.$bildname); 
         chmod (DIR_FS_CATALOG_IMAGES.$bildname, 0644); 

         //updaten 
         eS_execute_query("update products set  products_image_sm_1=\"$bildname\" where products_id=".$products_id); 
                         eS_execute_query("update products set  products_image_xl_1=\"$bildname\" where products_id=".$products_id); 
      } 
   } 
         if (intval($_POST['kArtikelBild'])>0 && intval($_POST['nNr'])==3 && $_FILES['bild']) 
   { 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['kArtikelBild'])); 
      if ($products_id>0) 
      { 
         $bildname=$products_id."_".(intval($_POST['nNr'])-1).".jpg"; 
         move_uploaded_file($_FILES['bild']['tmp_name'],DIR_FS_CATALOG_IMAGES.$bildname); 
         chmod (DIR_FS_CATALOG_IMAGES.$bildname, 0644); 

         //updaten 
         eS_execute_query("update products set  products_image_sm_2=\"$bildname\" where products_id=".$products_id); 
                         eS_execute_query("update products set  products_image_xl_2=\"$bildname\" where products_id=".$products_id); 
      } 
   } 
         if (intval($_POST['kArtikelBild'])>0 && intval($_POST['nNr'])==4 && $_FILES['bild']) 
   { 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['kArtikelBild'])); 
      if ($products_id>0) 
      { 
         $bildname=$products_id."_".(intval($_POST['nNr'])-1).".jpg"; 
         move_uploaded_file($_FILES['bild']['tmp_name'],DIR_FS_CATALOG_IMAGES.$bildname); 
         chmod (DIR_FS_CATALOG_IMAGES.$bildname, 0644); 

         //updaten 
         eS_execute_query("update products set  products_image_sm_3=\"$bildname\" where products_id=".$products_id); 
                         eS_execute_query("update products set  products_image_xl_3=\"$bildname\" where products_id=".$products_id); 
      } 
   } 
         if (intval($_POST['kArtikelBild'])>0 && intval($_POST['nNr'])==5 && $_FILES['bild']) 
   { 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['kArtikelBild'])); 
      if ($products_id>0) 
      { 
         $bildname=$products_id."_".(intval($_POST['nNr'])-1).".jpg"; 
         move_uploaded_file($_FILES['bild']['tmp_name'],DIR_FS_CATALOG_IMAGES.$bildname); 
         chmod (DIR_FS_CATALOG_IMAGES.$bildname, 0644); 

         //updaten 
         eS_execute_query("update products set  products_image_sm_4=\"$bildname\" where products_id=".$products_id); 
                         eS_execute_query("update products set  products_image_xl_4=\"$bildname\" where products_id=".$products_id); 
      } 
   } 
         if (intval($_POST['kArtikelBild'])>0 && intval($_POST['nNr'])==6 && $_FILES['bild']) 
   { 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['kArtikelBild'])); 
      if ($products_id>0) 
      { 
         $bildname=$products_id."_".(intval($_POST['nNr'])-1).".jpg"; 
         move_uploaded_file($_FILES['bild']['tmp_name'],DIR_FS_CATALOG_IMAGES.$bildname); 
         chmod (DIR_FS_CATALOG_IMAGES.$bildname, 0644); 

         //updaten 
         eS_execute_query("update products set  products_image_sm_5=\"$bildname\" where products_id=".$products_id); 
                         eS_execute_query("update products set  products_image_xl_5=\"$bildname\" where products_id=".$products_id); 
      } 
   } 
         if (intval($_POST['kArtikelBild'])>0 && intval($_POST['nNr'])==7 && $_FILES['bild']) 
   { 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['kArtikelBild'])); 
      if ($products_id>0) 
      { 
         $bildname=$products_id."_".(intval($_POST['nNr'])-1).".jpg"; 
         move_uploaded_file($_FILES['bild']['tmp_name'],DIR_FS_CATALOG_IMAGES.$bildname); 
         chmod (DIR_FS_CATALOG_IMAGES.$bildname, 0644); 

         //updaten 
         eS_execute_query("update products set  products_image_sm_6=\"$bildname\" where products_id=".$products_id); 
                         eS_execute_query("update products set  products_image_xl_6=\"$bildname\" where products_id=".$products_id); 
      } 
   }

Laut den IF's muss ein Bild kommen, ansonsten greift alles, was dahinter kommt absolut nicht. Wenn jetzt aber ein Bild verändert wird, hat es unter folgenden Voraussetzungen keine Wirkung. Ich gehe ins WAWI zu Artikel bearbeiten und möchte nur die Reihenfolge der angezeigten Bilder verändern.
Leider kommt in solch einem Fall beim Internetabgleich keine Info mit, das sich die Reihenfolge geändert hat (vielleicht doch) aber es wird kein Bild gepostet. Damit greifen die Mechanismen im o.g. Code gar nicht!

Jetzt haben sich hier einige auch einen Kopf gemacht, wie man die Bilder eventl. wieder losbekommt bzw. löscht. Erst mal den Code vom Tread [url]http://www.jtl-software.de/forum/viewtopic.php?t=3555 [/url], den ich meine:

Code:
if (intval($_POST["action"]) == 3 && intval($_POST['KeyArtikel'])>0) 

   { 
      $return =0; 
      //hol products_id 
      $products_id = getFremdArtikel(intval($_POST['KeyArtikel'])); 
      if ($products_id>0) 
      { 
         eS_execute_query("update products set products_image='' where products_id=".$products_id); 
      } 
  if ($products_id>0) 
      { 
         eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
         eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
           eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
           eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
          eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
          eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
           eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
           eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
          eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
           eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
          eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 
                 if ($products_id>0) 
      { 
           eS_execute_query("delete from products_images where products_id=".$products_id); 
      } 

   } 
}

Der Code kann nicht klappen. Er ist nur zum löschen gut aber nicht zum aktualisieren.
Zuerst wird hier ein update auf die Tabelle products gemacht um den Bildnamen zu löschen und dann werden mit delete alle anderen Bilder aus der Tabelle product_images gelöscht .... sorry, außer Code nix weiter.... denn einmal die Abfrage

if ($products_id>0)
{
eS_execute_query("delete from products_images where products_id=".$products_id);
}

hätte auch gereicht... so wie Alf richtig erkannt hat.

Nur wird jetzt leider noch kein Bild aktualisiert, nur aus der DB gelöscht, da wieder kein neues Bild per Upload beim Connector ankommt und der Code ganz oben nicht greifen kann. Geschweige, das je ein Bild auf dem Server tatsächlich gelöscht werden kann, denn außer move_uploaded_file() ganz oben im Qellcode habe ich keine Dateiarbeit im Filesystem gesehen.
Damit aber Bilder in der Reihenfolge verändert werden können, müssen diese aus dem WAWI wieder gepostet werden, sonst wie schon oben gesagt, greift der Quellcode ganz oben gar nicht. Ich gehe noch ein stück weiter. Wenn ein Bearbeiter in WAWI nur mal die Überschrift oder einen Sonderpreis verändern will, so werden die Bilder im OSC aus der DB gelöscht.

Es ist also eine höchst verzwickte Situation hier. Wie könnte es sauber gelöst werden. Ich habe in der Datei Artikel.php folgenden Code nach dem Update der Tabelle Products eingefügt:

Code:
alle Bilder werden beim POSTEN gelöscht 
for($i = 0; $i < 7; $i++){
    $bild = $products_id."_".$i.".jpg";
	if (file_exists(DIR_FS_CATALOG_IMAGES.$bild)) {
		// Thumbnail löschen
	    @unlink(DIR_FS_CATALOG_IMAGES."_img_cache/".$bild); 
		// Bild löschen
		@unlink(DIR_FS_CATALOG_IMAGES.$bild);
	}else{
	    break;
	}	
} // for

Damit werden alle Bilder von dem jeweiligen Artikel gelöscht. Hier könnte auch das delete für die Tabelle der Produktbilder bei einer Aktualisierung rein.

Ansonsten konnte ich den allerersten Code von Andreas in der Datei setArtikelBild.php so übernehmen.
Jetzt aber wieder folgendes Problem. Sobald Artikeländerungen, und nicht nur am Bild, vorgenomen werden, werden die Bilder gelöscht. Aber auch dann, wenn ich die Reihenfolge der Bilder nur verändert habe.
Ich brauche ein FLAG!.
Ich denke, Andreas weiss, wovon ich spreche. Also entweder ein Kennzeichen, was dem Connector klar machen kann, dass nur die Reihenfolge geändert wird, dann muss aber das Update der Bilder an einer anderen Stelle erfolgen und es müssen auch die Dateien nach folgendem Muster umbenannt werden. Aus Bild 25_0.jpg wird 25_1.jpg und anders herum.

Oder, die einfachere Methode, die Bilder werden immer gepostet. Sicher, ein Performance-Verlust aber um den zu umgehen, könnte im WAWI im Dialog „Internetabgleich“ ein Haken rein, wo der Nutzer selbst bestimmen kann, ob die Bilder der veränderten Artikel nochmal mit gepostet werden. Ähnlich wie derHaken, alle Artikel nocheinmal senden.

Ich glaube, das ist die beste Lösung, denn alle Nutzer müssten den Connector nicht nochmal umprogrammieren, der im Datail eh fehlerhaft ist, auch ihr von JTL nicht und es ist eine saubere Lösung, wie das aktualisieren der Bilder in den Shops gehen kann.

Ich hoffe, ich habe nicht all zu sehr für Verwirrung gesorgt und wünsche allen einen schönen Abend.

mfg
Thomas
 

Thomas Lisson

Administrator
Mitarbeiter
24. März 2006
15.574
299
Köln
Nabed Thomas,

danke für die ausführliche Darlegung. Ich verstehe das Problem.

Es ist so, dass zusammen mit Shop2 eine neue, weitaus effizientere Kommunikaionsschnittstelle kommt. Da werden auch die Connectoren Zug um Zug umgestellt.

Dabei werden wir auch dieses Problem an der Wurzel packen.