point
Goto Top

Ordner auslesen und die angezeigten Einträge kürtzen.

Ich lese den Inhalt eines Ordners aus, es handelt sich um Bilder. Diese werden dann als kleine Vorschaubild angezeigt und können durch Anklicken des jeweiligen Vorschaubildes groß angezeigt werden.

Ich lese mittels PHP den Inhalt eines Ordners aus, es handelt sich um Bilder. Diese werden dann als kleine Vorschaubild angezeigt und können durch Anklicken des jeweiligen Vorschaubildes groß angezeigt werden.

Hier ist ein Beispiel: http://www.asien.l-seifert.de/nepal/Familie.html

Ist es möglich, mittels PHP die Liste der angezeigten Bilder zu kürzen, damit nur etwa 5 Bilder vor und 5 Bilder nach dem angezeigten Bild bei den Vorschaubildern angezeigt werden? Der Befehl substr scheint dafür nicht geeignet zu sein.
Vielen Dank für jede Idee.

Viele Grüße von Lothar

Content-Key: 192556

Url: https://administrator.de/contentid/192556

Printed on: April 25, 2024 at 10:04 o'clock

Member: EvilMoe
EvilMoe Oct 10, 2012 at 12:34:09 (UTC)
Goto Top
Hallo,

eine Lösung wäre alle Bilder also die Dateinamen in einen Array zu speichern. Dann kannst du deine Schleife ganz einfach so lange laufen lassen wie du möchtest.


Sven
Member: point
point Oct 10, 2012 at 14:30:40 (UTC)
Goto Top
Hallo Sven,

vielen Dank für die schnelle Antwort. Mein Problem, genau da verlassen mich meine PHP- Kenntnisse. Was würde das kosten, wenn mir hier jemand das Skript so umschreiben kann?
Mit einer .htaccess wandle ich noch den Bildernahme.jpg in eine Bildernahme.html - Datei, was man im untenstehenden Skript aber nicht sehen kann.
So sieht das im Moment aus:

$dir = ".";  
$dh  = opendir($dir);
{
while (false !== ($filename = readdir($dh)))
        if ($filename != "." && $filename != "..")  
   {
    $files = $filename;
   }
sort($files);
foreach ($files as $value)
          {
    $name = $value;
            $name = ereg_replace('.jpg', '', $name);  
    $bilder ="$name";  
    $name = ereg_replace('-', ' ', $name);  
    $name = preg_replace( "/(oe)/im", "ö", $name);  
    $name = preg_replace( "/(ue)/im", "ü", $name);  
    $name = preg_replace( "/(ae)/im", "ä", $name);  
    $val=pathinfo($value);
    $val=$val["extension"];  
  if (($val=="jpg") or ($val=="JPG")){  
  $var = explode(".", $bilder);  
  echo "<a class='a' href='$var.html' title='$name'><IMG SRC='$ordner/$value' alt='$name' style='$border;' width='$width' height='$height'></a>&nbsp;";  
}          }
closedir($dh);
}

Viele Grüße Lothar
Member: EvilMoe
EvilMoe Oct 10, 2012 at 14:40:55 (UTC)
Goto Top
Hallo,

was ich oben sagte macht dein Script bereits. $files enthält deine Bilder.

Was man nun noch bräuchte wäre der Dateiname im Script. Ich vermute das du in deiner htaccess den als Parameter an dein Script übergibst.
Dann wäre es möglich es so zu bauen wie du möchtest.
Member: point
point Oct 10, 2012 at 15:45:30 (UTC)
Goto Top
Hallo Sven,

der Dateiname wird bei Aufruf der Seite aus dem Namen der Bilddatei erzeugt, wobei die .htaccess aus dem .jpg ein .html macht. Siehe: http://www.asien.l-seifert.de/nepal/Familie.html

Dieser Link erzeugt dann die Anzeige des großen Bildes:
echo "<IMG SRC='$Bild' alt='$titelbild'>";  

Ich hoffe, Du kannst damit etwas anfangen.

