Problem bei Ausgabe von Bildern

Jan-Frederik Stieler

Monsterator
Moderator
Hi,
ich steh irgendwie aufm Schlauch.
Das folgende Script funktioniert nicht und ich steige nicht durch warum mir kein Bild ausgegeben wird.
PHP:
	<?php
	$path = 'images/stuecke/'. $this->item->alias .'/'; 	
	$dir = opendir($path);   
	$filenames_thumb = glob("*_thumb.*");
	$filenames_big = glob("*_gross.*");
	
	while(($file = readdir($dir)) !==false ) {
		foreach ($filenames_thumb as $filename_thumb) {
			echo '<a class="grouped_elements" rel="group1" href="'. $path . $filename_thumb . '">';
			foreach ($filenames_big as $filename_big) {
				echo '<img alt="' . $filename_big . '" src="'. $path . $filename_big . '"></a>'; 
			}
		}
	}
	
	closedir($dir); 
	?>

Kann sich das mal bitte jemand anschauen und seinen Senf dazu geben?

Grüße
 
Probier' mal folgendes:
PHP:
<?php
  $path   = realpath( $this->item->alias . "/" );
  $errors = array();
  
  if ( $path === false ) {
    $errors[] = "Verzeichnis nicht gefunden";
  }
  
  $thumbnails = glob( "*_thumb.*" );
  $originals  = glob( "*_gross.*" );
  
  
  
  if ( count( $thumbnails ) !== count( $originals ) || count( $thumbnails ) === 0 ) {
    $errors[] = "Verzeichnis enthält keine gleiche Anzahl an Bildern und zugehörigen Vorschaubildern";
  }
  
  sort( $thumbnails );
  sort( $originals );
  $pictures = array();
  
  foreach ( $thumbnails as $i => $thumbnail ) {
    $original = $originals[ $i ];
    $pictures[] = array(
      $thumbnail,
      $original
    );
  }
?>

<?php foreach ( $pictures as $picture ): ?>
<a class="grouped_elements" rel="group" href="<?= $path . $picture[ 0 ] ?>">
  <img alt="Bild in Originalgröße" src="<?= $path . $picture[ 1 ] ?>" />
</a>
<?php endforeach; ?>
 
Alxy hat mich noch einmal an etwas erinnert, worauf ich eigentlich selber drauf kommen hätte sollen: mit Iteratoren geht das Ganze viel eleganter!
PHP:
<?php
  class PictureFilterIterator extends FilterIterator {
    private $pattern;
    
    public function __construct( $iterator, $pattern ) {
      parent::__construct( $iterator );
      $this->pattern = $pattern;
    }
    
    public function accept() {
      $item = parent::current();
      
      if ( !$item->isFile() || $item->isDot() ) {
        return false;
      }
      
      $name = $item->getFilename();
      
      return ( preg_match( $this->pattern, $name ) !== false );
    }
    
    public function current() {
      return parent::current()->getFilename();
    }
  }

  $path       = $this->item->alias . "/";
  $directory  = new DirectoryIterator( $path );
  $thumbnails = new PictureFilterIterator( $directory, "/_thumb\./" );
  $originals  = new PictureFilterIterator( $directory, "/_gross\./" );
  $pictures   = new MultipleIterator( MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_ASSOC );
  $pictures->attachIterator( $thumbnails, "thumbnail" );
  $pictures->attachIterator( $originals,  "original"  );
?>

<?php foreach ( $pictures as $tuple ): ?>
<a class="grouped_elements" rel="group" href="<?= $path . $tuple[ "thumbnail" ] ?>">
  <img alt="Bild in Originalgröße" src="<?= $path . $tuple[ "original" ] ?>" />
</a>
<?php endforeach; ?>
 
Hi,
vielen Dank erstmal für die Scripte.

An SPL hatte ich auch gedacht aber da ich mit Iteratoren noch etwas Probleme habe, habe ich das erstmal gelassen :).

Trotz den tollen Scripten die Frage warum die einfache Variante von mir nicht funktioniert.
Mit glob erstelle ich doch eine Array der Dateipfade und dann gebe ich das in dem foreach aus.
Habe ich jetzt was übersehen oder einfach nur eine etwas zu naive Vorstellung wie ich das lösen kann :).

Grüße
 
Also ich stelle mir bei der Betrachtung Deines Skriptes mehrere Fragen:
  1. Was geht genau nicht?
  2. Warum verwendest Du opendir/readdir/closedir, wenn Du jedoch nie auf den Wert von $file zugreifst?
  3. Durchsucht glob das richtige Verzeichnis?

Aus meiner Sicht kannst Du auf opendir/readdir/closedir komplett verzichten, solange Du mit glob die richtigen Verzeichnisse durchsuchst. Diese solltest Du dann noch sortieren, damit sie auch richtig zugeordnet werden.
 
Außerdem hast Du folgenden Fehler gemacht:
Code:
        foreach ($filenames_thumb as $filename_thumb) {
            echo '<a class="grouped_elements" rel="group1" href="'. $path . $filename_thumb . '">';
            foreach ($filenames_big as $filename_big) {
                echo '<img alt="' . $filename_big . '" src="'. $path . $filename_big . '"></a>'; 
            }
    }
Du legst zunächst in einer foreach-Schleife alle a-Tags an und darin in einer weiteren Schleife alle img-Tags und die Abschlüsse der a-Tags. D. h. im HTML kommen für jedes öffnende a-Tag alle img-Tags und schließende a-Tags. So dass die Tags nicht so verschachtelt sind, wie es sein müsste. Du musst eine Schleife mit Index anlegen und im Körper sowohl auf $filenames_thumb als auch auf $filename_big zugreifen und die verschachtelten Tags anlegen.
 
Zuletzt bearbeitet:
Stimmt, das heißt, dass dieser Teil so gelöst werden könnte (ohne Iterator):
PHP:
$thumbnails = glob( /* ... */ );
$originals  = glob( /* ... */ );

sort( $thumbnails );
sort( $originals );

$thumbnails = array_values( $thumbnails );
$originals  = array_values( $originals );
$count      = count( $thumbnails );
$combined   = array();

for ( $i = 0; $i < $count; ++$i ) {
  $combined[] = array(
    "thumbnail" => $thumbnails[ $i ],
    "original"  => $originals[ $i ]
  );
}
 
Hi,
was nicht funktioniert ist das keine Bilder angezeigt werden.
Hab grad nochmals im Manual nachgelesen, stimmt auf opendir/readdir/closedir kann man bei glob verzichten.

Und ich hab auch meinen primären Fehler gefunden. Ich habe vergessen das Anchor-Element zu schließen :).

Nun stellt sich mir noch das Problem das ich für die Ausgabe noch Thumbnail und großes Bild zuordnen muss. Aber da hate es ja eine Lösung in deinem ersten Script drinnen.

Viele Grüß
 

Neue Beiträge

Zurück