Unterordner einbeziehen Random Image

rollerueckwaerts

Erfahrenes Mitglied
Hallo
Ich habe eine Bilder Rotation auf meiner Seite die blöderweise nicht in die Unterverzeichnisse geht. Da beim Upload der Userbilder jedoch Unterordner angelegt werden wird die Rotation vollkommen nutzlos. Gibt es ein kurzes Codegefriemel welches an der richtigen Stelle eingesetzt, ein einbeziehen der Unterordner bewirkt ?
Also ihr merkt schon, bin nich wirklich php-begabt :) Deswegen hier der Code

PHP:
<?php

// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );

global $mosConfig_absolute_path, $mosConfig_live_site;

$type 			= $params->get( 'type', 'jpg' );
$folder 		= $params->get( 'folder' );
$link 			= $params->get( 'link' );
$width 			= $params->get( 'width' );
$height 		= $params->get( 'height' );
$the_array 		= array();
$the_image 		= array();

// if folder includes livesite info, remove
if ( strpos($folder, $mosConfig_live_site) === 0 ) {
	$folder = str_replace( $mosConfig_live_site, '', $folder );
}
// if folder includes absolute path, remove
if ( strpos($folder, $mosConfig_absolute_path) === 0 ) {
	$folder= str_replace( $mosConfig_absolute_path, '', $folder );
}
// if folder doesnt contain slash to start, add
if ( strpos($folder, '/') !== 0 ) {	
	$folder = '/'. $folder;
}
// construct absolute path to directory
$abspath_folder = $mosConfig_absolute_path . $folder;

// check if directory exists
if (is_dir($abspath_folder)) {
	if ($handle = opendir($abspath_folder)) {
		while (false !== ($file = readdir($handle))) {
			if ($file != '.' && $file != '..' && $file != 'CVS' && $file != 'index.html' ) {
				$the_array[] = $file;
			}
		}
	}
	closedir($handle);

	foreach ($the_array as $img) {
		if (!is_dir($abspath_folder .'/'. $img)) {
			if (eregi($type, $img)) {
				$the_image[] = $img;
			}
		}
	}

	if (!$the_image) {
		echo _NO_IMAGES;
	} else {
	  	$i 				= count($the_image);
	  	$random 		= mt_rand(0, $i - 1);
	  	$image_name 	= $the_image[$random];
	  	$abspath_image	= $abspath_folder . '/'. $image_name;
	  	$size 			= getimagesize ($abspath_image);
	
	  	if ($width == '') {
	  		($size[0] > 100 ? $width = 100 : $width = $size[0]);
	  	}
	  	if ($height == '') {
	  		$coeff 	= $size[0]/$size[1];
	  		$height = (int) ($width/$coeff);
	  	}
	
	  	$image = $mosConfig_live_site . $folder .'/'. $image_name;
	  	?>
	 	<div align="center">
		 	<?php
		  	if ($link) {
		  		?>
		  		<a href="<?php echo $link; ?>" target="_self">
		  		<?php
		  	}
		  	?>
		 	<img src="<?php echo $image; ?>" border="0" width="<?php echo $width; ?>" height="<?php echo $height; ?>" alt="<?php echo $image_name; ?>" /><br />
		 	<?php
		  	if ($link) {
		  		?>
		  		</a>
		  		<?php
		  	}
		  	?>
	 	</div>
	  	<?php
	}
}
?>

Dank schonmal fürs Lesen
Lg Tobi
 
Hey Danke für den Link ! War auf jeden Fall sehr hilfreich.

