Eine ziemlich unpraktische Eigenschaft von xt:Commerce ist es, sich eigene Dateinamen für Artikel- und Kategorienbilder “auszudenken”. Diese werden einfach fortlaufend (mit der Produkt- bzw. Kategorien-ID) numeriert. Das nimmt einem erstens die Möglichkeit, seine Bilder passend zur Artikelnummer zu benennen und zweitens heißen auch “korrigierte” Bilder genauso wie das Bild davor.

Sicherlich vermeidet man auf diese Weise “doppelte Dateinamen”, Probleme mit Umlauten, zu langen Namen und so weiter. Aber wenn man einmal aus Versehen ein falsches Bild hochgeladen hat, wird das richtige erst nach einmal “F5″ bzw. nach Leeren des Browser-Cache angezeigt. Im Grunde genommen müsste über jedem xt:Commerce-Shop ein Hinweis stehen: “Bitte leeren Sie Ihren Browser-Cache, damit Sie auch wirklich die richtigen Artikelbilder sehen” …

:-)

Datt wollen wa nich, also wieder mal ein bisschen basteln.
Oder gleich » herunterladen …

 

Vorüberlegungen

Um Probleme bei mehrfach gleichen Dateinamen zu vermeiden, kann man die Idee mit der “Produkt-ID” insoweit übernehmen, dass die ID als “Präfix” nach vorn gesetzt wird.

Außerdem müssen eventuell im Dateinamen enthaltene Umlaute und Sonderzeichen korrigiert werden. Punkte, die nichts mit der “Extension” zu tun haben (also “.jpg”, “.gif” oder ähnliches) kann man eigentlich gleich ganz löschen. Leerzeichen und andere Sonderzeichen der Einfachheit halber allesamt in Unterstriche wandeln.

Oder anders formuliert: Die normale Benennung mit den “ID-Nummern” sollte bestehen bleiben, eine eindeutige Bezeichnung ist außerdem wichtig, falls Artikel oder Kategorien dupliziert werden - zusätzlich wird der eigentliche Dateiname noch mit angehängt.

 

Änderungen

Verantwortlich für die Namensvergabe beim Upload von Bildern (auch für Produkte) ist die Datei “categories.php” - gut versteckt im Ordner “admin/includes/classes”. Gucken wir uns erst einmal an, was dort passiert …

Beispiel Upload von Kategorien-Bildern, bei xt:Commerce 3.04 SP2.1 sind die Zeilen 195 bis 204 interessant:


if ($categories_image = & xtc_try_upload('categories_image', DIR_FS_CATALOG_IMAGES.'categories/')) {
	$cname_arr = explode('.', $categories_image->filename);
	$cnsuffix = array_pop($cname_arr);
	$categories_image_name = $categories_id.'.'.$cnsuffix;
	@ unlink(DIR_FS_CATALOG_IMAGES.'categories/'.$categories_image_name);
	rename(DIR_FS_CATALOG_IMAGES.'categories/'.$categories_image->filename, DIR_FS_CATALOG_IMAGES.'categories/'.$categories_image_name);
	xtc_db_query("UPDATE ".TABLE_CATEGORIES."
					SET categories_image = '".xtc_db_input($categories_image_name)."'
					WHERE categories_id = '".(int) $categories_id."'");
}
	

  1. Zuerst wird der Original-Dateiname in ein Array $cname_arr zerteilt, als “Trennzeichen” dient der Punkt
  2. Dann wird der letzte “Key” des Arrays abgefragt und in $cnsuffix als Dateityp festgelegt
  3. Zu guter Letzt wird der neue $categories_image_name aus der Kategorien-ID, einem Punkt (der wird bei “explode” nicht mit übernommen) und dem “Suffix” zusammengesetzt
  4. Abschließend werden die nötigen Speicher-Aktionen ausgeführt und der Dateiname in der Datenbank hinterlegt

Putzig bei den Category Images ist, dass beim Hochladen eines neuen Bildes nicht etwa das alte gelöscht wird, sondern ein Bild, das so heißt, wie ein neu hochgeladenes Kategorien-Bild heißen würde.

Normalerweise macht das nichts, aber das alte Kategorien-Bild muss nicht zwangsläufig so heißen, wie xt:Commerce es gerne hätte. Denn der Shop kann durchaus auch mit anderen Dateinamen arbeiten. Die Namen werden lediglich beim Upload über den Admin-Bereich geändert. Bei Übernahme von Datenbeständen aus anderen Shopsystemen würden auf die Weise die alten Bilder allesamt auf dem Server bleiben.

Nicht wirklich schlimm, und die Anzahl der Fälle, in denen dadurch zufällig Bilder anderer Kategorie überschrieben werden, geht vermutlich gegen Null - aber muss trotzdem nicht sein. Es gibt also ein paar Sachen zu tun …

 

Lösungs-Vorschlag

Da dieser kleine Fehler mit den “manchmal nicht gelöschten” alten Bildern nur bei den Category Images auftritt, fangen wir am besten auch gleich mit den Kategorien an.


Schritt 1)