Viele Grüße
Lothar
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 16:11:04 (UTC)
Goto Top
Die Frage ist Woher das $Bild kommt. Kommt das aus $_GET?
Das wäre noch zu klären.

Ansonsten müsste der Code in etwas so aussehen (ungetestet).
$bild muss jetzt das aktuelle Bild enthalten bzw gesetzt werden. Dazu müsstest du mal in der htaccess schauen welchen Variablennamen du dafür verwendest.
<?php
$bild	= ""; // dateiname vom aktuellen Bild  
$anz	= 5; // vorlauf, nachlauf

$dir	= ".";  
$dh = opendir($dir);
{
	$file = array();
	while (false !== ($filename = readdir($dh))){
		if ($filename != "." && $filename != "..")  
		{
			$files = $filename;
		}
	}
	sort($files);
		
	
	$id_cur = array_keys($files, $bild); // index aktuelle bild
	// Wenn kein Bild ausgeäwhlt ist oder eines der ersten bilder ausgewählt ist bei 0 anfangen
	if(!in_array($bild, $files) || $id_cur <= 5){
		$start	= 0;
		$ende	= $anz;	
	} else {
		$start	= $id_cur-$anz;
		$ende	= $id_cur+$anz;
	}
	$ende = ($ende > count($files)) ? count($files): $ende;
		
	for($i=$start; $i < $ende; $i++)
	{
		$name = $files[$i];
		$name = ereg_replace('.jpg', '', $name);  
		$bilder = $name;
		$name = ereg_replace('-', ' ', $name);  
		$name = preg_replace( "/(oe)/im", "&ouml;", $name);  
		$name = preg_replace( "/(ue)/im", "&uuml;", $name);  
		$name = preg_replace( "/(ae)/im", "&auml;", $name);  
		
		$val=pathinfo($files[$i]);
		$val=$val["extension"];  
		if (($val=="jpg") or ($val=="JPG")){  
			$var = explode(".", $bilder);  
			echo "<a class='a' href='$var.html' title='$name'><IMG SRC='$ordner/$files[$i]' alt='$name' style='$border;' width='$width' height='$height'></a>&nbsp;";  
		}
	}
	closedir($dh);
}

?>
Member: point
point Oct 10, 2012 at 16:46:27 (UTC)
Goto Top
Das steht in der .htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,QSA,L]
RewriteRule ^index\.(html?|php)$ http://%{HTTP_HOST}/ [R=301,QSA,L]

Zu: Woher das $Bild kommt. Kommt das aus $_GET?
Kann das in dieser Zeile übergeben werden?
$Bild = $_GET["Bild"];   

Ich habe es so ausprobiert wie von dir gepostet, da werden immer nur die ersten 5 Vorschaubilder angezeigt. Ersetze ich die Zeile 03. $bild = ""; mit $Bild = $_GET["Bild"]; , dann ist hier in dieser Zeile 25. $start = $id_cur-$anz; eine Fehlermeldung Fatal error: Unsupported operand types
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 16:55:37 (UTC)
Goto Top
Wenn du es so probierst wie ich es geschrieben habe kann er auch nur dir ersten Bilder anzeigen. Die Variable $bild muss gesetzt werden wie du es geschrieben hast.


EDIT: Sorry, ich habe einen kleinen Fehler drin. Zeile 19. Nach der Zeile muss noch dies kommen:
$id_cur = $id_cur;
array_keys gibt ein Array zurück und nicht direkt den Key.
Member: point
point Oct 10, 2012 at 17:23:33 (UTC)
Goto Top
Das sieht ja schon echt gut aus. Ein Problem war noc: $bild muss $Bild geschrieben werden.
Nun tritt noch ein Problem auf. Bisher hatte ich auch dieses im Script stehen, was ich zur Vereinfachung rausgenommen hatte:

if (ereg("($value)", $Bild))  /* angezeigtes Bild vergr&ouml;&szlig;ern*/ 
 {
$width='38'; 
$height='43'; 
$border='border-color:#FF7F00;border-bottom-width:4px;border-top-width:2px;border-style:solid'; 
}
else {
$width='36'; 
$height='42'; 
$border='border-bottom-width:0px'; 
}

