Zum Inhalt springen

userfunction und Übergabe des Funktionswertes an ein TS-Objekt

Erstellt am 13. Januar 2009 · 6 Antworten · letzte Antwort am 13. Januar 2009

Tags: Bilder, Frage

harvey ·

Hallo Typo3-Experten,

will auch mal ein solcher werden 😉

Jetzt hab ich ein Problem, bei dem ich trotz längerer Recherchen im Internet und in diversen Fachbüchern nicht weiterkomme.

Folgendes Szenario: Ich habe eine Bildergalerie mit mehreren Kategorien (Ordnern) mittels chgallery (Dank an Georg Ringer) eingerichtet. Funktioniert wunderbar.

Nun möchte ich aus jedem Ordner der Galerie (z.Zt. 3 Ordner) das neueste Bild auf der Startseite anzeigen und in die richtige Kategorie (sprich den richtigen Ordner) verlinken. Mittels der chgallery ist das wohl nicht möglich, ich habe zumindest keine Lösung gefunden.

Daher bin ich einen anderen Weg gegangen: ein php-Script gibt mit mittels des Pfades auf die entsprechende Kategorie das neueste Bild zurück. Das habe ich mittels TS dann als userfunction eingebaut. Die Daten werden von dem Script auch sauber ausgegeben, also funktioniert die Parameter- und die Ergebnisübergabe richtig.

Was ich aber nicht hinbekomme, ist, den Rückgabewert meiner Funktion als Eingabe für das IMAGE.file Object einzusetzen.

Irgendwo unterläuft mir wohl ein Denkfehler. Hier mal (eine gekürzte Fassung) meines php-Scripts:

<?php

class user_getNewestImage {

  var $cObj;

  function dirList( $directory, $filetypes=array() ) {
    $fname = "";
    $mtime = $mtime_tmp = 0;
    $results = array();
    $dh = opendir($directory);
    while ($file = readdir($dh)) {
      if ((!is_dir($directory."/".$file)) && in_array(substr($file, -4,4), $filetypes)) {
        $results[] = $file;
        $mtime_tmp = filemtime($directory."/".$file);
        if($mtime < $mtime_tmp) {
          $mtime = $mtime_tmp;
          $fname = $file;
        }
      }
    }
    closedir($dh);
    return $fname;
  }

  function main( $content="", $conf=array() ) {

    $filetypes = array(".jpg", ".gif", ".png");

    $relPath = $conf["dir"];
    $absPath = $_SERVER["DOCUMENT_ROOT"].$relPath;
    $content = $relPath."/".$this->dirList($absPath, $filetypes);
    return "<span>".$content."</span>\n";

  }
}

?>

Und hier das dazugehörige TypoScript Snippet:

includeLibs.getNewestImage = fileadmin/getNewestImage.php

temp.imageFile = USER
temp.imageFile {
  userFunc = user_getNewestImage->main
  dir = fileadmin/Galerien/Aktuelles
}