Das Aufteilen des Dateinamens in einzelne Array-Keys von $cname_arr ist gar nicht schlecht, damit ist die “Endung” vom Rest des Namens abgetrennt - und die Punkte sind entfernt.

Der neue Dateiname wird ursprünglich so zusammengesetzt …

$categories_image_name = $categories_id.'.'.$cnsuffix;

… wodurch der alte Name verloren geht. Aber der steckt ja noch in den ersten “Teilen” von $cname_arr drin. Diese Teilstücke müssen also wieder zusammengefügt werden, und bei der Gelegenheit können wir “unseren” neuen Namen auch gleich von Sonderzeichen säubern. Außerdem (persönliche Vorliebe von mir) mag ich “Extensionen” lieber in Kleinbuchstaben haben …

$categories_image_name = $categories_id.'_'.unArrayCleanImgName($cname_arr).'.'.strtolower($cnsuffix);

Die Funktion unArrayCleanImgName(); fehlt noch - die schreiben wir später, denn auch die anderen Upload-Funktionen werden darauf zugreifen.


Schritt 2)

Damit alte Kategorien-Bilder nicht auf dem Server liegen bleiben, muss diese Zeile bearbeitet werden …

@ unlink(DIR_FS_CATALOG_IMAGES.'categories/'.$categories_image_name);

… denn der Vorgang war (auch vor unserer Änderung) schon fehlerträchtig - $categories_image_name ist ein à la xt:Commerce bearbeiteter Name - und nicht der Dateiname, unter dem das alte Bild (sofern vorhanden) abgespeichert gewesen ist. Also stattdessen Folgendes eintragen:

@ unlink(DIR_FS_CATALOG_IMAGES.'categories/'.$categories_data['categories_previous_image']);


Schritt 3)

Nun die “Zusammenbau-” und “Säuberungs-Funktion” - damit diese auch für die anderen Uploads zur Verfügung steht, schreiben wir sie vor der Definition der Klasse “categories” - Kann also direkt an den Anfang der Datei “categories.php” gesetzt werden.


function unArrayCleanImgName($Input) {
	$Count = 0;
	while ( $Count < count($Input) ) {
		$Name .= cleanImgName($Input[$Count]);
		$Count++;
	}
	return $Name;
}
	

… und hier mein Vorschlag zum “Säubern” der Dateinamen:


function cleanImgName($Name){
	$Name = htmlentities($Name, ENT_QUOTES);
	$Name = preg_replace("/(&([AaOoUu])[^;]*;)/",'$2e',$Name);
	$Name = preg_replace("/(&([Ss])[^;]*;)/",'$2$2',$Name);
	$Name = preg_replace("/(&([CcIiZzEeNn])[^;]*;)/",'$2',$Name);
	$Name = preg_replace("/(&[^;]*;)/",'',$Name);
	return preg_replace("/([^0-9a-zA-Z])/",'_',$Name);
}
	

Die letzte Funktion wandelt Umlaute in “ae”, “oe” und “ß” in “ss” um - Aus Sonderzeichen wie “ç” oder “ñ” werden die einfachen Buchstaben “c” bzw. “n”. Danach wird komplett alles, was kein Buchstabe oder keine Zahl ist, zu einem Unterstrich.