Das funktioniert nun leider nicht mehr und ich bekomme nicht heraus, warum.
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 17:31:52 (UTC)
Goto Top
$value muss nun $files[$i] heißen.

EDIT: Habe mir deine Seite eben noch mal angesehen. Du hast momentan 5 vor dem eigentlichem Bild und 4 da nach. Wenn das auch 5 sein sollen musst du
for($i=$start; $i < $ende; $i++) 
//zu
for($i=$start; $i <= $ende; $i++) 
//machen
Member: point
point Oct 10, 2012 at 17:45:11 (UTC)
Goto Top
Bis zum 6 Bild geht es leider noch nicht. Bei den Bildern 1 - 6 bleibt alles, wie es ist und rutscht nicht weiter.
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 17:49:24 (UTC)
Goto Top
Mein Fehler, Zeile 23
$ende	= $anz;

// muss aber heißen:
$ende	= $anz+$id_cur;
Member: point
point Oct 10, 2012 at 18:13:44 (UTC)
Goto Top
Das gibt es einfach nicht, wie Du die Sache beherrscht. Meine Hochachtung. Es klappt alles. Nun hat das Chaos mit den vielen Vorschaubildern ein Ende und ich kann so viel Bilder einfügen, wie auf eine Reihe passen.
Die Anzahl habe ich auf 10 gesetzt und auch hier auf 10 erhöht.
if(!in_array($Bild, $files) || $id_cur <= 10)

Ganz am Schluss bleiben es aber noch bei 5 angezeigten Bildern. Wo kann die 5 herkommen?
http://www.asien.l-seifert.de/nepal/zwei-Maedchen.html

Könnte man noch das letzte und das erste Bild jeweils durch eine andere Grafik aus einem anderen Ordner ersetzen, das könnten dann Pfeilgrafiken sein. Damit die Leute wissen, das es da weitergeht.
Member: EvilMoe
EvilMoe Oct 10, 2012 at 18:18:25 (UTC)
Goto Top
Hast du $anz=10 gesetzt?
Die 5 die im Code stand sollte auch $anz sein.
Member: point
point Oct 10, 2012 at 18:26:29 (UTC)
Goto Top
Ja, habe ich. Die Zahl 5 steht nirgendwo mehr. Beide sind durch 10 ersetzt.
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 18:32:16 (UTC)
Goto Top
Die 10 im Code kannst du gegen $anz austauschen.

Ich sehe das Problem auch schon, deine Dateinamen beinhalten ein Leerzeichen (sollte man aus solchen Gründen im Web eh vermeiden).

Versuche es mal hier mit:
$Bild = (isset($_GET["Bild"]) ? str_replace(" ", "-", $_GET["Bild"]) : "";   
Member: point
point Oct 10, 2012 at 18:51:11 (UTC)
Goto Top
Es bleibt bei den 5 angezeigten Bildern am Schluss, siehe: http://www.asien.l-seifert.de/nepal/zwei-Maedchen.html
Das ist merkwürdig, da 5 nirgendwo steht. Erst ab den 4-letzten Bild geht es richtig.

In den Dateinamen ist eigentlich nie ein Leerzeichen. Immer ein - (minus). Das lösche ich nur, wenn ich den Dateinamen noch für andere Zwecke wie die alt und title- Tags verwende. Wo hast Du die Leerzeichen gesehen? Da muss ich irgendwo was übersehen haben.
Member: EvilMoe
EvilMoe Oct 10, 2012 at 19:00:01 (UTC)
Goto Top
Mach mal folgendes.
Schreib mal nach der while Schleife ein
var_dump($files);
var_dump($_GET);
Gehe dann auf die letzen Bilder und sag mir davon mal per PM die Ausgabe. Es hat kein Sinn mehr hier weiter zu schreiben solange wir noch ein Fehler suchen.
Member: point
point Oct 10, 2012 at 19:08:11 (UTC)
Goto Top
Ich habe es eingefügt.
Die Ausgabe ist sehr lang, klicke mal auf:
http://www.asien.l-seifert.de/nepal/zwei-Maedchen.html
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 19:34:25 (UTC)
Goto Top
Sieht OK aus, das var_dump sollte nicht in die Schleife, darum ist es so lang ;)
An dem Leerzeichen dürfte es nicht liegen.

