Zufallsbild mit Unterverzeichnis, Link und TimeOut

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Zufallsbild mit Unterverzeichnis, Link und TimeOut

Beitrag von Milly » Di 11. Mär 2008, 13:57

Es gibt zwar einige Module die sich mit dem Thema "Zufallsbild" beschäftigen, aber für mich war nie das richtige dabei. Ich brauchte folgende Anforderungen:
  • Thumbnail-Vorschau mit variabler Breite
    Durchsuchen von Verzeichnis und Unterverzeichnissen
Also habe ich mir schnell ein Modul selber geschrieben. Der Input-Teil sieht wie folgt aus:

Code: Alles auswählen

?>

<table cellspacing="0" cellpadding="5" border="0">
	<tr> 
		<td>Image-Directory:</td> 
		<td><input size=20 type="text" name="CMS_VAR[1]" value="CMS_VALUE[1]"></td> 
	</tr><tr>
		<td>Max Breite:</td> 
		<td><input size=20 type="text" name="CMS_VAR[2]" value="CMS_VALUE[2]"></td> 
	</tr><tr>
		<td>Zeitlimit in Sek.:</td> 
		<td><input size=20 type="text" name="CMS_VAR[3]" value="CMS_VALUE[3]"></td> 
	</tr> 
</table>

<?php
Die drei Eingaben verlangen:
  • Nach dem Startverzeichnis (z.B.: "./upload/bildergalerie/user")
    Der maximalen Breite in Pixel (z.B.: "200")
    Das Zeitlimit für die Verzeichnissuche (z.B.: "5")
Die ersten beiden Punkte sind wohl klar. Die Verzeichnisse werden rekursiv durchsucht. Falls es viele Verzeichnisse und viele Dateien gibt, dann kann die Ausgabe schon mal was dauern. Die Suche wird dann nach dem Zeitlimit abgebrochen und ein Zufallsbild, aus den bis dahin gefunden, gewählt.
Das Thumbnail ist kein echtes Thumbnail sondern es wird nur runterskaliert. Gleichzeitig erhält es einen Link womit das Bild in einem neuen Fenster in der Originalgröße angezeigt wird.
Es wird nach Dateien mit .gif, .jpg, .jpeg und .png Endung gesucht.


Der Output-Code:

Code: Alles auswählen

<?php 

$dateien = array();
$start=time(); 
get_dir("CMS_VALUE[1]",$start,"CMS_VAR[3]"); 
$breite = (int) "CMS_VALUE[2]";

#Was gefunden
if (count($dateien) < 1)
	{	echo "nix gefunden"; }
else
	{	# Array sortieren
		sort($dateien);

		# Zufall
		srand ((double) microtime() * 10000000);
		$rand_keys = array_rand ($dateien, 2);

		$Zufallsbild = $dateien[$rand_keys[0]]; 
		$dimensions = GetImageSize($Zufallsbild); 

		echo "<a href=\"$Zufallsbild\" target=\"_blank\">";
		
		if ($dimensions[0] > $breite)
			{	echo "<img src=\"$Zufallsbild\" width=\"$breite\""; }
		else
			{	echo "<img src=\"$Zufallsbild\""; }
		
		echo " border=\"0\" alt=\"Klick mich f&uuml;r eine Gro&szlig;ansicht (neues Fenster)\"></a><br>\n";
	}
	

function get_dir ($dir,$startzeit,$zeitlimit)
	{	global $dateien;
		$fp=opendir($dir);
 		while($datei=readdir($fp))
 			{	if (is_dir("$dir/$datei") && $datei!="." && $datei!="..")
					{	if (time()-$starttime > $zeitlimit) get_dir("$dir/$datei",$startzeit,$zeitlimit); }
   			else
   				{ if (strlen($datei) > 4)
   						{	$ext = strtolower(substr($datei,-4));
								if ($ext==".jpg" || $ext==".gif" || $ext=="jpeg" || $ext==".png")
									{	$dateien[] = $dir . "/" . $datei; }
							}
					}
 			}
  	closedir($fp);
	} 



?>

Vielleicht kann es ja noch jemand gebrauchen.

Grüße
Milly

Nebel
Beiträge: 117
Registriert: Do 14. Jun 2007, 10:08
Kontaktdaten:

Beitrag von Nebel » Di 11. Mär 2008, 22:37

Hi,

super Modul danke! Funktioniert einwandfrei.

Könnte man noch eine Funktion einbauen, mit der man die Ebenen der durchsuchenden Unterverzeichnisse angeben kann?

Also z.B. upload/u1/u2/u3/ dass hier nur Bilder bis meinetwegen u2 ausgelesen werden und die Bilder in u3 nicht bei den Zufallsbildern auftauchen. Das wäre super!

Schöne Grüße

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Mi 12. Mär 2008, 13:14

Schön, das es dir gefällt.

Klar ist das möglich. Du mußt nur im Input folgende Zeilen einsetzen:

Code: Alles auswählen