Das alles ist als Anregung zu verstehen - und es muss nicht jedem gefallen, dass ein Name wie z.B. “McCréme’s.JPG” in “0815_McCreme_s.JPG” umgewandelt werden würde. Also einfach nach Belieben verändern …


Schritt 4)

Upload von Artikelbildern - Dazu suchen wir (in der unbearbeiteten Original-Datei war’s etwa bei Zeile 500) folgenden Bereich:


//prepare products_image filename
if ($products_image = xtc_try_upload('products_image', DIR_FS_CATALOG_ORIGINAL_IMAGES, '777', '')) {
	$pname_arr = explode('.', $products_image->filename);
	$nsuffix = array_pop($pname_arr);
	$products_image_name = $products_id.'_0.'.$nsuffix;
	

Und auch bei den Artikelbildern können wir beinahe so vorgehen wie bei den Kategorien. Aus der letzten Zeile machen wir einfach …

$products_image_name = $products_id.'_0_'.unArrayCleanImgName($pname_arr).'.'.strtolower($nsuffix);

… und hätten damit auch für Produkt-Abbildungen selbstgewählte Dateinamen ermöglicht.


Schritt 5)

Den Upload “zusätzlicher Produktbilder” von xt:Commerce finden wir einige Zeilen später - einfach nach //MO_PICS suchen, und etwas weiter unten steht folgende Anweisung:

$products_image_name = $products_id.'_'. ($img +1).'.'.$nsuffix;

Diese ändern wir um - fertig:

$products_image_name = $products_id.'_'.($img +1).'_'.unArrayCleanImgName($pname_arr).'.'.strtolower($nsuffix);

Und da es ein wenig umständlich ist, alle Änderungen “abzutippen”, gibt’s das Ganze auch zum Downloaden.

 

Download und weitere Infos

Kurzbeschreibung: Geänderte Systemdatei für xt:Commerce - Ermöglicht den Upload von Produkt- und Kategorienbildern ohne dass der ursprüngliche Dateiname dabei verloren geht. Sonderzeichen werden jedoch umgewandelt und dem neuen Namen wird die übliche Kennzeichnung mit einer “ID-Nummer” vorangestellt.

Download-Link: » xtc_keep_image_names_v1.zip

  1. Sicherheitskopie von der Datei “categories.php” anfertigen - und zwar die “categories.php” aus dem Ordner “admin/includes/classes” - Ein bisschen aufpassen, denn in xt:Commerce gibt es mehrere Dateien, die “categories.php” heißen!
  2. Zip-Archiv runterladen, entpacken und die enthaltene Datei “categories.php” in oben genannten Ordner überspielen
  3. … und bitte (wie immer) nicht gleich auf einem live-System ausprobieren
  4. Getestet mit xt:Commerce 3.04, SP2.1, ShopStat nicht installiert
    Sollte aber auch mit anderen Konfigurationen keine apokalyptischen Katastrophen auslösen
  5. Alle Änderungen sind im Code mit //GUNNART gekennzeichnet und somit bei Problemen oder für weitere Bearbeitungen leicht aufzufinden


Hinweis - “Kopierfunktion”

Nach Einbau der geänderten Datei denkt sich xt:Commerce weiterhin eigene Namen für Abbildungen aus, wenn Kategorien oder Artikel kopiert werden.

Das kann man natürlich ebenfalls ändern, der Aufwand wäre aber (wenn man sauber arbeiten will) schon deutlich höher - denn immerhin muss man dabei beachten, dass auch Bildnamen wie “1995_Classics.jpg” möglich sind. Beim Kopieren muss unterschieden werden, ob die “1995″ wirklich Teil des Bildnamens ist oder durch die ID erzeugt wurde …

Nichts woran man verzweifeln muss, aber auch kein dringendes “ToDo”. Denn für mich sind die “ausgedachten” Namen zumindest beim Kopieren völlig in Ordnung: Meistens kopiert man Artikel oder Kategorien ja nur, um sich ein bisschen Getippe und Geklicke zu sparen - Die Bilder werden danach im Regelfall ohnehin erneuert.