[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
rex_resize in Aktion ausführen - REDAXO Forum
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/
Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

rex_resize in Aktion ausführen

11. Sep 2009, 14:51

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

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

11. Sep 2009, 14:53

rex_resize ist doch einfach nur ein URL-Aufruf.

Was genau hast du vor?
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

11. Sep 2009, 14:55

Hi,

den resize per Akktion zu starten, anschl. per getimagesize + INCLUDE_PATH
die width/height der generierten imagefiles auslesen und das ganze dann
als .xml ausgeben...

idee?

Danke . grz. Chris

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

11. Sep 2009, 15:09

darwin hat geschrieben:idee?
Klar! 8)

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);
Ich hoffe, das hilft dir weiter.

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. =)
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

11. Sep 2009, 15:20

hmm.. ok...
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;
	
	}
}

noch ne idee?

Danke. grz. Chris

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

11. Sep 2009, 16:16

darwin hat geschrieben:noch ne idee?
Ich habe einfach mal den Funktionscode von createFromURL() übernommen:

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');
?>
$size ist ein Array. An Index 0 steht die Breite, an Index 1 die Höhe des generierten Thumbnails.
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

zehbaeh
Beiträge: 556
Registriert: 17. Okt 2006, 11:52
Wohnort: Solingen

11. Sep 2009, 18:50

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:

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);

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

12. Sep 2009, 00:44

...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

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

12. Sep 2009, 02:07

Wofür brauchst du diese XML-Datei eigentlich?
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

12. Sep 2009, 11:02

... Damit wird eine Flash Galerie gefüttert. Würde es gerne
Anders umsetzen. Jedoch hab hier lediglich die .swf zur
Verfügung die per xml gefüttert wird ...

Gruß chris

zehbaeh
Beiträge: 556
Registriert: 17. Okt 2006, 11:52
Wohnort: Solingen

12. Sep 2009, 14:59

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:

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
    );
}

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

12. Sep 2009, 15:14

joa...
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

?>
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

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

12. Sep 2009, 15:20

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

zehbaeh
Beiträge: 556
Registriert: 17. Okt 2006, 11:52
Wohnort: Solingen

12. Sep 2009, 15:24

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.

Benutzeravatar
darwin
Beiträge: 1725
Registriert: 2. Jan 2007, 17:10
Wohnort: LA

12. Sep 2009, 15:30

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

Zurück zu „Allgemeines [R4]“