</tr><tr> 
      <td>Verzeichnistiefe:</td> 
      <td><input size=20 type="text" name="CMS_VAR[4]" value="CMS_VALUE[4]"></td> 


Den Output-Bereich ersetzen durch:

Code: Alles auswählen

<?php 

$dateien = array(); 
$start=time(); 

get_dir("CMS_VALUE[1]",$start,"CMS_VAR[3]","CMS_VALUE[4]"); 
$breite = (int) "CMS_VALUE[2]"; 

if (count($dateien) < 1) 
   {   echo "nix gefunden"; } 
else 
   {   # Array sortieren 
      sort($dateien); 

      # Zufall 
      srand ((double) microtime() * 10000000); 
      $rand_keys = array_rand ($dateien, 2); 

      $Zufallsbild = $dateien[$rand_keys[0]]; 
      $dimensions = GetImageSize($Zufallsbild); 

      echo "<a href=\"$Zufallsbild\" target=\"_blank\">"; 
       
      if ($dimensions[0] > $breite) 
         {   echo "<img src=\"$Zufallsbild\" width=\"$breite\""; } 
      else 
         {   echo "<img src=\"$Zufallsbild\""; } 
       
      echo " border=\"0\" alt=\"Klick mich f&uuml;r eine Gro&szlig;ansicht (neues Fenster)\"></a><br>\n"; 
   } 
    

function get_dir ($dir,$startzeit,$zeitlimit,$max_tiefe) 
   {  global $dateien;
   		global $aktuelle_tiefe; 
      
      $fp=opendir($dir); 
      while($datei=readdir($fp)) 
      	{	if (is_dir("$dir/$datei") && $datei!="." && $datei!="..") 
            {	$aktuelle_tiefe++;
              if (time()-$starttime > $zeitlimit && $max_tiefe >= $aktuelle_tiefe)
              	{ get_dir("$dir/$datei",$startzeit,$zeitlimit,$max_tiefe); }
            } 
          else 
            { if (strlen($datei) > 4) 
                {   $ext = strtolower(substr($datei,-4)); 
                     if ($ext==".jpg" || $ext==".gif" || $ext=="jpeg" || $ext==".png") 
                       {   $dateien[] = $dir . "/" . $datei; } 
                } 
            } 
          } 
     closedir($fp); 
   } 

?>

Das sollte es gewesen sein.....


Grüße
Milly

Nebel
Beiträge: 117
Registriert: Do 14. Jun 2007, 10:08
Kontaktdaten:

Beitrag von Nebel » Mi 12. Mär 2008, 18:24

Super, danke!

Kann es sein, das die Zahl für Verzeichnistiefe aber nur eine bestimmte Anzahl von Verzeichnissen durchsucht, aber nicht die Tiefe?
  • Oberverz1
    • Unterverz1
      Unterverz2
    Oberverz2
Bei Verzeichnistiefe=1 zeigt er nur Bilder aus Oberverz1 an, nicht aber wie gewünscht auch aus Oberverz2.

Bei einer Verzeichnistiefe=3 werden Oberverz1, Unterverz1 und Unterverz2 durchsucht.

Weißt du wie man den von mir gewünschten Effekt erzielen könnte? :D

Schöne Grüße
Nebel

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Fr 14. Mär 2008, 14:07

Joh - Hast Recht!

Es werden ja die Anzahl der Verzeichnisse gezählt und nicht die Tiefe.
Habe aber jetzt keine Zeit das zu ändern - es ist Freitag Nachmittag :lol:

Nächste Woche gehe ich das Problem an......

Grüße
Milly

Nebel
Beiträge: 117
Registriert: Do 14. Jun 2007, 10:08
Kontaktdaten:

Beitrag von Nebel » Mo 17. Mär 2008, 16:14

Super. Würde mich sehr freuen, wenn es funktioniert :D

slecram
Beiträge: 54
Registriert: Do 1. Nov 2007, 16:05
Kontaktdaten:

Beitrag von slecram » Mo 17. Mär 2008, 23:46

kannst du mir nochmal genau sagen, welchen pfad ich angeben muss?
hab schon alles ausprobiert.

bekomme ich folgende fehlermeldung

Code: Alles auswählen

Warning: readdir(): supplied argument is not a valid Directory resource in /srv/www/htdocs/web97/html/cms/cms/front_content.php(884) : eval()'d code on line 561

Warning: closedir(): supplied argument is not a valid Directory resource in /srv/www/htdocs/web97/html/cms/cms/front_content.php(884) : eval()'d code on line 572
nix gefunden
die bilder liegen in /cms/upload/bildergalerie/ und dort in diversen unterordnern...

gruß

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Di 18. Mär 2008, 16:20

@slecram
In deinem Fall wäre das: "./upload/bildergalerie"

@Nebel
Habe dich nicht vergessen. Gehe das Prob morgen an.

Grüße
Milly

