Hi,
kann ich die rex_resize auch in einer Aktion ausführen lassen?
Wenn ja, wie? Wäre nett wenn mir kurz einer helfen könnte. Danke.
grz. Chris
Hallo,
Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.
Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.
Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Klar!darwin hat geschrieben:idee?
Eine Möglichkeit findest du im Thread http://forum.redaxo.de/ftopic12501.html. Dort musst du einfach die rex_resize-URLs entsprechend triggern.
Die zweite Möglichkeit, der ich den Vorzug geben würde, ruft das rex_resize-Event direkt auf:
Code: Alles auswählen
// $string enthält Angaben zum Resize, wie man
// sie vom URL-Aufruf von rex_resize kennt
// z. B.:
$string = '200w__filename.jpg';
rex_thumbnail::createFromUrl($string);
Edit: Kommando zurück! Methode 2 funktioniert nicht. Moment bitte.
Edit 2: OK, Methode 2 funktioniert ohne weiteres nicht. Es wäre sicher möglich die Klasse rex_thumbnail zu nutzen oder zumindest den Code daraus. Allerdings ist die erste Variante wesentlich schneller zu realisieren. Hat halt den Nachteil, dass sie Javascript benötigt.
Viel Spaß beim basteln. =)
hmm.. ok...
nur so funkts nicht wirklich:
(Aktion: PreSave Action (Add/Edit)) >> Redaxo 4.1
noch ne idee?
Danke. grz. Chris
nur so funkts nicht wirklich:
(Aktion: PreSave Action (Add/Edit)) >> Redaxo 4.1
Code: Alles auswählen
´// MediaList durchlaufen und Ausgabe generieren
foreach ((explode (",", $REX_ACTION["MEDIALIST"][1])) as $image_entry) {
$file = OOMedia::getMediaByName($image_entry);
$image = $file->getFileName();
$thumb = $picSize.'a__'.$image;
rex_thumbnail::createFromUrl($thumb);
$res_thumb = $resizePath . $resizePref . $picSize.'a__'.$image;
if (file_exists($res_thumb)){
$size = getimagesize($res_thumb);
$w = $size[0];
$h = $size[1];
$xmlOut .= ' <slide rotate="">' .$nl;
$xmlOut .= ' <title></title>' .$nl;
$xmlOut .= ' <image>'.$tSrc.$picSize.'a__'.$image.'&rex_filter[]=sharpen</image>' . $nl;
$xmlOut .= ' <thumb width="'.$w.'" height="'.$h.'">'.$res_thumb.'</thumb>' . $nl;
$xmlOut .= ' </slide>' .$nl;
}
}
Danke. grz. Chris
Ich habe einfach mal den Funktionscode von createFromURL() übernommen:darwin hat geschrieben:noch ne idee?
Code: Alles auswählen
<?php
function getSize($rex_resize)
{
global $REX;
// get params
preg_match('@([0-9]+)([awhc])__(([0-9]+)h__)?((\-?[0-9]+)o__)?(.*)@', $rex_resize, $resize);
$size = $resize[1];
$mode = $resize[2];
$height = $resize[4];
$offset = $resize[6];
$imagefile = $resize[7];
$rex_filter = rex_get('rex_filter', 'array');
if (count($rex_filter)>$REX['ADDON']['image_resize']['max_filters']) $rex_filter = array();
$filters = '';
foreach($rex_filter as $filter)
$filters .= $filter;
if($filters != '')
$filters = md5($filters);
$cachepath = $REX['INCLUDE_PATH'].'/generated/files/image_resize__'.$filters.$rex_resize;
$imagepath = $REX['HTDOCS_PATH'].'files/'.$imagefile;
// ----- check for cache file
if (file_exists($cachepath))
{
// time of cache
$cachetime = filectime($cachepath);
// file exists?
if (file_exists($imagepath))
{
$filetime = filectime($imagepath);
}
else
{
// image file not exists
print 'Error: Imagefile does not exist - '. $imagefile;
exit;
}
// cache is newer? - show cache
if ($cachetime > $filetime)
{
$thumb = new rex_thumbnail($cachepath);
//$thumb->send($cachepath, $cachetime);
//exit;
}
}
// ----- check params
if (!file_exists($imagepath))
{
print 'Error: Imagefile does not exist - '. $imagefile;
exit;
}
// ----- check filesize
$max_file_size = $REX['ADDON']['image_resize']['max_resizekb']*1024;
if (filesize($imagepath)>$max_file_size)
{
print 'Error: Imagefile is to big. Only files < '.$REX['ADDON']['image_resize']['max_resizekb'].'kb are allowed. - '. $imagefile;
exit;
}
// ----- check mode
if (($mode != 'w') && ($mode != 'h') && ($mode != 'a') && ($mode != 'c'))
{
print 'Error wrong mode - only h,w,a,c';
exit;
}
if ($size == '')
{
print 'Error size is no INTEGER';
exit;
}
if ($size > $REX['ADDON']['image_resize']['max_resizepixel'] || $height > $REX['ADDON']['image_resize']['max_resizepixel'])
{
print 'Error size to big: max '.$REX['ADDON']['image_resize']['max_resizepixel'].' px';
exit;
}
// ----- start thumb class
$thumb = new rex_thumbnail($imagepath);
$thumb->img_filename = $imagefile;
$thumb->img_cachepath = $REX['INCLUDE_PATH'].'/generated/files/';
// check method
if ($mode == 'w')
{
$thumb->size_width($size);
}
if ($mode == 'h')
{
$thumb->size_height($size);
}
if ($mode == 'c')
{
$thumb->size_crop($size, $height, $offset);
}elseif ($height != '')
{
$thumb->size_height($height);
}
if ($mode == 'a')
{
$thumb->size_auto($size);
}
// Add Default Filters
$rex_filter = array_merge($rex_filter,$REX['ADDON']['image_resize']['default_filters']);
// Add Filters
foreach($rex_filter as $filter)
{
$thumb->addFilter($filter);
}
// save cache
$thumb->generateImage($cachepath,false);
return array($thumb->img['width_thumb'],$thumb->img['height_thumb']);
}
$size = getSize('101w__foto01_fass.jpg');
?>
So wie ich das sehe brauchst Du doch nur die Dimensionen des verkleinerten Bilds.
Das sollte, ohne das ich das jetzt wirklich getestet hätte, so gehen:
Das sollte, ohne das ich das jetzt wirklich getestet hätte, so gehen:
Code: Alles auswählen
$file = OOMedia::getMediaByName($image_entry);
$image = $file->getFilename();
$thumb = new rex_thumbnail($file->getFullPath());
$thumb->size_auto($picSize);
$image_w = $thumb->getImageWidth();
$image_h = $thumb->getImageHeight();
// fieser direkt Zugriff.)
$thumb_w = $thumb->img['width_thumb'];
$thumb_h = $thumb->img['height_thumb'];
// Verhalten in resampleImage
if($thumb_w > $image_w && $thumb_h > $image_h)
{
$thumb_w = $image_w;
$thumb_h = $image_h;
}
unset($thumb);
about: Enterprise Development
...erstmal danke an euch...
Jetzt nochmal zum verständnis für mich.
@zebeah ...
Zuerst werden die Bilder per image resize verkleinert,
Anschließend wird die breite und Höhe der resize images
Ausgelesen und in ein Array gepackt. Jetzt müsst ich
Nur noch die xml mit dem include Pfad der resized images
+ höhe&breite aus dem array Füttern und erstellen/schreiben... Richtig?
Gruß chris
Jetzt nochmal zum verständnis für mich.
@zebeah ...
Zuerst werden die Bilder per image resize verkleinert,
Anschließend wird die breite und Höhe der resize images
Ausgelesen und in ein Array gepackt. Jetzt müsst ich
Nur noch die xml mit dem include Pfad der resized images
+ höhe&breite aus dem array Füttern und erstellen/schreiben... Richtig?
Gruß chris
Also...der Code den ich gepostet habe erzeugt kein verkleinertes Bild, weder im Speicher noch im Dateisystem.
Der sollte nur die Dimension des verkleinerten Bilds berechnen.
Für eine Ausgabe mittels Flash sollte es ja ausreichen wenn das verkleinerte Bild beim Aufruf durch Flash vom resize-Addon wie üblich erstellt wird.
Ich gehe davon aus das mit <image> das Bild in der vollen Grösse, und mit <thumb>
das Vorschau/Verkleinerte Bild definiert wird.
In diesem Fall gibts Du bei <image> (unterstützt das keine Breiten/Höhen-Angaben?) die
relative URL zur Bilddatei im Medienpool-Ordner (i.d.R files) an.
Für <thumb> die übliche relative resize-URL.
Beispiel:
Der sollte nur die Dimension des verkleinerten Bilds berechnen.
Für eine Ausgabe mittels Flash sollte es ja ausreichen wenn das verkleinerte Bild beim Aufruf durch Flash vom resize-Addon wie üblich erstellt wird.
Ich gehe davon aus das mit <image> das Bild in der vollen Grösse, und mit <thumb>
das Vorschau/Verkleinerte Bild definiert wird.
In diesem Fall gibts Du bei <image> (unterstützt das keine Breiten/Höhen-Angaben?) die
relative URL zur Bilddatei im Medienpool-Ordner (i.d.R files) an.
Für <thumb> die übliche relative resize-URL.
Beispiel:
Code: Alles auswählen
$mediaFolder = 'files';
$resize = 'index.php?rex_resize';
$filter = 'rex_filter[]=sharpen';
foreach ((explode (",", $REX_ACTION["MEDIALIST"][1])) as $mediaListItem)
{
$media = OOMedia::getMediaByName($mediaListItem);
if (NULL === $media)
{
continue; // das war nix
}
$mediaName = $media->getFilename();
$thumb = new rex_thumbnail($media->getFullPath());
$thumb->size_auto($picSize); // thumb-Grösse berechnen
$media_w = $thumb->getImageWidth();
$media_h = $thumb->getImageHeight();
// immmer noch fieser direkter Zugriff.)
$thumb_w = $thumb->img['width_thumb'];
$thumb_h = $thumb->img['height_thumb'];
// Verhalten wie in resampleImage (keine Vergrösserung!)
if($thumb_w > $media_w && $thumb_h > $media_h)
{
$thumb_w = $media_w;
$thumb_h = $media_h;
}
// zwischendurch mal ein wenig aufräumen...
$thumb->destroyImage();
// Nur Image und Thumb, Rest selbst einfügen
$xmlOut .= sprintf('<image width="%d" height="%d">%s/%s</image>',
$media_w,
$media_h,
$mediaFolder,
$mediaName
);
$xmlOut .= sprintf('<thumb width="%d" height="%d">%s=%da__%s&%s</thumb>',
$thumb_w,
$thumb_h,
$resize,
$picSize,
$mediaName,
$filter
);
}
about: Enterprise Development
joa...
ich habs jetzt (nicht ganz so sauber) mal so gelöst,
wobei mir dein Ansatz (@zebaeh) besser gefällt ..
Sobald die Bilder in FlashDatei aufegerufen wird, startet
auch das resizing ... Jep, besser ist es wenn das Resizing schon
beim bearbeiten/speichern des Moduls startet um somit die
Ladezeit zu verkürzen...
Danke. grz. Chris
ich habs jetzt (nicht ganz so sauber) mal so gelöst,
wobei mir dein Ansatz (@zebaeh) besser gefällt ..
Code: Alles auswählen
<?php
$artId = $REX_ACTION['ARTICLE_ID'];
$cTypeId = $REX_ACTION['CTYPE_ID'];
$cLangId = $REX_ACTION['CLANG_ID'];
// Pfade der Bilder/Thumbs
$imgPath = ''; $tmbPath = ''; $xmlOut = '';
// XML Datei
$xmlPath = $REX['HTDOCS_PATH']."files/xml/album_xml/";
$xmlName = "flashalb";
$xmlFile = $xmlPath.$xmlName.'_a'.$artId.'_col'.$cTypeId.'_lang'.$cLangId.'.xml';
// Target Source
$tSrc = 'http://'.$_SERVER['SERVER_NAME'].'/index.php?rex_resize=';
// Bildgroesse/Slidergroesse
$picSize = 1024;
$thmbSize = 65;
// Zeilenumbruch im XML-Code
$nl = "\n";
// XML Datei oeffnen / Schreibrecht
$fp = fopen($xmlFile, 'w+');
$xmlOut = '<album>' . $nl;
$xmlOut .= ' <title></title>' .$nl;
// MediaList durchlaufen und Ausgabe generieren
foreach ((explode (",", $REX_ACTION["MEDIALIST"][1])) as $image_entry) {
$file = OOMedia::getMediaByName($image_entry);
$image = $file->getFilename();
$thumb = new rex_thumbnail($file->getFullPath());
$thumb->size_height($thmbSize);
$image_w = $thumb->getImageWidth();
$image_h = $thumb->getImageHeight();
// fieser direkt Zugriff ...
$thumb_w = $thumb->img['width_thumb'];
$thumb_h = $thumb->img['height_thumb'];
// Verhalten in resampleImage
if($thumb_w > $image_w && $thumb_h > $image_h) {
$thumb_w = $image_w;
$thumb_h = $image_h;
}
unset($thumb);
$xmlOut .= ' <slide rotate="">' .$nl;
$xmlOut .= ' <title></title>' .$nl;
$xmlOut .= ' <image>'.$tSrc.$picSize.'a__'.$image_entry.'&rex_filter[]=sharpen</image>' . $nl;
$xmlOut .= ' <thumb width="'.$thumb_w.'" height="'.$thumb_h.'">'.$tSrc.$thmbSize.'h__'.$image_entry.'&rex_filter[]=sharpen</thumb>' . $nl;
$xmlOut .= ' </slide>' .$nl;
}
$xmlOut .= '</album>' .$nl;
// XML fuellen und schreiben
fwrite($fp, $xmlOut);
fclose($fp);
// fertisch
?>
auch das resizing ... Jep, besser ist es wenn das Resizing schon
beim bearbeiten/speichern des Moduls startet um somit die
Ladezeit zu verkürzen...
Danke. grz. Chris
Nebenfrage...
wie könnte dies mit einem ExtensionPoint (EP) in
der Redaxo 4.1 aussehen? Und macht es mehr Sinn einene EP
anzulegen oder es doch per Aktion an das Modul zu hängen.
oder
Braucht man überhaupt die Aktion am Modul oder sollte/kann man
dies auch besser gelich in die Ausgabe vom Modul packen?
Warum? --> xml-Datei generieren... Was wäre hier die Beste? Schnellste? Sauberste Lösung? ...
oder doch ein komplettes Addon mit allem SchnickSchnack drin ...
Danke. grz. Chris
wie könnte dies mit einem ExtensionPoint (EP) in
der Redaxo 4.1 aussehen? Und macht es mehr Sinn einene EP
anzulegen oder es doch per Aktion an das Modul zu hängen.
oder
Braucht man überhaupt die Aktion am Modul oder sollte/kann man
dies auch besser gelich in die Ausgabe vom Modul packen?
Warum? --> xml-Datei generieren... Was wäre hier die Beste? Schnellste? Sauberste Lösung? ...
oder doch ein komplettes Addon mit allem SchnickSchnack drin ...
Danke. grz. Chris
Naja...der der das Modul einfügt wird ja wohl zur Kontrolle sich das ganze min. einmal ansehen, folgende Aufrufe benutzen dann eh die gecachten Dateien.
about: Enterprise Development
jein...
wenn jetzt z.B. keine MediaList genutzt wird (mehrfach Bildauswahl)
sondern eine komplette MediaKat (ID über Selectbox)
>> dann könnt es Probleme mit der XML geben, da der User
ja im medienpool die Bilder hinzufügt, entfernt oder ändert...
in diesem Fall müsste er dann immer nachträglich
das Modul öffnen um auch die XML zu aktualisieren ... hmmm
grz. Chris
wenn jetzt z.B. keine MediaList genutzt wird (mehrfach Bildauswahl)
sondern eine komplette MediaKat (ID über Selectbox)
>> dann könnt es Probleme mit der XML geben, da der User
ja im medienpool die Bilder hinzufügt, entfernt oder ändert...
in diesem Fall müsste er dann immer nachträglich
das Modul öffnen um auch die XML zu aktualisieren ... hmmm
grz. Chris