Hab ein wenig probiert doch ich bekomms nich hin :(

Aus dem Code von dem Link
PHP:
function get_dir ($dir,$ebene) {
$fp=opendir($dir);
while($datei=readdir($fp)) {
if (is_dir("$dir/$datei") && $datei!="." && $datei!="..")
{
echo "$datei (dir)
";
if ($ebene<3) get_dir("$dir/$datei",$ebene+1);
}
else {echo $datei."
";}
}
closedir($fp);
}

//Hauptprogramm
get_dir ("./",1);

hab ich schonmal das hier gemacht :confused:

PHP:
function get_dir ($folder,$ebene) {
$fp=opendir($folder);
while($the_image=readdir($fp)) {
if (is_dir("$dir/$the_image") && $the_image!="." && $the_image!="..")
{
echo "$the_image (folder)
";
if ($ebene<3) get_dir("$folder/$the_image",$ebene+1);
}
else {echo $datei."
";}
}
closedir($fp);
}

//Hauptprogramm
get_dir ("./",1);

Ob das nun wenigstens vom Ansatz richtig war, ich weiß es nich.
Stecke halt immernoch in der Video2Brain - Jetzt lerne ich PHP! - Anfangsphase :)

Klar hoff ich das sich mir jemand erbarmt und mir das Script zusammenschustert, aber nen detailierter Tipp wo was hin muss .... Naja gut ich komm nich drumrum. Jetzt lerne ich PHP! :)
 
Zuletzt bearbeitet:
Der Ansatz is soweit in Ordnung. Mal ehrlich was haben wir alle davon, wenn ich dir das fertige Script hier rein schreib? Entweder du willst was lernen, dann geb ich dir gern Hinweise, was du wie angehen sollst. Oder du suchst dir ein passendes Script irgendwo im Netz. Für jedes Problem gibts auch schon ne Lösung irgendwo. Ich hätte den Ansatz folgendermaßen gebaut:

PHP:
function search4Picture( $folder )
{
    $dir = dir($folder);
    while( $file = $d->read() ) {
        if( preg_match('/^\./', $file) continue;   // Eintrag mit . am Anfang
        $realpath = sprintf( "%s/%s", $folder, $file );

        // Achtung, einige der Datei-Operationen benötigen den
        // absoluten Pfad zur Datei, daher wird unten auch erst mit
        // realpath() der absolute Pfad für den aktuellen Ordner
        // geholt und and die erste Suche übergeben.

        if( is_dir($realpath ) ) search4Picture( $folder );

        // Hier kann jetzt geprüft werden, ob der Verzeichniseintrag
        // eine Bilddatei ist (is_file & getimagesize sind deine Freunde)
        // und entsprechend reagieren
    }
    $d->close();
}

search4Picture( realpath ('./') );

Wenn du noch spezifische Fragen hast, beantworte ich sie dir gern.
 
Danke für die weitere Hilfestellung .... nur anfangen konnte ich mit ; // Eintrag mit . am Anfang, getimagesize, is_file ... leider nichts. Eine Sprache sprechen mit 5 Vokabeln, das pack ich nich :)

Deshalb nehme ich gesenkten Hauptes deinen Rat an und mach mich auf die Suche nach nem Fertig Script.

Haste da vielleicht nen direkten Tipp für mich ? Nee Nee kleener Scherz.
Also ... ich mach mich auf.

PHP:
function search4Picture( $folder )
{
    $dir = dir($folder);
    while( $file = $d->read() ) {
        if( preg_match('/^\./', $file) continue;   // Eintrag mit . am Anfang
        $realpath = sprintf( "%s/%s", $folder, $file );

        // Achtung, einige der Datei-Operationen benötigen den
        // absoluten Pfad zur Datei, daher wird unten auch erst mit
        // realpath() der absolute Pfad für den aktuellen Ordner
        // geholt und and die erste Suche übergeben.

        if( is_dir($realpath ) ) search4Picture( $folder );

        is_file("/WWWROOT/115727/htdocs/images");
        $size = getimagesize ("$folder.$file");

        // Hier kann jetzt geprüft werden, ob der Verzeichniseintrag
        // eine Bilddatei ist (is_file & getimagesize sind deine Freunde)
        // und entsprechend reagieren
    }
    $d->close();
}

search4Picture( realpath ('/images') );
 
PHP:
function search4Picture( $folder, $picturelist = array() )
{
    $dir = dir($folder);
    while( $file = $d->read() ) {
        if( preg_match('/^\./', $file) continue;   // Eintrag mit . am Anfang
        $realpath = sprintf( "%s/%s", $folder, $file );

        if( is_dir($realpath ) ) {
            $picturelist = search4Picture( $realpath, $picturelist );
        }

        if( is_file($realpath) ) {
            $image_info = getimagesize( $realpath );
            switch( $image_info[ 2 ] ) {
                case 1:            // Type = gif
                case 2:            // Type = jpeg
                case 3:            // Type = png
                    $picturelist[] = $realpath;
                break;
                default:            // Type = kein Bild, also nix machen
                break;
            }
        }
    }
    $d->close();

    return $pciturelist;
}


$alleBilder = search4Picture( './' );

echo "<pre>";
echo "Alle gefundenen Bilder:\n";
print_r($alleBilder);
echo "</pre>";

Damit haste alle Bilder in einem Array, aus welchen du jetzt eines zufällig auswählen kannst.

Bitte versuch den Code etwas zu verstehen.
 
Was muss denn in diese zeile bei '/^\./' ?
PHP:
if( preg_match('/^\./', $file) continue;   // Eintrag mit . am Anfang

Habe nach preg_match gegooglt und erhielt folgendes

PHP:
preg_match($suchmuster, $zeichenkette, $treffer, PREG_OFFSET_CAPTURE, 3

und das hab ich draus gemacht :)

PHP:
function search4Picture( $folder, $picturelist = array() )
{
    $dir = dir($folder);
    while( $file = $d->read() ) {
        if( preg_match($type , $image_info , $file) continue;   // Eintrag mit . am Anfang
        $realpath = sprintf( "%s/%s", $folder, $file );

        if( is_dir($realpath ) ) {
            $picturelist = search4Picture( $realpath, $picturelist );
        }

        if( is_file($realpath) ) {
            $image_info = getimagesize( $realpath );
            switch( $image_info[ 2 ] ) {
                case 1:            // Type = gif
                case 2:            // Type = jpeg
                case 3:            // Type = png
                    $picturelist[] = $realpath;
                break;
                default:            // Type = kein Bild, also nix machen
                break;
            }
        }
    }
    $d->close();

    return $pciturelist;
}


$alleBilder = search4Picture( './' );

echo "<pre>";
echo "Alle gefundenen Bilder:\n";
print_r($alleBilder);
echo "</pre>";

Doch egal welche Variablen ich eingebe. Fehler in Z. 32

habs auch schon mit
PHP:
preg_match('/def/ . /jpg' , $allebilder)
probiert. Aber war halt auch nur geschätzt :)

Bin gespannt ob (und wenn ja wieee *g) es weiter geht.
lg

tobi
 
Das preg_match prüft lediglich, ob der Datei-/Verzeichnisname mit einem Punkt beginnt.

preg_match benötigt ein Suchmuster, das folgendermaßen aufgebaut ist:

delimiter-muster-delimiter-modifikator

Ein Regex mit folgendem Muster

/^\./

findet also Einträge, bei denen am Anfang (^) ein Punkt steht. Den Backslash braucht man nur, weil ein Punkt auch ein Muster eines regulären Ausdrucks ist. Ich empfehle dir mal ein Buch, dessen Geld-Ausgabe sich wirklich lohnt. http://www.oreilly.de/catalog/regexpprger/index.html
Kostet 8 Euro und hat mir schon oft geholfen. Besser ist es natürlich statt der Taschenbuchausgabe sich den kompletten Schmöker zu holen.

Grundsätzlich sollte meine Funktion aber schon genau das erledigen, was du brauchst. Es sind nur ein paar Tipp-Fehler drin. Richtig muss es lauten:

PHP:
function search4Picture( $folder, $picturelist = array() )
{
    $dir = dir($folder);
    while( $file = $dir->read() ) {
        if( preg_match('/^\./', $file) ) continue;   // Eintrag mit . am Anfang
        $realpath = sprintf( "%s/%s", $folder, $file );

        if( is_dir($realpath ) ) {
            $picturelist = search4Picture( $realpath, $picturelist );
        }


        if( is_file($realpath) ) {
            $image_info = getimagesize( $realpath );
            switch( $image_info[ 2 ] ) {
                case 1:            // Type = gif
                case 2:            // Type = jpeg
                case 3:            // Type = png
                    $picturelist[] = $realpath;
                break;
                default:            // Type = kein Bild, also nix machen
                break;
            }
        }
    }
    $dir->close();

    return $picturelist;
}


$alleBilder = search4Picture( realpath('./') );

echo "<pre>";
echo "Alle gefundenen Bilder:\n";
print_r($alleBilder);
echo "</pre>";
 
Wow danke das sieht gut aus :)

Es gibt noch das kleine problem "read - error getimagesize".
Gehe davon aus das dies an dem Chmod meiner Ordner und Dateien liegt.

Aber da muss man andersrum ran.
Das Script durchsucht nämlich meinen ganzen WebSpace und nicht nur den vorgeschriebenen Ordner.

Im Code steht doch

PHP:
dir = dir($folder)

und oben

PHP:
$folder 		= $params->get( 'components/com_comprofiler/enhanced/gallery/images/' );

Woran kann es liegen das er die ganze Seite durchsucht ?
 
Wo die Funktion anfangen soll zu suchen legst du hier fest:

PHP:
$alleBilder = search4Picture( realpath('./') );

Statt dem realpath( './' ) musste natürlich den Ordner eintragen, ab dem du suchen willst, z.B:

PHP:
$alleBilder = search4Picture( realpath('components/com_comprofiler/enhanced/gallery/images/') );
 
Zurück