slecram
Beiträge: 54
Registriert: Do 1. Nov 2007, 16:05
Kontaktdaten:

Beitrag von slecram » Di 18. Mär 2008, 16:34

keine änderung

hab angegeben

./upload/bildergalerie

200

5

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Mi 19. Mär 2008, 14:12

@slecram:
Liegt der Webserver auf einem Unixsystem?
Falls ja, Groß/Kleinschreibung beachtet?

Grüße
Milly

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Mi 19. Mär 2008, 14:36

@Nebel
Bitte den OUTPUT-Teil ändern in:

Code: Alles auswählen


<?php 

$dateien = array(); 
$start=time(); 

$tiefe = substr_count("CMS_VALUE[1]","/") + (int) "CMS_VALUE[4]";

get_dir("CMS_VALUE[1]",$start,"CMS_VAR[3]",$tiefe); 
$breite = (int) "CMS_VALUE[2]"; 

if (count($dateien) < 1) 
	{	echo "nix gefunden"; } 
else 
	{	# Array sortieren 
    sort($dateien); 

    # Zufall 
    srand ((double) microtime() * 10000000); 
    $rand_keys = array_rand ($dateien, 2); 

    $Zufallsbild = $dateien[$rand_keys[0]]; 
    $dimensions = GetImageSize($Zufallsbild); 

    echo "<a href=\"$Zufallsbild\" target=\"_blank\">"; 
        
    if ($dimensions[0] > $breite) 
      {	echo "<img src=\"$Zufallsbild\" width=\"$breite\""; } 
    else 
      { echo "<img src=\"$Zufallsbild\""; } 
        
    echo " border=\"0\" alt=\"Klick mich f&uuml;r eine Gro&szlig;ansicht (neues Fenster)\"></a><br>\n"; 
	} 
    

function get_dir ($dir,$startzeit,$zeitlimit,$max_tiefe) 
 	{	global $dateien; 
      
    $fp=opendir($dir); 
    while($datei=readdir($fp)) 
    	{	if (is_dir("$dir/$datei") && $datei!="." && $datei!="..") 
        	{	$aktuelle_tiefe = substr_count("$dir/$datei"); 
            if (time()-$starttime > $zeitlimit && $max_tiefe >= $aktuelle_tiefe) 
            	{ get_dir("$dir/$datei",$startzeit,$zeitlimit,$max_tiefe); } 
          } 
        else 
          { if (strlen($datei) > 4) 
            	{	$ext = strtolower(substr($datei,-4)); 
                if ($ext==".jpg" || $ext==".gif" || $ext=="jpeg" || $ext==".png") 
                	{	$dateien[] = $dir . "/" . $datei; } 
               } 
          } 
      } 
    closedir($fp); 
	} 

?>
 
Damit solltest du jetzt die Max-Tiefe der Verzeichnisse bestimmen können.
Viel Spaß damit.

Grüße
Milly

slecram
Beiträge: 54
Registriert: Do 1. Nov 2007, 16:05
Kontaktdaten:

Beitrag von slecram » Mi 19. Mär 2008, 16:52

moin,
denke schon das der server auf unix basis läuft.

groß/kleinschreibung habe ich beachtet. den pfad habe ich so ausm ftp client kopiert..

gruß

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Do 20. Mär 2008, 13:39

Tach auch,

versuch' doch bitte mal den kompletten Webpfad (also: http://......) und einmal den "echten" Pfad (also: /usr/local/....)

Grüße
Milly

GaMbIt_
Beiträge: 674
Registriert: Do 16. Mär 2006, 16:17
Kontaktdaten:

Beitrag von GaMbIt_ » Do 20. Mär 2008, 15:00

Hi... ichhab jetzt Dein Modul noch nicht wirklich ausprobiert,
aber kann jetzt schon sagen dass gerade bei größeren Bildern die Ladezeit im Forntend ziemlich nerven kann...

verwende doch die cApiImgScale() Funktion zum skalieren der Bilder...
Dann wird auch nur das skalierte Bild geladen...

Milly
Beiträge: 33
Registriert: Mo 12. Sep 2005, 08:35
Wohnort: Reutlingen
Kontaktdaten:

Beitrag von Milly » Mi 26. Mär 2008, 09:54

@GaMbIt_
Ja, das werde ich nun umsetzen. Das Modul war "damals" ein Schnellschuß und mußte schnell programmiert werden.

Habe mir mal das Illustrations-Modul näher angesehen. Dort steht:

$image = capiImgScale($img_path_fs, $img_width, $img_height, false, false, 10, false);

Die ersten drei Parameter sind mir klar. Aber was bedeuten die letzten vier Parameter?
Konnte auch hier im Forum keine Erklärung dazu finden. Wäre nett wenn mir jemand sagen könnte was die letzten vier Parameter bedeuten.

Kann man eine Angabe weglassen (z.B. die Höhe: Man gibt nur die Breite an und die Höhe wird auto. berechnet)???

Danke & Gruß
Milly

Gesperrt