temp.content = COA
temp.content {
   10 = HTML
   10.value = <div id="content"><div class="t"></div> 
   20 < styles.content.get

   21 = TEXT
   21 < temp.imageFile
   21.stdWrap = <div class="imagewrap">|</div>
   
   25 = HTML
   25.value = <div class="tx-chgallery-pi1">
   
   30 = IMAGE
   30 {
     file.cObject < temp.imageFile
     file.width = 120  
     file.height= 90
     wrap = <div class="single"><div class="img"><div class="align"><a href="/bildergalerie/galerie//1.html#c37">|</a></div></div></div>
   } ...

Das 21. Objekt gibt mir das Bild inklusive Pfad sauber aus, der stdWrap wird aber nicht ausgeführt.

Das 30. Objekt wird erst garnicht angezeigt. Da hab ich schon alles mögliche probiert, bin aber leider zu keiner Lösung gekommen.

Ich bin für jeden Tip dankbar, lieber wäre mir eine verständliche Lösung des Problems oder aber die Aussage, dass es so nicht geht und ich einen anderen Weg suchen muss.

Vielen Dank schon mal fürs lesen ...

harvey

meckpo ·

Hallo,

warum so umständlich? Wenn du ohnehin schon in PHP bist lass dir doch gleich das fertige IMAGE zurückliefern:

$img["file"] = $content; // zur berücksichtigen: Was ist wenn da mehere Bilder sind?
$img["file."]["width"] = "120";
$img["file."]["height"] = "90";
return $this->cObj->IMAGE($img);
harvey ·

Hallo meckpo,

Dein Lösungsansatz bringt mich schon ein großes Stück weiter. Danke dafür. Das Bild wird jetzt ausgegeben.

Was aber noch nicht gelöst ist, ist das Problem mit den stdWrap's im 21. und 30. Object, die das div (21. , nur Testausgabe) und den Link auf die Galerie (30.) setzen sollen, so dass ich auf der Startseite immer nur das aktuellste Bild auf die Kategorie verlinken kann.

Die Ausgabe des 21. Objects ist:

<img width="120" height="90" title="" alt="" src="typo3temp/pics/db9a182c9b.jpg"/>

,

das 30. Object erzeugt erst gar keine Ausgabe ?!

meckpo schrieb
$img["file"] = $content; // zur berücksichtigen: Was ist wenn da mehere Bilder sind?
$img["file."]["width"] = "120";
$img["file."]["height"] = "90";
return $this->cObj->IMAGE($img);

Noch ein Hinweis: $content kann nur ein Bild enthalten, da die Funktion dirList das erste aktuellste Bild zurückgibt (mittels timestamp) :p

Trotzdem schon mal super. Danke.

harvey

meckpo ·

Hallo,

ich meinte natürlich: noch weiter abspecken. Also:
temp.imageFile brauchst du gar nicht mehr
und temp.content.30 definieren wir neu:

temp.content.30 = USER
temp.content.30.userFunc = user_getNewestImage->main
temp.content.30.dir = fileadmin/Galerien/Aktuelles

Und im PHP baust du dein HTMLL gleich drum rum:

$img["file"] = $content;$img["file."]["width"] = "120";
$img["file."]["height"] = "90";
$html = $this->cObj->IMAGE($img); 
$html.= '<div class="single"><div class="img"><div class="align"><a href="/bildergalerie/galerie//1.html#c37">'.$hmtl.'</a></div></div></div>';
return $html;
harvey ·

Hallo meckpo,

ok, das hat soweit jetzt schon funktioniert. Ich wollte das zwar eigentlich mittels TS lösen, aber was soll's, wenns nicht geht :p

Nur gibt es jetzt ein anderes Phänomen: das Bild wird zweimal ausgegeben, und zwar einmal als reiner img-Tag und einmal komplett in den wrap eingebettet.

Guckst Du hier:

<div class="tx-chgallery-pi1">
 <img width="120" height="90" title="" alt="" src="typo3temp/pics/db9a182c9b.jpg"/>
 <div class="single">
  <div class="img">
   <div class="align">
    <a href="/bildergalerie/galerie//1.html#c37">
     <img width="120" height="90" title="" alt="" src="typo3temp/pics/db9a182c9b.jpg"/>
    </a>
   </div>
  </div>
 </div>...

Hier die jetzt entstandene php-Funktion:

function main( $content="", $conf=array() ) {
  $filetypes = array(".jpg", ".gif", ".png");

  $relPath = $conf["dir"];
  $target  = $conf["target"];
  $absPath = $_SERVER["DOCUMENT_ROOT"].$relPath; 
  $content = $relPath."/".$this->dirList($absPath, $filetypes);
  $img["file"] = $content; 
  $img["file."]["width"] = "120";
  $img["file."]["height"] = "90";
  $html = $this->cObj->IMAGE($img);
  $html.= '<div class="single"><div class="img"><div class="align"><a href="'.$target.'">'.$html.'</a></div></div></div>';
  return $html;
}

und das TS-Fragment ...

temp.content = COA
temp.content {
   10 = HTML
   10.value = <div id="content"><div class="t"></div> 
   20 < styles.content.get

   25 = HTML
   25.value = <div class="tx-chgallery-pi1">
   
   30 = USER
   30.userFunc = user_getNewestImage->main
   30.dir = fileadmin/Galerien/Aktuelles
   30.target = /bildergalerie/galerie//1.html#c37

Aber trotzdem schon super. Danke bis hierher.

harvey

harvey ·

Da hätt ich aber auch selber drauf kommen müssen, als alter php-Interpreter #angry#

Danke, meckpo, Du hast mir sehr geholfen.

Vielleicht kann ich es ja mal irgendwie zurückgeben (oder schreibt man jetzt 'irgend wie zurück geben'?) #giggle#
Ich werd auf jeden Fall dieses Forum nicht mehr nur passiv nutzen, sondern versuchen, mich, so es denn zeitlich geht, aktiv zu beteiligen.

Grüße aus dem Rheinland,
harvey