Ich glaube ich habe den Fehler gefunden:
	
$id_cur = array_keys($files, $bild); // index aktuelle bild
$id_cur = $id_cur;
	// Wenn kein Bild ausgeäwhlt ist oder eines der ersten bilder ausgewählt ist bei 0 anfangen
	if(!in_array($bild, $files) || $id_cur <= $anz){
		$start	= 0;
		$ende	= $id_cur+$anz;	
	} else {
		$start	= $id_cur-$anz;
		$ende	= $id_cur+$anz;
	}
	if($ende > count($files)) $ende = count($files);
Ich hoffe das es nun stimmt^^
Member: point
point Oct 10, 2012 at 19:21:30 (UTC)
Goto Top
Zeile 07
} else {
Bringt:
Parse error: syntax error, unexpected '}  
Member: EvilMoe
EvilMoe Oct 10, 2012 at 19:24:16 (UTC)
Goto Top
Vollständig kopiert? Richtig ersetzt?
Der Code ist richtig.
Member: point
point Oct 10, 2012 at 19:32:26 (UTC)
Goto Top
War vielleicht doch ein Fehler beim kopieren.
Nun kommt in Zeile 08.
$start = $id_cur-$anz;

Fatal error: Unsupported operand types
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 19:34:53 (UTC)
Goto Top
Den Fehler hatten wir oben schon, vergessen mit zu kopieren.
Habe ich korrigiert oben.
$id_cur = array_keys($files, $bild); // index aktuelle bild
$id_cur = $id_cur;
	// Wenn kein Bild ausgeäwhlt ist oder eines der ersten bilder ausgewählt ist bei 0 anfangen
	if(!in_array($bild, $files) || $id_cur <= $anz){
		$start	= 0;
		$ende	= $id_cur+$anz;	
	} else {
		$start	= $id_cur-$anz;
		$ende	= $id_cur+$anz;
	}
	if($ende > count($files)) $ende = count($files);
Member: point
point Oct 10, 2012 at 19:46:55 (UTC)
Goto Top
Nun zeigt es nur noch die letzten zehn Bilder an, egal, welches Bild ich anklicke.
Member: EvilMoe
EvilMoe Oct 10, 2012 updated at 19:54:57 (UTC)
Goto Top
Hast du $bild auch $Bild genannt?
Das hatte ich nicht übernommen.

Ich meine diese Zeile:
if(!in_array($bild, $files) || $id_cur <= $anz){ 
Member: point
point Oct 10, 2012 at 19:56:13 (UTC)
Goto Top
Ja, habe ich. Wenn das nicht stimmt, zeigt es alle Vorschaubilder an.
Member: EvilMoe
EvilMoe Oct 10, 2012 at 19:58:44 (UTC)
Goto Top
Wenn du diese Zeile:
$ende	= $id_cur+$anz;
wieder in
$ende	= $anz;
änderst. Hast du dann wieder das alte Resultat?
Member: point
point Oct 10, 2012 at 20:04:27 (UTC)
Goto Top
Wenn ich beide (06. und 09.) austausche, sind alle Bilder weg.
wenn ich nur 09. austausche auch.
Wenn ich 06. austausche, bleibt es wie es war.
Member: EvilMoe
EvilMoe Oct 10, 2012 at 20:06:14 (UTC)
Goto Top
Melde dich mal auf meine PM......
Member: EvilMoe
EvilMoe Oct 10, 2012 at 21:16:49 (UTC)
Goto Top
Fehler gefunden.

Problem lag daran das sich im Ordner außer den .jpg noch andere Dateien befanden wodurch der Counter nicht mehr stimmte.

Lösung war es nun nur die .jpg mittel glob einzulesen.