contao / core

Contao 3 → see contao/contao for Contao 4
GNU Lesser General Public License v3.0
490 stars 214 forks source link

getImage Hook kann optionalen target-Parameter nicht behandeln #2470

Closed ghost closed 12 years ago

ghost commented 12 years ago

Wenn ein getImage Hook genutzt wird und z.B. Controller::resizeImage die Controller::getImage mit gesetztem target aufruft, dann erhält die Hook-Funktion keine Information über das Target. Somit funktioniert die Controller::resizeImage nicht mehr korrekt.

Basierend auf 62874796cc6487c2c92f835c03ca0972 der controller.php kann die Zeile 796 durch folgendes ersetzt werden:

// Resize the original image
if ($target)
{
  $this->import('Files');
  $this->Files->rename($return, $target);

  return $target;
}
return $return;

Download the attachments

--- Originally created by N.Parker on August 25th, 2010, at 03:30pm (ID 2470)

leofeyer commented 12 years ago

Wie lässt sich das reproduzieren?

--- Originally created on September 4th, 2010, at 12:25am

leofeyer commented 12 years ago

[[WikiIncompleteDe|Unvollständiges Ticket]]

--- Originally created on September 5th, 2010, at 07:33pm

ghost commented 12 years ago

Gut, war wohl noch nicht eindeutig, hier noch mal vollständig:

+Gewünschtes Ziel:+ Eine Erweiterung soll per getImage-Hook die vollständige Kontrolle des resize zu übernehmen.

+Vorbedingung für das Beispiel:+

+Ablauf+ Beim Upload der Grafik wird aufgrund der Größenüberschreitung aus der DC_Folder::move Funktion heraus die Controller::resizeImage aufgerufen. Diese ruft seinerseits die Controller::getImage mit definiertem Parameter $target auf. Aufgrund des erfolgreichen Uploads, des benötigten resize und der fehlenden cache Datei wird jetzt ab Zeile 787 der Hook behandelt. Dieser kann aufgrund der übergebenen Parameter zwar das resize durchführen, weiß aber nicht, dass die Quelldatei (definiert durch $target) überschrieben werden soll. Somit liefert der Hook einen String zurück, der auf die neue (kleinere) cache-Datei verweist.

Dadurch wird in Zeile 796 dieser String zurück gegeben und die Controller::getImage beendet.

Die Quelldatei bleibt unverändert, das gewünschte überschreiben wie ab Zeile 959 definiert wird trotz des gesetzten $target nie erfolgen.

Um auch das Überschreiben der Quelldatei zu ermöglichen, muss entweder der Hook um das $target erweitert werden, was allerdings für bestehende Erweiterungen ein Problem werden könnte, oder das überschreiben des Originals erfolgt in der Controller::getImage.

Das Beispiel oben ist ein Vorschlag für letztere Variante und verträgt sich auch mit bestehenden Erweiterungen.

--- Originally created by N.Parker on September 6th, 2010, at 09:05am

ghost commented 12 years ago

Änderungsvorschlag nochmal als Diff-Datei.

--- Originally created by N.Parker on September 13th, 2010, at 10:20am

ghost commented 12 years ago

Freundlich gemeinte Nachfrage: Ist meine Problembeschreibung jetzt nachvollziehbar, oder fehlt noch was?

Ich frage nur, weil in "[[WikiIncompleteDe|Unvollständiges Ticket]]" steht: Bleibt das Ticket unvollständig, wird es nach einer bestimmten Frist automatisch geschlossen.

--- Originally created by N.Parker on September 26th, 2010, at 11:12am

ghost commented 12 years ago

Warum auch immer, im ersten diff war die Zeile 795 nicht entfernt

So bringt das diff nichts. Neue diff sollt das jetzt richtig dar.

--- Originally created by N.Parker on December 6th, 2010, at 12:03pm

leofeyer commented 12 years ago

Ich habe jedoch noch immer keine Ahnung, wie ich das auf meinem System reproduzieren kann. Ist Deine Callback-Funktion irgendwo verfügbar?

--- Originally created on February 7th, 2011, at 02:45pm

ghost commented 12 years ago

Hm, ich konnte das soeben auch in Revision 594 noch nachstellen. Hier noch mal eine längere Erklärung, die das unterschiedliche Verhalten mit und ohne Hook-Funktion aufzeigen soll.

h2. Vorbedingung:

Voreingestellt ist eine maximale Bildgröße von 200 x 150 px $GLOBALS['TL_CONFIG']['imageWidth'] = 200; $GLOBALS['TL_CONFIG']['imageHeight'] = 150;

Eine Grafik mit Namen BigPicture.jpg in der Größe 1024 * 768 px soll in das Verzeichnis tl_files hoch geladen werden.

h2. Ohne Hook Funktion

Wenn kein getImageHook definiert ist, dann wird nach dem Upload der Grafik folgendes ausgeführt: Die Controller::getImage wird mit folgenden Parametern aufgerufen:

Bis Zeile 784 wird geprüft ob ein resize erfolgen soll. In Zeile 787 wird erkannt dass kein getImageHook definiert ist. In den Zeilen 802 – 956 erfolgt das resize In Zeile 959 wird erkannt, dass ein $target gesetzt ist. und anschließend die Datei "tl_files/BigPicture.JPG" durch die „kleinere“ Datei ersetzt.

h2. Mit Hook Funktion

Ist ein getImageHook definiert, wird stattdessen folgendes ausgeführt: Die Controller::getImage wird ebenfalls mit folgenden Parametern aufgerufen:

Bis Zeile 784 wird geprüft ob ein resize erfolgen soll. In Zeile 787 wird erkannt dass ein getImageHook definiert ist und dieser Ausgeführt. Die beigefügte getImageHook Funktion macht nichts anderes als das Original, speichert die „kleinere“ Datei jedoch im Verzeichnis „system/html2/“ statt in „system/html/“.

Da die getImageHook einen gültigen Dateipfad zurück liefert, wird die Controller::getImage in Zeile 796 beendet.

Die Original-Datei "tl_files/BigPicture.JPG" liegt noch immer in der Größe 1024 * 768 px im Ordner.

Die getImageHook Funktion kann das Ersetzen der Original-Datei nicht übernehmen, da sie den Parameter $target der Controller::getImage nicht erhält (von irgendwelchen Spielchen mit Debug-Funktionen mal abgesehen, die hierfür jedoch nicht genutzt werden sollten). Deshalb sind in der beigefügten getImageHook-Funktion die Zeilen 169-175 auskommentiert.

Wird in der Controller::getImage vor dem Return in Zeile 796 geprüft, ob ein Ersetzen der Original-Datei gewünscht ist ($target != null) kann auch die Orignal-Datei ersetzt werden. Der 2. Patch fügt dieses Verhalten ein. Diese Variante bedeutet keine Veränderung an der Schnittstelle für den getImage Hook.

Das Problem liegt nicht in der Änderung der Größe einer Grafik oder im Cachen, sondern nur im Ersetzen der neu hoch geladenen Datei im tl_files-Ordner durch eine größenkorrigierte Version.

--- Originally created by N.Parker on February 9th, 2011, at 08:40pm

ghost commented 12 years ago

Reicht die Beschreibung, oder soll ich hier noch etwas ergänzen?

--- Originally created by N.Parker on March 25th, 2011, at 02:14pm

leofeyer commented 12 years ago

Behoben in ca683f201ec71084a894e38e2f6992a9.

--- Originally created on June 23rd, 2011, at 12:34pm

leofeyer commented 12 years ago

--- Originally completed on June 23rd, 2011, at 12:34pm