[V4-Statiques] albums photos avec légendes textes

avril 2023 modifié dans Modifications
Bonjour,

je suis en train de développé un petit album photo (en reprenant en partie un truc que j'avais fait pour la V3) .

Toujours en manque de temps , je dépose ici une premiere version , administrable après que vous soyez logué dans l'administration .
Caractéristiques :
Création ou suppressions d'un ou plusieurs albums.
upload et suppresions d'images
descriptif/legende de l'image , html possible.
test existence du repertoire Album , si non le crée avec un premier album vide .

En regardant d'un peu plus prés le code , vous verrez qu'il vous est possible assez facilement de modifier le template d'affichage de l'image , ou des liens vers les Albums (template gerer par un switch ...)
<?php
/**
 * page statique de gestion d'albums photos
 *
 * @package PLX => page statique : fonctions : création , suppession d'album d'images
 * @author	Gcyrillus , gestion d'uploads et des noms de repertoires/fichiers sur  la base de Pluxml de florent monthel
 **/

// Creation des repertoires de travail si absent 
 			$old= umask();
			umask(0); 			
			if (@mkdir('data/images/Album/',0755)) {
					mkdir('data/images/Album/Album-1',0755);
					}
			umask($old);
// fin test existence repertoire Album 
	include_once(PLX_CORE.'lib/class.plx.admin.php');
	
// reconstruction de l'url d'entrée (pour retour liste cat et formulaire
$geturl = explode("?", $_SERVER['REQUEST_URI']);
$redourl='';
for($i=1;$i < count($geturl);$i++) {
$redourl .=$geturl[$i];
        }
$topurl = explode("&", $redourl);	
$finalurl = $topurl[0];	

// reconstruction url pour album
$albLink=explode("&", $_SERVER['REQUEST_URI']);
$albums=$alblink[0];

// admin inactif par defaut 

										


if (!empty($_POST)) {
	plxUtils::unSlash($_POST);
}
if (!empty($_GET)) {
	plxUtils::unSlash($_GET);
}	

// test si logger en administrateur 
# On démarre la session
session_start();

# Creation de l'objet principal et premier traitement
$plxAdmin = & new plxAdmin(PLX_CONF);
$pwd = $plxAdmin->getPasswd(PLX_ROOT.$plxAdmin->aConf['passwords']);

# Test sur l'identification
if (@!$auth_page AND (empty($_SESSION['admin']) OR empty($pwd[ $_SESSION['author'] ]) OR $pwd[ $_SESSION['author'] ] !== $_SESSION['pass'])) {$mode_admin='InActif';}
else {
$mode_admin='Actif';
// form du choix d'edition 
echo '<div id="admin">
	<h1>MODE ADMINISTRATEUR</h1>
	<p><i>(supression d\'album vide uniquement possible.)</i></p>

';
////////////////////////////////////


# Variables pour le redimensionnement
$width = 200;
$height = 100;
$quality = 80;
if (isset($_GET['galerie'])) {
$album= preg_replace('/[\.\%\&\"\s\'\:\/\[\],_|#*$£=`\+]+/',' ',$_GET['galerie']);
}
# Récupération des images du dossier
$dirImg = 'data/images/Album/'.$album.'/';

$plxImg = & new plxGlob($dirImg);

$aImg = $plxImg->query('/(.+).(gif|jpg|jpeg|png|swf|swc|psd|tiff|bmp|iff|jp2|jpx|jb2|jpc|xbm|wbmp)$/i');
# Suppression d'une image
if(isset($_GET['del']) AND !empty($_GET['hash']) AND $_GET['hash'] == $_SESSION['hash'] AND isset($aImg[ $_GET['del'] ]) AND file_exists($dirImg.$aImg[ $_GET['del'] ])) {
	# On supprime l'image et sa miniature
	if(!@unlink($dirImg.$aImg[ $_GET['del'] ])) # Erreur de suppression
		$msg = 'Impossible de supprimer l\'image (problème d\'écriture dans le dossier '.$dirImg.')';
	else # Ok
		$msg = 'Image supprimée à '.date('H:m:s');
	@unlink($dirImg.$aImg[ $_GET['del'] ].'.tb');
		@unlink($dirImg.$aImg[ $_GET['del'] ].'.txt');
		if(!isset($_GET['oki'])) {
	header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
	exit;
}
}

#MISE AJOUR D'UNE DESCRIPTION


if(isset($_GET['txt']))
			{
			$id=$_GET['txt'];
			$fichier_legend=$dirImg.$id.'.txt';
			$poster=explode('.',$id);
			$postlegend ='desc'.$poster[0];
			$f_legende=stripslashes($_POST[$postlegend]);
				$flegende=fopen("$fichier_legend","w+");
				fputs($flegende,$f_legende); 
				fclose($flegende);
				$msg .= '<br />Descriptif mis a jour';
		if(!isset($_GET['oki'])) {
	header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
	exit;
				}
				}

				
# Envoi d'une image
if(!empty($_FILES) AND !empty($_FILES['img']['name'])) {
	# On teste l'existence de l'image et on formate le nom du fichier
	$i = 0;
	$upFile = $dirImg.plxUtils::title2filename(plxUtils::unSlash(basename($_FILES['img']['name'])));
	while(file_exists($upFile)) {
		$upFile = $dirImg.$i.plxUtils::title2filename(plxUtils::unSlash(basename($_FILES['img']['name'])));
		$i++;
	}
	if(getimagesize($_FILES['img']['tmp_name'])) { # C'est une image
		if(!@move_uploaded_file($_FILES['img']['tmp_name'],$upFile)) { # Erreur de copie
			$msg = 'Impossible d\'envoyer l\'image (problème d\'écriture dans le dossier '.$dirImg.')';
		} else { # Ok
			@plxUtils::makeThumb($upFile, $upFile.'.tb',$width,$height,$quality);
			$msg = 'Image envoyée à '.date('H:m:s');
						if(!empty($_POST['descriptif'])){
							$fichier_legend =$upFile.".txt";
							$f_legende=fopen("$fichier_legend","w+");
							fputs($f_legende,stripslashes($_POST['descriptif'])); 
							fclose($f_legende);
							$msg .= ' et descriptif enregistré';
						}
		}
	} else { # Ce n'est pas une image
		$msg = 'Le fichier n\'est pas une image';
	}
		header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg));
	exit;

}

/////////////////////////////////
?>
<?php
if (!$album =='') { ?>
<h2>Uploader et gérer les images pour : <?php echo $album ; ?></h2>
	<p><?php (!empty($_GET['msg']))?plxUtils::showMsg(plxUtils::unSlash(urldecode(trim($_GET['msg'])))):''; ?></p>
	<?php if(!empty($_GET['img']) AND file_exists($dirImg.plxUtils::unSlash(rawurldecode($_GET['img'])))) { # Image particulière ?>

		<img src="<?php echo $dirImg.plxUtils::unSlash(rawurldecode($_GET['img'])); ?>" alt="" />
	<?php } else { # Galerie ?>
		<form enctype="multipart/form-data" action="" method="post">
			<fieldset class="withlabel">
				<legend>Upload d'images</legend>
				<p><input name="img" type="file" /></p>
				<p><label for="descriptif">Légende de l'image</label>
				<textarea name="descriptif" id="descriptif" />Descrition de l'image ...</textarea></p>
				<input type="submit" value="envoyer" /></p>
			</fieldset>
		</form>
		<h2>Album editable : <big><?php echo $album; ?></big></h2>
		<?php
			if (!$aImg) { # Aucune image
				echo 'Aucune image';
			} else { # On affiche les images
				$nb = count($aImg);
				for($i=0; $i < $nb; $i++) {
					echo '<div class="album"><div class="tampon"><p class="thumb">';
					$name = str_replace($dirImg, '',$aImg[$i]);
					if(file_exists($dirImg.$aImg[$i].'.tb')) # On a une miniature
						echo '<img src="'.$dirImg.$aImg[$i].'.tb'.'" alt="'.$name.'"/><br />';
					else # Pas de miniatures
						echo '<span>'.$name.'</span><br />';
					# On affiche les différents liens
					echo '</p>';
					echo '<p class="thumb_link">';
					echo '<a href="'.$_SERVER['REQUEST_URI'].'&img='.rawurlencode($name).'"><img src="core/admin/img/eye.png" alt="Voir" title="Voir l\'image" /></a> ';
					
					
					echo '<a href="'.$_SERVER['REQUEST_URI'].'&del='.$i.'&hash='.$_SESSION['hash'].'" title="Supprimer l\'image" onclick="Check=confirm(\'Supprimer cette image ?\');if(Check==false) return false;"><img src="core/admin/img/delete.png" alt="Supprimer" /></a></p>
					<form method="post" action="'.$_SERVER['REQUEST_URI'].'&txt='.$name.'"><p>descriptif</p>';
					$lequel=explode('.',$name);
					$leg=$lequel[0];
					echo '<p><textarea id="desc'.$leg.'" name="desc'.$leg.'">';
					@include($dirImg.$aImg[$i].'.txt');
					echo '</textarea></p>
					<p><input type="submit" value="MAJ"/></p>
					</form>
					'
					;
					echo '</div></div>'."\n";
				}
			}
		?>
	<?php } # Fin else galerie 
	
} # FIN si !$album 
else {

///////////////////////////////////////////
# Suppression d'un repertoire
$dirImg='data/images/Album/';
if(isset($_GET['delrep']) AND !empty($_GET['hash']) AND $_GET['hash'] == $_SESSION['hash'] ) {
	# On supprime le repertoire
	if(!@rmdir($dirImg.trim($_GET['delrep']) )) # Erreur de suppression
		$msg = 'Impossible de supprimer cet Album (problème d\'écriture dans le dossier '.$dirImg.$_GET['delrep'].' , ou cet album n\'est pas vide)';
	else # Ok
		$msg = 'Album supprimée à '.date('H:m:s');
		if(!isset($_GET['oki'])) {
	header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
	exit;
}
}
///////////////////////////////////////////
echo '<h2> Crée un  Album </h2>
	<p>';
	(!empty($_GET['msg']))?plxUtils::showMsg(plxUtils::unSlash(urldecode(trim($_GET['msg'])))):''; echo '</p>';
echo '<form method="post" action="" >
<p><label for="new_album">Nom de l\'album a créer</label>
<input type="text" id="new_album" name="new_album" /></p>
<p><input type="submit" value="créer" /></p>
</form>
';
if (isset($_POST['new_album'])) {
			$dirDest=trim(plxUtils::title2filename(plxUtils::unSlash($_POST['new_album'])));
 			$old= umask();
			umask(0); 			
			mkdir('data/images/Album/'.$dirDest,0755);
			umask($old);
			$msg = 'Album  : '.$dirDest.' créer .';
		header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg));
	exit;
			}
}
/////////////////////////////////
echo '</div>
';
}

// fin test log admin

						// class  dir recursive .
class dirRecursif{
var $dir;
var $browsed;


function 	dirRecursif($dir) {

										$this->listee($dir);
									}
									
function 	listee($dir ) 	{
										if (is_dir($dir))
										{
										
										$hdir = opendir($dir);
										
										$album=0;
										  while ( $item = readdir($hdir) ) 
										  {
										  
										  	if($item=="." | $item=="..") continue;
											
											if ( !is_dir( $dir.'/'.$item ) ) 
													{
													#tri sur extension 
													$ext = array_reverse(explode(".", $item));
													$extfile= $ext[0];
														if (($extfile =='jpg' || $extfile =='JPG' || $extfile=='gif' || $extfile=='GIF' || $extfile=='png' || $extfile=='PNG'  ))
														{	
														$album++;
														$this->album_num=$album;
														
															// Répertoire => récursion
														  $this->browsed['file'][][$dir] = $item ;
														  $this->browsed['file'][][$dir]['num']=$album;
															// echo   '<p>'.$dir.'/'.$item.'</p>';
														   $this->listee( $dir.'/'.$item );
														  
														}
													}
											else 	{
											$this->browsed['dir'][][$dir] = $dir.$item ;
											//echo   '<p>'.$dir.'/'.$item.'</p>';
											$this->listee( $dir.$item );
													} 
											}
												closedir( $hdir );
										}
										return $this->browsed;
										}
										
function 	triliste($dir,$tri='file') {

					$this->browsed=$this->browsed[$tri];
					return $this->browsed;
			} //fin triliste()	
									
function  	liste_Tpl($dir,$tri='file',$tpl='link',$item) {
	#variable raccourcies pour relecture aisée
	$target=$this->browsed[$item][key($this->browsed[$item])];
//echo '<pre>';
//var_dump($this->browsed[$item+1][key($this->browsed[$item])]['num']);
//echo '</pre>';
		if ($tri=='file') {
					$way=key($this->browsed[$item]).'/'; 
					$alb_num=$this->browsed[$item+1][key($this->browsed[$item])]['num'];
					$em='<em style="display:block;font-size:.5em;">'.$way.'</em>';
				#filtre sur extension de fichier
					$filext = array_reverse(explode(".", $target));
					$extfile= $filext[0];
						if ($extfile =='jpg' || $extfile =='gif' ||  $extfile =='png')
							{
							$tpl=$tpl;	
							}
						else 
							{
							$tpl='skip';
							}
					
				}
		else 	{
					$way='';
					$em='';
				}

	#switch , choix du template d'affichage des résultats
	switch($tpl)
	            {
					case 'skip':
					break;
					
					case 'album':
					$legende=$way.$target.'.txt';
					echo '
					<div class="album"><div class="tampon">
						<h2>
							<a href="'.$way.$target.'" title="acceder à :'.$way.$target.'"  >
							<img src="'.$way.$target.'.tb" alt="illustration N° '.$alb_num.'" longdesc="'.$_SERVER['REQUEST_URI'].'#ill'.$alb_num.'" style="background:url('.$way.$target.');"  rel="'.$way.$target.'" /></a></h2>
						<div id="ill'.$alb_num.'" >';
						
						if(@!include($legende)) {echo 'images sans legende';}
						echo '</div>
					</div></div>';
					break;
	                case 'link' :
	                echo '<p><a href="'.$way.$target.'" title="acceder à :'.$way.$target.'"  >'.$target.'</a></p>';
	                break;
	                case 'linkdir' :
					$albLink=explode("&", $_SERVER['REQUEST_URI']);
					$al=$albLink[0];
					
					$gal = array_reverse(explode("/", $target));
	                echo '<p class="link_album"><span class="tampon"><a href="'.$al.'&galerie='.$gal[0].'" title="acceder à l\'Album  :'.$gal[0].'"  >'.$gal[0].'</a>';
					if ($this->mode_admin =='Actif') {echo' <a class="deleterep" href="'.$al.'&delrep='.$gal[0].'&hash='.$_SESSION['hash'].'" title="Supprimer l\'Album : '.$gal[0].'" onclick="Check=confirm(\'Supprimer cet Album ?\');if(Check==false) return false;"><img src="core/admin/img/delete.png" alt="Supprimer" /></a>';}
					echo '</span></p>';
	                break;

	                default :
	                echo '<p>'.$way.$target.'</p>';
	                break;
	            }// fin switch

}	// fin liste_Tpl()

function 	showliste($dir,$tri='file',$tpl='link',$mode_admin) 	{
	$this->mode_admin=$mode_admin;
	$this->triliste($dir,$tri);

	$ct=count($this->browsed);
	if ( ($ct>0) || (is_array($this->browsed))) {
		for ($i=0;$i<$ct;$i++)
			{
					$this->liste_Tpl($dir,$tri,$tpl,$i);
			}
		}
	else {
		echo '<p>Désolé, Aucun fichiers ou répertoire trouvé .</p>';
		}
		
}	// fin showliste();								
										
#########										
}// fin class 


if (isset($_GET['galerie'])) {

$album= preg_replace('/[\.\%\&\"\s\'\:\/\[\],_|#*$£=`\+]+/',' ',$_GET['galerie']);
$browse= new dirRecursif('data/images/Album/'.$album);
if ($mode_admin !='Actif') {
echo '<h3>Album :'.$album.' </h3>
<p>'.$browse->album_num .' Image(s) dans cet Album .</p>
<div class="post">';


$browse->showliste('data/images/Album/'.$album,'file','album',$mode_admin);
echo '</div>';
}
}
?>
<h3>Les Albums photos disponibles .</h3>
<div class="post"><?php
$browse2= new dirRecursif('data/images/Album/');
$browse2->showliste('data/images/Album/','dir','linkdir',$mode_admin);

?>
</div>
Cette page statique est devellobicolé sous une des première version de pluxml V4 que j'utilise en multiblog (http://gcyrillux.gcyrillus.com/?static3/album-photos) .

Peut-être que certaines fonctions de la dernière version de pluxml ont changé de nom (capital en minuscule ou vice versa dans la class plxutils )


Si vous voulez tester ou participer a l'amélioration de cette page statique , ne vous gênez pas :)

Bon Web :)

GC


Cordialement,
gcyrillus

Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Réponses

  • Salut, sympathique initiative, je suis en train de le tester, cependant un défaut (je ferais une review plus complète si tu veux) c'est le fait de ne pouvoir nommer chaque album photo à notre guise (c'est à dire qu'à la place des espaces il y a un tiret et les majuscules ne sont pas possibles) je pense que c'est par soucis de compatibilité, mais est-ce possible de mettre n'importe quel nom d'album ?

    Merci ;).
  • Bonjour,

    oui , les albums peuvent recevoir n'importe quel noms , cependant ,ceux-ci sont reformatés avec le gestionnaire de nom de fichier de pluxml (title2url() ) . Le nom de l'album est le nom du répertoire dans lequel se trouve les images .

    Pour ne pas soulever d'erreur (plxglob) , il est nescessaire de creer les repertoires Album et au moins un sous répertoire (nom arbitraire) . Il suffit d'en creer un autre puis d'effacer : album-1 :)

    Il n'est pas possible de les renommer , (sauf en renommant les dossiers par le FTP .)

    Seul un album vide de fichier peut-être effacer .

    Il n'y a qu'en passant ce gestionnaire directement dans pluxml , qu'il serait aisée , de renommer , de donner les noms que l'on veut aux albums en le lien a un fichier xml descriptif.

    Tant que Pluxml ne gerera pas les plug-ins , je ne chercherait pas a modifier les fichiers d'origines (comme j'ai pu le faire sur la V3 ) , les pages statiques sont suffisantes et marques justement une évolution intéressante , permettant de tester des ébauches de plugins et de découvrir des bug ou incompatibilités de script/fonctions.

    Encore une fois , je laisse a dispo un script créer pour mes besoins personnel et qui me sembler intéressant a partager .

    Ce script peut aussi servir a d'autre contenu , moyennant une modification des templates (ajout d'une option dans le switch a cet effet ) et des fichiers que l'on peut télécharger (sans se substituer non plus au gestionnaire de document .)

    D'ailleurs si le gestionnaire d'images pouvait gérer les dossiers et les légendes/descriptions des images , cette page statiques n'aurait pas lieu d'être , une partie de ce script pourrait-être intégrer au gestionnaire d'images.

    Ce script est un script de base donc , qui ne gère simplement les album en scannant les répertoires .

    nom d'album = nom de répertoire .(accent et caractéres spéciaux interdits )

    pour les images :
    miniatures = image.jpg.tb
    grandes images = image.jpg
    description = image.jpg.txt

    Chacun est libres d'y apportere ces modifications et de les partager :)

    GC


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • DeevadDeevad Member
    Ce script m'intéresse vivement et fonctionne facilement avec une V4 fraiche , j'envisage de le détourner pour en faire une page dans l'admin en fixe, tout en gardant un code d'inclusion dans une page statique qui permettrait "d'appeler un album" ( bref insérer automatiquement un lot de thumbnails )
    Si j'arrive à y mettre du temps ; je ferais remonter mes trouvailles ici. En tout cas merci pour cette base et pour la liberté que tu offres et avec laquelle tu présente son partage.
  • :) je t'en prie , je ne fait que suivre la licence de pluxml :)

    C'est en effet une base simple et le choix de l'administration de la page statique coté interface publique est volontaire , cela ne chamboule pas le code a l'occasion d'une mise a jour de pluxml .
    Ce n'est même pas de la fainéantise de ma part :) , c'est juste que je me suis attardé a ne faire qu'un truc de base qui ne touche pas a pluxml , qui n'a rien de web2 ou orienté réseau de tout genre :) ,
    en fait c'etait pour ma petite soeur a la base :) .

    Pour generer des thumbnails , la fonctions existe deja dans pluxml , en la couplant a un test recursif du repertoire genre : si images , et si image sans thumbnails alors faire le thumbnail (donc utile pour un upload massif par ftp :) ) on s'en sort sans avoir beaucoup de code et test a faire .
    ensuite et avec une variable en plus dans l'appe de la fonction , tu peut terminer effectivement en automatisant l'inclusion de tes thumbnails dans une page classique de pluxml ... au lieu d'avoir un bouton qui insere une image , il insere toutes les miniatures du repertoire :) . Je suis curieux de voir ta modification :)



    GC


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • maramamarama Member
    gcyrillus est heureux aujourd'hui vu le nb de :) ....
  • Un petit up, juste pour donner des news ; Alors j'ai fait beaucoup beaucoup de modif, et fait un gros mix entre ton script gcyrillus-nomade et celui de gok6tm ( http://forum.pluxml.org/viewtopic.php?id=1128 ) qui reprends images.php.
    En fait ;
    - j'ai conserver l'arborescence de gotk6tm et le confort d'utilisation dans l'admin par images.php
    - J'ai ajouter le champs de description de gcyrillus-nomade , qui enregistre sous le nomdefichierimage.jpg.txt la description.
    - J'ai reviser le thumnailing
    - J'ai modifier l'insert en javascript pour faire un code exploitable par une "lightbox" js ; ou je récupère aussi la description dans l'argument "title".

    Voilà, c'est assez gros bazard à mettre en place mais si il y a des intéressé je balance les sources.
  • Bonjour,

    bah ecoute oui , je suis interesser par ton adaptation , de mon coté , pour une version anterieur de pluxml , j'ai aussi readapter ma gallerie de façon a trier les images au drag & drop , avec la possibilté de les avoir publié ou non . basé sur un jquery et ajax , c'est assez sympa . Manque quand même la gestion de tri possible si pas de js (donc encore dans les cartons )
    Le jquery mis en place pourrait aussi servir au lighbox (ou alike) .

    Je reste encore dans l'idée d'une version en page statiques , independantes de pluxml pour ne pas y touché.

    GC


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • Je suis intéressé par une gestion "lightbox-like" en page statique. :)


    à plus,

    Gzyg
  • DeevadDeevad Member
    juillet 2009 modifié
    pluxml-image-patch.jpg
    PLop ! Désolé du délais ; pas mal de travail par ici :

    Alors pour ma gallerie : sous forme de Patch :
    http://david.revoy.free.fr/forums/pluxml/patch-pluxml4-1-image.zip

    voici le contenu du "readme" avec :
    Images gallery :
    Optimisé pour Pluxml 4.1 ; petit patch fait par Deevad
    d'après le mix d'un script de Gok6tm et de G.Cyrillus
    ( sans copyright toutefois ).

    ## Fichiers patché :
    core/admin/images.php
    core/lib/function.js
    + ajoute des images pour les thumbnails dans core/admin/

    ## Instalation :
    Copier le dossier core à la base de votre pluxml ; acceptez l'écrasement des fichiers.
    C'est patché !

    ## Utilisation :
    Permet de classer les images dans les dossiers et ajouter une description en texte simple.
    Permet d'ajouter des effets de lightbox pour les images.
    Optimisé pour Prettyphoto ; http://www.no-margin-for-errors.com/projects/prettyPhoto-jquery-lightbox-clone/


    ( pour ceux qui ont dans leur dossier theme un autre script ; editer le fichier core/lib/function.js , remplacer la balise de déclanchement de votre script d'affichage de photo
    ex : rel="prettyPhoto" par rel="lightbox" )

    Voilà, bon Patch ! Et sauvegarde avant tout, je ne suis pas responsable de gros bug sur vos données, même si ici j'ai testé mon joujou sur plusieurs "fresh install".

    David
    _____________________________________
    PS: pour l'antialias des thumbnails :
    editez class.plx.utils.php dans /core/lib/ et remplacer :
    imagecopyresized
    par
    imagecopyresampled
  • Je vais installer ça... merci. :)


    à plus,

    Gzyg
  • Gzyg a écrit:
    Je vais installer ça... merci. :)

    à plus,

    Gzyg
    Pour que l'effet de gallerie fonctionne n'oublie pas d'installer PrettyPhoto (copier les dossier css / img / js dans ton theme ) ;
    http://www.no-margin-for-errors.com/projects/prettyPhoto-jquery-lightbox-clone/

    Télécharger Jquery , ici je l'ai enregistrer dans le dossier "js" de mon theme et renommé "jquery.js"

    et dans ton dossier de theme ; dans header.php d'ajouter avant la balise "</head>
    <script src="<?php $plxShow->template(); ?>/js/jquery.js" type="text/javascript" charset="utf-8"></script>
    	<link rel="stylesheet" href="<?php $plxShow->template(); ?>/css/prettyPhoto.css" type="text/css" media="screen" charset="utf-8" />
    	<script src="<?php $plxShow->template(); ?>/js/jquery.prettyPhoto.js" type="text/javascript" charset="utf-8"></script>
    
    Voilà, et même en statique, tu devrais avoir l'effet souhaité.
  • Wow, c'est super de proposer tout ça! Ca ouvre pas mal de perspective ;)
    Je vais de ce pas sauvegarder/modifier mon site tout implémenter.
    Merci encore pour cette contribution, que cela marche ou pas pour moi :P
  • Oui j'ai déjà utilisé PrettyPhoto (et autres FancyZoom ou ThickBox que j'adore !), mais merci de la précision. ;)

    Un retour d'ici quelques jours...


    à plus,
    Gzyg
  • idem , retour aprés mon retour de vacances + quelques jours.

    Merci :)


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • Bonjour à tous. Ceci est mon premier post. Je suis encore un peu perdu avec ce blog qui me convient déjà très bien tel qu'il est.
    La possibilité de publier une galerie de photos de façon simple et sans avoir à utiliser le FTP(*) me séduirait énormément, mais vos explications m'effraient un petit peu. Il y a une chance que cela soit un jour intégré au blog d'origine ?
    P.S. Sur mon lieu de vacances, le spot Wi-Fi n'autorisait que le HTTP
  • Bonjour,

    en regle général , lorsqu'un script php se charge de redimensionné une photo , il faut au préalable "allégée" l'image a uploader.

    Une image en 1600X1200 avec 1 million de couleurs n'a d'interet que pour l'impression ou un travail en local , Pour le net ... le navigateur va d'abord diminuer la qualité de l'image avant de l'affiché , la reduire a la taille de la fenêtre .... bref telecharger 7 ou 8 mega ne sert a rien.

    Penser donc a reduire vos image a une taille d'ecran moyenne (largeur 1024 ou 800 de hauteur par exemple) et dimineur le nombre de couleur.

    Vos images seont ensuite un peu plus adapté a un usage web , plus rapide à telecharger et uploader , demandant des ressources moindres pour les scripts qui vont les redimensionner (generation de thumbnail) . les navigateurs, de toutes façon , sont limiter par la palette de couleur qu'il utiliserons (nombre de couleur) .

    Autant servir des le départ des images pas trop lourdes et garder vos originaux haute résolution au chaud a la maison.

    Le format jpg et bien adapté pour la photo , puis de nombreux logiciel permettent de traiter des dossiers complets d'un coup .

    une petite recherche sur les termes : rééchantillonnage images devrait vous aider.

    GC


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • vidub2001vidub2001 Member
    août 2009 modifié
    Bonjour,

    Je viens d'essayer le script de galerie standard comme donné au début du post et j'ai les erreurs suivantes sur la page statique d'affichage des albums quand je rentre dans un album :

    Notice: Array to string conversion in C:\wamp\www\data\statiques\003.album.php on line 317

    Notice: Undefined offset: 4 in C:\wamp\www\data\statiques\003.album.php on line 314

    Notice: Array to string conversion in C:\wamp\www\data\statiques\003.album.php on line 317

    Je fonctionne avec une 4.1.1

    Je vous remercie pour votre aide

    Cordialement
    Fabrice
  • août 2009 modifié
    bonsoir,



    Je n'ai pas cette erreur sur un 4.1.1 fraichement telecharger et un copier/coller du script ci-dessus .

    Ta page statique est-elle le copier/coller du premier post ?
    Si non , qu'as tu modifier ?

    pour info : ligne 314 a 317 du script ci dessus :
    $filext = array_reverse(explode(".", $target));
                        $extfile= $filext[0];
                            if ($extfile =='jpg' || $extfile =='gif' ||  $extfile =='png')
                                {
    
    Quel est la version de php utilisée ?
    L'erreur apparait-elle sitot que tu souhaite te servir de l'album ? Ou bien apparait-elle aprés que tu ais commencé a créer et modifier tes albums ?

    L'erreur apparait-elle aussi chez ton hebergeur (si tu en as un) ?

    GC

    P.S.
    @Deevad : je n'ai pas encore pris le temps de tester ta version


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • @Deevad : je n'ai pas encore pris le temps de tester ta version
    Plop ! no soucis ; je dois d'ailleurs me lancer à mettre à jour un 4.1 à 4.1.1 ; je dirais bientôt si la galerie tient le coup en 4.1.1
  • vidub2001vidub2001 Member
    août 2009 modifié
    Bonsoir,

    En fait gcyrillus-nomade, tu m'as mis sur la voie avec ta réponse

    En effet, cela vient de mon Wamp, en fait j'ai fait tous mes tests sur une ancienne version et là, je viens de passer à Wamp 2, version de PHP 5.2.6
    ET tout fonctionne sans erreur, avec le copier/coller du post
    ET sur mon hébergeur (OVH Plan 90) aussi tout est OK, je n'avais pas encore fait la mise à jour, car je migre de MyPluxml à Pluxml 4 ! :-)

    TOUTES mes excuses pour vous avoir fait cogité sur un faux problème !

    Merci pour votre aide et pour ce beau programme ! :-)

    Cordialement
    Fabrice
  • Okay :) , pas de soucis , tu me rassures .

    Je dois dire que le : " Notice: Array to string conversion" me mettait mal a l'aise .
    j'initialise rarement mes variables par defaut (=>warnings) et ne pense jamais a verifier ou tester le type d'une variable ... d'ou le doute qui m'a envahit jusqu'a ce que je teste dans le dernier pluxml .

    Bonne continuation.

    GC


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • avril 2023 modifié

    hou la la !! , le sujet est toujours récurrent et pour faire echo aux autre et https://forum.pluxml.org/discussion/7406/galerie-images-avec-textes (démarche astucieuse et fastidieuse pour les fainéants)

    je vous repropose ce script rebricolé pour passer dans une statique 5.8.9 , et inciter d'autre à proposer des solution beaucoup plus pertinente et actuelles .

    Ce script est partiellement repris pour fonctionner et démontrer son idée dans une page statique car les plugins n'existaient pas encore dans la version 4 de pluxml :) , l'adminiustration se fait depuis cette page statique si vous êtes connecté en tant qu'administrateur (ajout, retrait images ou galleries). Par défaut un repertoire album-1 est généré, vous pouvez en créer d'autre(s) avec des noms plus parlant puis effacé ce repertoire vide par défaut.

    La génértation de miniature avec son extension de l'image en .tb n'est, depuis longtemps, plus d'actualité, ce morceau du script est resté tel quel et obsolete.Le reste du script devrait fonctionner sans lever d'erreur et vous afficher vos differentes gallerie.

    Le css à aussi etait mis succintenement à jour sur un affichage en display:grid et flex .Voyez ça comme un POC , brodez dessus ou faites des suggestion si vous le trouver interessant. La structure HTML générée est probablement celle qui pourrait recevoir le plus grand nombre de suggestion, quant au code , lui aussi merite d'être réecrit et simplifier en s'assurant de ne pas ouvrir une faille à un quelquonque hacker.

    donc, voici le script modifier brutalement pour fonctionner avec la 5.8.9 et une version de PHP récente :
    MAJ: ré-indentation + nb images dans albums en liens

    <?php
        /**
            * page statique de gestion d'albums photos
            * 04/2009 - update 04/2023
            * @package PLX => page statique : fonctions : création , suppession d'album d'images
            * @author   Gcyrillus , gestion d'uploads et des noms de repertoires/fichiers sur  la base de Pluxml de florent monthel
        **/
    
        // Creation des repertoires de travail si absent 
    
        if (!file_exists(realpath('./data/images/Album'))) {
            mkdir(PLX_ROOT.'/data/images/Album/Album-1', 0777, true);           
        }   
    
        $msg='';    
        // fin test existence repertoire Album 
        //include_once(PLX_CORE.'lib/class.plx.admin.php');
        include_once PLX_ROOT . 'core/lib/class.plx.glob.php';  
        // reconstruction de l'url d'entrée (pour retour liste cat et formulaire
        $geturl = explode("?", $_SERVER['REQUEST_URI']);
        $redourl='';
        for($i=1;$i < count($geturl);$i++) {
            $redourl .=$geturl[$i];
        }
        $topurl = explode("&", $redourl);   
        $finalurl = $topurl[0]; 
    
        // reconstruction url pour album
        $albLink=explode("&", $_SERVER['REQUEST_URI']);
        $albums=$albLink[0];
    
        // admin inactif par defaut 
    
    
    
    
        if (!empty($_POST)) {
            plxUtils::unSlash($_POST);
        }
        if (!empty($_GET)) {
            plxUtils::unSlash($_GET);
        }   
    
        // test si logger en administrateur 
        # On démarre la session
        //session_start();
    
    
        //error_reporting(E_ALL  & ~E_DEPRECATED);      
    
        # Test sur l'identification
        if(isset($_SESSION['profil']) and $_SESSION['profil'] == '0') {
            $mode_admin='Actif';
            // form du choix d'edition 
            echo '<div id="admin">
            <h1>MODE ADMINISTRATEUR</h1>
            <p><i>(supression d\'album vide uniquement possible.)</i></p>
    
            ';
            ////////////////////////////////////
    
    
            # Variables pour le redimensionnement
            $width = 200;
            $height = 100;
            $quality = 80;
            if (isset($_GET['galerie'])) {
                $album= preg_replace('/[\.\%\&\"\s\'\:\/\[\],_|#*$£=`\+]+/',' ',$_GET['galerie']);
            }
            if(!isset($album)) $album="Album-1";
            # Récupération des images du dossier
    
            $dirImg = './data/images/Album/'.$album.'/';
    
            $plxImg =  plxGlob::getInstance($dirImg,false,true,'');
    
            $aImg = $plxImg->query('/(.+).(gif|jpg|jpeg|png|swf|swc|psd|tiff|bmp|iff|jp2|jpx|jb2|jpc|xbm|wbmp)$/i');
            # Suppression d'une image
            if(isset($_GET['del']) AND !empty($_GET['hash']) AND $_GET['hash'] == $_SESSION['hash'] AND isset($aImg[ $_GET['del'] ]) AND file_exists($dirImg.$aImg[ $_GET['del'] ])) {
                # On supprime l'image et sa miniature
                if(!@unlink($dirImg.$aImg[ $_GET['del'] ])) # Erreur de suppression
                $msg = 'Impossible de supprimer l\'image (problème d\'écriture dans le dossier '.$dirImg.')';
                else # Ok
                $msg = 'Image supprimée à '.date('H:m:s');
                @unlink($dirImg.$aImg[ $_GET['del'] ].'.tb');
                @unlink($dirImg.$aImg[ $_GET['del'] ].'.txt');
                if(!isset($_GET['oki'])) {
                    header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
                    exit;
                }
            }
    
            #MISE AJOUR D'UNE DESCRIPTION
    
    
            if(isset($_GET['txt']))
            {
                $id=$_GET['txt'];
                $fichier_legend=$dirImg.$id.'.txt';
                $poster=explode('.',$id);
                $postlegend ='desc'.$poster[0];
                $f_legende=stripslashes($_POST[$postlegend]);
                $flegende=fopen("$fichier_legend","w+");
                fputs($flegende,$f_legende); 
                fclose($flegende);
                $msg .= '<br />Descriptif mis a jour';
                if(!isset($_GET['oki'])) {
                    header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
                    exit;
                }
            }
    
    
            # Envoi d'une image
            if(!empty($_FILES) AND !empty($_FILES['img']['name'])) {
                # On teste l'existence de l'image et on formate le nom du fichier
                $i = 0;
                $upFile = $dirImg.plxUtils::title2filename(plxUtils::unSlash(basename($_FILES['img']['name'])));
                while(file_exists($upFile)) {
                    $upFile = $dirImg.$i.plxUtils::title2filename(plxUtils::unSlash(basename($_FILES['img']['name'])));
                    $i++;
                }
                if(getimagesize($_FILES['img']['tmp_name'])) { # C'est une image
                    if(!@move_uploaded_file($_FILES['img']['tmp_name'],$upFile)) { # Erreur de copie
                        $msg = 'Impossible d\'envoyer l\'image (problème d\'écriture dans le dossier '.$dirImg.')';
                        } else { # Ok
                        @plxUtils::makeThumb($upFile, $upFile.'.tb',$width,$height,$quality);
                        $msg = 'Image envoyée à '.date('H:m:s');
                        if(!empty($_POST['descriptif'])){
                            $fichier_legend =$upFile.".txt";
                            $f_legende=fopen("$fichier_legend","w+");
                            fputs($f_legende,stripslashes($_POST['descriptif'])); 
                            fclose($f_legende);
                            $msg .= ' et descriptif enregistré';
                        }
                    }
                    } else { # Ce n'est pas une image
                    $msg = 'Le fichier n\'est pas une image';
                }
                header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg));
                exit;
    
            }
    
            /////////////////////////////////
    
            if (!$album =='') { ?>
            <h2>Uploader et gérer les images pour : <?php echo $album ; ?></h2>
            <p><?php (!empty($_GET['msg']))?plxUtils::showMsg(plxUtils::unSlash(urldecode(trim($_GET['msg'])))):''; ?></p>
            <?php if(!empty($_GET['img']) AND file_exists($dirImg.plxUtils::unSlash(rawurldecode($_GET['img'])))) { # Image particulière ?>
    
                <img src="<?php echo $dirImg.plxUtils::unSlash(rawurldecode($_GET['img'])); ?>" alt="" />
                <?php } else { # Galerie ?>
                <form enctype="multipart/form-data" action="" method="post">
                    <fieldset class="withlabel">
                        <legend>Upload d'images</legend>
                        <p><input name="img" type="file" /></p>
                        <p><label for="descriptif">Légende de l'image</label>
                        <textarea name="descriptif" id="descriptif" />Descrition de l'image ...</textarea></p>
                <input type="submit" value="envoyer" /></p>
            </fieldset>
        </form>
        <h2>Album editable : <big><?php echo $album; ?></big></h2>
        <?php
            if (!$aImg) { # Aucune image
                echo 'Aucune image';
                } else { # On affiche les images
                $nb = count($aImg);
                for($i=0; $i < $nb; $i++) {
                    echo '<div class="album"><div class="tampon"><p class="thumb">';
                    $name = str_replace($dirImg, '',$aImg[$i]);
                    if(file_exists($dirImg.$aImg[$i].'.tb')) # On a une miniature
                    echo '<img src="'.$dirImg.$aImg[$i].'.tb'.'" alt="'.$name.'"/><br />';
                    else # Pas de miniatures
                    echo '<img src="'.$dirImg.$aImg[$i].'" alt="'.$name.'" style="width:200px;"/><br />';
                    # On affiche les différents liens
                    echo '</p>';
                    echo '<p class="thumb_link">';
                    echo '<a href="'.$_SERVER['REQUEST_URI'].'&img='.rawurlencode($name).'"><img src="core/admin/img/eye.png" alt="Voir" title="Voir l\'image" /></a> ';
    
    
                    echo '<a href="'.$_SERVER['REQUEST_URI'].'&del='.$i.'&hash='.$_SESSION['hash'].'" title="Supprimer l\'image" onclick="Check=confirm(\'Supprimer cette image ?\');if(Check==false) return false;"><img src="core/admin/img/delete.png" alt="Supprimer" /></a></p>
                    <form method="post" action="'.$_SERVER['REQUEST_URI'].'&txt='.$name.'"><p>descriptif</p>';
                    $lequel=explode('.',$name);
                    $leg=$lequel[0];
                    echo '<p><textarea id="desc'.$leg.'" name="desc'.$leg.'">';
                    @include($dirImg.$aImg[$i].'.txt');
                    echo '</textarea></p>
                    <p><input type="submit" value="MAJ"/></p>
                    </form>
                    '
                    ;
                    echo '</div></div>'."\n";
                }
            }
        ?>
        <?php } # Fin else galerie 
    
    } # FIN si !$album 
    else {
    
        ///////////////////////////////////////////
        # Suppression d'un repertoire
        $dirImg='data/images/Album/';
        if(isset($_GET['delrep']) AND !empty($_GET['hash']) AND $_GET['hash'] == $_SESSION['hash'] ) {
            # On supprime le repertoire
            if(!@rmdir($dirImg.trim($_GET['delrep']) )) # Erreur de suppression
            $msg = 'Impossible de supprimer cet Album (problème d\'écriture dans le dossier '.$dirImg.$_GET['delrep'].' , ou cet album n\'est pas vide)';
            else # Ok
            $msg = 'Album supprimée à '.date('H:m:s');
            if(!isset($_GET['oki'])) {
                header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
                exit;
            }
        }
        ///////////////////////////////////////////
    
    
    }
    /////////////////////////////////
    
    echo '<h2> Crée un  Album </h2>
    <p>';
    (!empty($_GET['msg']))?plxUtils::showMsg(plxUtils::unSlash(urldecode(trim($_GET['msg'])))):''; echo '</p>';
    echo '<form method="post" action="" >
    <p><label for="new_album">Nom de l\'album a créer</label>
    <input type="text" id="new_album" name="new_album" /></p>
    <p><input type="submit" value="créer" /></p>
    </form>
    ';
    if (isset($_POST['new_album'])) {
        $dirDest=trim(plxUtils::title2filename(plxUtils::unSlash($_POST['new_album'])));
        $old= umask();
        umask(0);           
        mkdir('data/images/Album/'.$dirDest,0755);
        umask($old);
        $msg = 'Album  : '.$dirDest.' créer .';
        header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg));
        exit;
    }
    echo '</div>
    ';
    }
    else {$mode_admin="InActif";}
    // fin test log admin
    
    // class  dir recursive .
    class dirRecursif{
        var $dir;
        var $browsed;
    
        function    __construct($dir) {
            if($dir!=''){
                $this->listee($dir);
            }
        }
    
        function    listee($dir )   {
            if (is_dir($dir))
            {
    
                $hdir = opendir($dir);
    
                $album=0;
                $this->album_num=$album;
                while ( $item = readdir($hdir) ) 
                {
    
                    if($item=="." | $item=="..") continue;
    
                    if ( !is_dir( $dir.'/'.$item ) ) 
                    {
                        #tri sur extension 
                        $ext = array_reverse(explode(".", $item));
                        $extfile= $ext[0];
                        if (($extfile =='jpg' || $extfile =='JPG' || $extfile=='gif' || $extfile=='GIF' || $extfile=='png' || $extfile=='PNG'  ))
                        {   
                            $album++;
                            $this->album_num=$album;
    
                            // Répertoire => récursion
                            $this->browsed['file'][][$dir] = $item ;
                            $this->browsed['file'][][$dir]['num']=$album;
                            //echo   '<p>'.$dir.'/'.$item.'</p>';
                            $this->listee( $dir.'/'.$item );
    
                        }
                    }
                    else    {
                        $this->browsed['dir'][][$dir] = $dir.$item ;
                        //echo   '<p>'.$dir.'/'.$item.'</p>';
                        $this->listee( $dir.$item );
                    } 
                }
                closedir( $hdir );
            }
            return $this->browsed;
        }
    
        function    triliste($dir,$tri='file') {
    
            $this->browsed=$this->browsed[$tri];
            return $this->browsed;
        } //fin triliste()  
    
        function    liste_Tpl($dir,$tri='file',$tpl='link',$item='') {
            #variable raccourcies pour relecture aisée
            $target=$this->browsed[$item][key($this->browsed[$item])];
            //echo '<p>target :'.$target.'</p>';
            if ($tri=='file') {
                $way=key($this->browsed[$item]).'/'; 
                if(!is_array($target)) {
                    $alb_num=$this->browsed[$item+1][key($this->browsed[$item])]['num'];
                }
                $em='<em style="display:block;font-size:.5em;">'.$way.'</em>';
                #filtre sur extension de fichier
                $filext = pathinfo(serialize($target), PATHINFO_EXTENSION);
                $extfile= $filext;
                if ($extfile =='jpg' || $extfile =='gif' ||  $extfile =='png'||  $extfile =='txt')
                {
                    $tpl=$tpl;  
                }
                else 
                {
                    if(is_array($target)) {
                        $tpl='skip';
                    }
                }
    
            }
            else    {
                $way='';
                $em='';
            }
    
            #switch , choix du template d'affichage des résultats
            switch($tpl)
            {
                case 'skip':
                break;
    
                case 'album':
                if(!is_array($target)) {
                    $legende=$way.$target.'.txt';
                    echo '
                    <div class="album"><div class="tampon">
                    <h2>
                    <a href="'.$way.$target.'" title="acceder à :'.$way.$target.'"  >
                    <img src="'.$way.$target.'" alt="illustration N° '.$alb_num.'" longdesc="'.$_SERVER['REQUEST_URI'].'#ill'.$alb_num.'" style="background:url('.$way.$target.');"  rel="'.$way.$target.'" /></a></h2>
                    <div id="ill'.$alb_num.'" >';
    
                    if(@!include($legende)) {echo 'images sans legende';}
                    echo '</div>
                    </div></div>';
                }
                break;
    
                case 'link' :
                echo '<p><a href="'.$way.$target.'" title="acceder à :'.$way.$target.'"  >'.$target.'</a></p>';
                break;
    
                case 'linkdir' :
                $albLink=explode("&", $_SERVER['REQUEST_URI']);
                $al=$albLink[0];
                $gal = array_reverse(explode("/", $target));
                $browsed= new dirRecursif('data/images/Album/'.$gal[0]);
                echo '<p class="link_album"><span class="tampon"><a href="'.$al.'&galerie='.$gal[0].'" title="acceder à l\'Album  :'.$gal[0].'"  >'.$gal[0].' <small>('.$browsed->album_num.' Image(s)</small></a>';
                if ($this->mode_admin =='Actif') {echo' <a class="deleterep" href="'.$al.'&delrep='.$gal[0].'&hash='.$_SESSION['hash'].'" title="Supprimer l\'Album : '.$gal[0].'" onclick="Check=confirm(\'Supprimer cet Album ?\');if(Check==false) return false;"><img src="core/admin/img/delete.png" alt="Supprimer" /></a>';}
                echo '</span></p>';
                break;
    
                default :
                echo '<p>'.$way.$target.'</p>';
                break;
            }// fin switch
    
        }   // fin liste_Tpl()
    
        function    showliste($dir,$tri='file',$tpl='link',$mode_admin='')  {
            $this->mode_admin=$mode_admin;
            $this->triliste($dir,$tri);
    
            if (is_array($this->browsed)) {$ct=count($this->browsed);}else {$ct=0;}
            if ( ($ct>0) || (is_array($this->browsed))) {
                for ($i=0;$i<$ct;$i++)
                {
                    $this->liste_Tpl($dir,$tri,$tpl,$i);
                }
            }
            else {
                echo '<p>Désolé, Aucun fichiers ou répertoire trouvé .</p>';
            }
    
        }   // fin showliste();                             
    
        #########                                       
    }// fin class 
    
    
    if (isset($_GET['galerie'])) {
    
        $album= preg_replace('/[\.\%\&\"\s\'\:\/\[\],_|#*$£=`\+]+/',' ',$_GET['galerie']);
        $browse= new dirRecursif('data/images/Album/'.$album);
        if ($mode_admin !='Actif') {
            echo '<h3>Album :'.$album.' </h3>
            <p>'.$browse->album_num .' Image(s) dans cet Album .</p>
            <div class="post">';
    
            if ($browse->album_num >0 ) $browse->showliste('data/images/Album/'.$album,'file','album',$mode_admin);
    
            echo '</div>';
        }
    }
    ?>
    <h3>Les Albums photos disponibles .</h3>
    <div class="post"><?php
        $browse2= new dirRecursif('data/images/Album/');
        $browse2->showliste('data/images/Album/','dir','linkdir',$mode_admin);
    
    ?>
    </div>
    <style>#admin,
        #admin > form,
        #admin form fieldset {
        border: solid 1px;
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        text-align: center;
        gap: 1em;
        }
        #admin h1,
        #admin > p:first-of-type,
        #admin h2,
        #admin form,
        legend,
        [type="submit"] {
        grid-column: 1/-1;
        margin: 0 auto 0.5em;
        padding: 0 0.25em;
        }
        #admin fieldset {
        margin: 1em;
        padding: 0.5em;
        grid-column: 1/-1;
        }
        #admin p:empty {
        display: none;
        }
    
        .tampon {
        height: 100%;
        display: flex;
        flex-direction: column;
        }
        .thumb {
        margin: auto;
        }
    
        /* VISITEUR */
        article h3{
        font-weight:bold;
        font-size:1.25em;
        }
        .post,
        .post .tampon {
        display: grid;
        gap: 0.5em;
        }
        .post {
        grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
        }
        .album {
        border: solid 1px;
        text-align: center;
        }
        .post .tampon {
        grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
        gap: 0.5em;
        align-items: center;
        }
        .post img {
        width: 90%;
        max-width: 250px;
        aspect-ratio: 1/1;
        object-fit: scale-down;
        box-shadow: inset 0 0 0 510px rgba(0, 0, 0, 0.5);
        background-size: 200% auto !important;
        }
        </style>    
    

    NE pas oublié de doublé touts les \ si le script est inclus via l'administration de pluxml. :)

    EDIT une version pour free en php 5.6

    cliquer ici pour le code sur hebergement free/ php 5.6
    <?php if (!defined('PLX_ROOT')) exit; ?>
    <?php
    /**
     * page statique de gestion d'albums photos
     * 04/2009 => MAj pour hebergement free 04/2023
     * @package PLX => page statique : fonctions : création , suppession d'album d'images
     * @author  Gcyrillus , gestion d'uploads et des noms de repertoires/fichiers sur  la base de Pluxml de florent monthel
     **/
    
    // Creation des repertoires de travail si absent 
        if (!file_exists(realpath('./data/images/Album'))) {
            mkdir(PLX_ROOT.'/data/images/Album/Album-1', 0777, true);           
        }
    // fin test existence repertoire Album 
        include_once PLX_ROOT . 'core/lib/class.plx.glob.php';
    $albums ='';
    $mode_admin='InActif';  
    // reconstruction de l'url d'entrée (pour retour liste cat et formulaire
    $geturl = explode("?", $_SERVER['REQUEST_URI']);
    $redourl='';
    for($i=1;$i < count($geturl);$i++) {
    $redourl .=$geturl[$i];
            }
    $topurl = explode("&", $redourl);   
    $finalurl = $topurl[0]; 
    
    // reconstruction url pour album
    $albLink=explode("&", $_SERVER['REQUEST_URI']);
    $albums=$albLink[0];
    
    // admin inactif par defaut 
    
    
    
    
    if (!empty($_POST)) {
        plxUtils::unSlash($_POST);
    }
    if (!empty($_GET)) {
        plxUtils::unSlash($_GET);
    }   
    
    // test si logger en administrateur 
        # Test sur l'identification
        if(isset($_SESSION['profil']) and $_SESSION['profil'] == '0' and $_SESSION['user'] == '001' /*section à retirer ou commenter */and $_SESSION['user'] == '001'/* fin section à retirer , decommenter, sauf si plugin demo activer */)
     {
    $mode_admin='Actif';
    // form du choix d'edition 
    echo '<div id="admin">
        <h1>MODE ADMINISTRATEUR</h1>
        <p><i>(supression d\'album vide uniquement possible.)</i></p>
    
    ';
    ////////////////////////////////////
    
    
    # Variables pour le redimensionnement
    $width = 200;
    $height = 100;
    $quality = 80;
    if (isset($_GET['galerie'])) {
    $album= preg_replace('/[\.\%\&\"\s\'\:\/\[\],_|#*$£=`\+]+/',' ',$_GET['galerie']);
    }
    # Récupération des images du dossier
    if(!isset($album)) {$album='';} else {$album='/'.$album;}
            $dirImg = PLX_ROOT.'/data/images/Album'.$album.'/';
    
            $plxImg =  plxGlob::getInstance($dirImg,false,true,'');
    
    $aImg = $plxImg->query('/(.+).(gif|jpg|jpeg|png|swf|swc|psd|tiff|bmp|iff|jp2|jpx|jb2|jpc|xbm|wbmp)$/i');
    # Suppression d'une image
    if(isset($_GET['del']) AND !empty($_GET['hash']) AND $_GET['hash'] == $_SESSION['hash'] AND isset($aImg[ $_GET['del'] ]) AND file_exists($dirImg.$aImg[ $_GET['del'] ])) {
        # On supprime l'image et sa miniature
        if(!@unlink($dirImg.$aImg[ $_GET['del'] ])) # Erreur de suppression
            $msg = 'Impossible de supprimer l\'image (problème d\'écriture dans le dossier '.$dirImg.')';
        else # Ok
            $msg = 'Image supprimée à '.date('H:m:s');
        //@unlink($dirImg.$aImg[ $_GET['del'] ].'.tb');
            @unlink($dirImg.$aImg[ $_GET['del'] ].'.txt');
            if(!isset($_GET['oki'])) {
        header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
        exit;
    }
    }
    
    #MISE AJOUR D'UNE DESCRIPTION
    
    
    if(isset($_GET['txt']))
                {
                $id=$_GET['txt'];
                $fichier_legend=$dirImg.$id.'.txt';
                $poster=explode('.',$id);
                $postlegend ='desc'.$poster[0];
                $f_legende=stripslashes($_POST[$postlegend]);
                    $flegende=fopen("$fichier_legend","w+");
                    fputs($flegende,$f_legende); 
                    fclose($flegende);
                    $msg .= '<br />Descriptif mis a jour';
            if(!isset($_GET['oki'])) {
        header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
        exit;
                    }
                    }
    
    
    # Envoi d'une image
    if(!empty($_FILES) AND !empty($_FILES['img']['name'])) {
        # On teste l'existence de l'image et on formate le nom du fichier
        $i = 0;
        $upFile = $dirImg.plxUtils::title2filename(plxUtils::unSlash(basename($_FILES['img']['name'])));
        while(file_exists($upFile)) {
            $upFile = $dirImg.$i.plxUtils::title2filename(plxUtils::unSlash(basename($_FILES['img']['name'])));
            $i++;
        }
        if(getimagesize($_FILES['img']['tmp_name'])) { # C'est une image
            if(!@move_uploaded_file($_FILES['img']['tmp_name'],$upFile)) { # Erreur de copie
                $msg = 'Impossible d\'envoyer l\'image (problème d\'écriture dans le dossier '.$dirImg.')';
            } else { # Ok
                //@plxUtils::makeThumb($upFile, $upFile.'.tb',$width,$height,$quality);
                $msg = 'Image envoyée à '.date('H:m:s');
                            if(!empty($_POST['descriptif'])){
                                $fichier_legend =$upFile.".txt";
                                $f_legende=fopen("$fichier_legend","w+");
                                fputs($f_legende,stripslashes($_POST['descriptif'])); 
                                fclose($f_legende);
                                $msg .= ' et descriptif enregistré';
                            }
            }
        } else { # Ce n'est pas une image
            $msg = 'Le fichier n\'est pas une image';
        }
            header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg));
        exit;
    
    }
    
    /////////////////////////////////
    ?>
    <?php
    if (!$album =='') { ?>
    <h2>Uploader et gérer les images pour : <?php echo $album ; ?></h2>
        <p><?php (!empty($_GET['msg']))?plxUtils::showMsg(plxUtils::unSlash(urldecode(trim($_GET['msg'])))):''; ?></p>
        <?php if(!empty($_GET['img']) AND file_exists($dirImg.plxUtils::unSlash(rawurldecode($_GET['img'])))) { # Image particulière ?>
    
            <img src="<?php echo $dirImg.plxUtils::unSlash(rawurldecode($_GET['img'])); ?>" alt="" />
        <?php } else { # Galerie ?>
            <form enctype="multipart/form-data" action="" method="post">
                <fieldset class="withlabel">
                    <legend>Upload d'images</legend>
                    <p><input name="img" type="file" /></p>
                    <p><label for="descriptif">Légende de l'image</label>
                    <textarea name="descriptif" id="descriptif" />Descrition de l'image ...</textarea></p>
                    <input type="submit" value="envoyer" /></p>
                </fieldset>
            </form>
            <h2>Album editable : <big><?php echo $album; ?></big></h2>
            <?php
                if (!$aImg) { # Aucune image
                    echo 'Aucune image';
                } else { # On affiche les images
                    $nb = count($aImg);
                    for($i=0; $i < $nb; $i++) {
                        echo '<div class="album"><div class="tampon"><p class="thumb">';
                        $name = str_replace($dirImg, '',$aImg[$i]);
                        if(file_exists($dirImg.$aImg[$i].'.tb')) # On a une miniature
                            echo '<img src="'.$dirImg.$aImg[$i].'.tb'.'" alt="'.$name.'"/><br />';
                        else # Pas de miniatures
                            echo '<img src="'.$dirImg.$aImg[$i].'" style="width:200px"" alt="'.$name.'"/><br />';
                        # On affiche les différents liens
                        echo '</p>';
                        echo '<p class="thumb_link">';
                        echo '<a href="'.$_SERVER['REQUEST_URI'].'&img='.rawurlencode($name).'"><img src="core/admin/img/eye.png" alt="Voir" title="Voir l\'image" /></a> ';
    
    
                        echo '<a href="'.$_SERVER['REQUEST_URI'].'&del='.$i.'&hash='.$_SESSION['hash'].'" title="Supprimer l\'image" onclick="Check=confirm(\'Supprimer cette image ?\');if(Check==false) return false;"><img src="core/admin/img/delete.png" alt="Supprimer" /></a></p>
                        <form method="post" action="'.$_SERVER['REQUEST_URI'].'&txt='.$name.'"><p>descriptif</p>';
                        $lequel=explode('.',$name);
                        $leg=$lequel[0];
                        echo '<p><textarea id="desc'.$leg.'" name="desc'.$leg.'">';
                        @include($dirImg.$aImg[$i].'.txt');
                        echo '</textarea></p>
                        <p><input type="submit" value="MAJ"/></p>
                        </form>
                        '
                        ;
                        echo '</div></div>'."\n";
                    }
                }
            ?>
        <?php } # Fin else galerie 
    } # FIN si !$album 
    else {
    
    ///////////////////////////////////////////
    # Suppression d'un repertoire
    $dirImg='data/images/Album/';
    if(isset($_GET['delrep']) AND !empty($_GET['hash']) AND $_GET['hash'] == $_SESSION['hash'] ) {
        # On supprime le repertoire
        if(!@rmdir($dirImg.trim($_GET['delrep']) )) # Erreur de suppression
            $msg = 'Impossible de supprimer cet Album (problème d\'écriture dans le dossier '.$dirImg.$_GET['delrep'].' , ou cet album n\'est pas vide)';
        else # Ok
            $msg = 'Album supprimée à '.date('H:m:s');
            if(!isset($_GET['oki'])) {
        header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg).'&oki=duck');
        exit;
    }
    }
    ///////////////////////////////////////////
    echo '<h2> Crée un  Album </h2>
        <p>';
        (!empty($_GET['msg']))?plxUtils::showMsg(plxUtils::unSlash(urldecode(trim($_GET['msg'])))):''; echo '</p>';
    echo '<form method="post" action="" >
    <p><label for="new_album">Nom de l\'album a créer</label>
    <input type="text" id="new_album" name="new_album" /></p>
    <p><input type="submit" value="créer" /></p>
    </form>
    ';
    if (isset($_POST['new_album'])) {
                $dirDest=trim(plxUtils::title2filename(plxUtils::unSlash($_POST['new_album'])));
                $old= umask();
                umask(0);           
                mkdir('data/images/Album/'.$dirDest,0755);
                umask($old);
                $msg = 'Album  : '.$dirDest.' créer .';
            header('Location:'.$_SERVER['REQUEST_URI'].'&msg='.urlencode($msg));
        exit;
                }
    }
    /////////////////////////////////
    echo '</div>
    ';
    }
    
    // fin test log admin
    
                            // class  dir recursive .
    class dirRecursif{
    var $dir;
    var $browsed;
    var $album=0;
    
    
    function    dirRecursif($dir) {
    
                                            $this->listee($dir);
                                        }
    
    function    listee($dir )   {
                                            if (is_dir($dir))
                                            {
    
                                            $hdir = opendir($dir);
    
                                            $album=0;
                                              while ( $item = readdir($hdir) ) 
                                              {
    
                                                if($item=="." | $item=="..") continue;
    
                                                if ( !is_dir( $dir.'/'.$item ) ) 
                                                        {
                                                        #tri sur extension 
                                                        $ext = array_reverse(explode(".", $item));
                                                        $extfile= $ext[0];
                                                            if (($extfile =='jpg' || $extfile =='JPG' || $extfile=='gif' || $extfile=='GIF' || $extfile=='png' || $extfile=='PNG'  ))
                                                            {   
                                                            $album++;
                                                            $this->album_num=$album;
    
                                                                // Répertoire => récursion
                                                              $this->browsed['file'][][$dir] = $item ;
                                                              $this->browsed['file'][][$dir]['num']=$album;
                                                                // echo   '<p>'.$dir.'/'.$item.'</p>';
                                                               $this->listee( $dir.'/'.$item );
    
                                                            }
                                                        }
                                                else    {
                                                $this->browsed['dir'][][$dir] = $dir.$item ;
                                                //echo   '<p>'.$dir.'/'.$item.'</p>';
                                                $this->listee( $dir.$item );
                                                        } 
                                                }
                                                    closedir( $hdir );
                                            }
                                            return $this->browsed;
                                            }
    
    function    triliste($dir,$tri='file') {
    
                        $this->browsed=$this->browsed[$tri];
                        return $this->browsed;
                } //fin triliste()  
    
    function    liste_Tpl($dir,$tri='file',$tpl='link',$item) {
        #variable raccourcies pour relecture aisée
        $target=$this->browsed[$item][key($this->browsed[$item])];
    //echo '<pre>';
    //var_dump($this->browsed[$item+1][key($this->browsed[$item])]['num']);
    //echo '</pre>';
            if ($tri=='file') {
                        $way=key($this->browsed[$item]).'/'; 
                if(!is_array($target)) {
                $alb_num=$this->browsed[$item+1][key($this->browsed[$item])]['num'];
                }
                        $em='<em style="display:block;font-size:.5em;">'.$way.'</em>';
                    #filtre sur extension de fichier
                $filext = pathinfo(serialize($target), PATHINFO_EXTENSION);
                $extfile= $filext;
                            if ($extfile =='jpg' || $extfile =='gif' ||  $extfile =='png')
                                {
                                $tpl=$tpl;  
                                }
                            else 
                                {
                                //$tpl='skip';
                                }
    
                    }
            else    {
                        $way='';
                        $em='';
                    }
    
        #switch , choix du template d'affichage des résultats
        switch($tpl)
                    {
                        case 'skip':
                        break;
    
                        case 'album':
                if(!is_array($target)) {
                $legende=$way.$target.'.txt';
                echo '
                <div class="album"><div class="tampon">
                <h2>
                <a href="'.$way.$target.'" title="acceder à :'.$way.$target.'"  >
                <img src="'.$way.$target.'" alt="illustration N° '.$alb_num.'" longdesc="'.$_SERVER['REQUEST_URI'].'#ill'.$alb_num.'" style="background:url('.$way.$target.');"  rel="'.$way.$target.'" /></a></h2>
                <div id="ill'.$alb_num.'" >';
    
                if(@!include($legende)) {echo 'images sans legende';}
                echo '</div>
                </div></div>';
                }
                        break;
                        case 'link' :
                        echo '<p><a href="'.$way.$target.'" title="acceder à :'.$way.$target.'"  >'.$target.'</a></p>';
                        break;
                        case 'linkdir' :
                        $albLink=explode("&", $_SERVER['REQUEST_URI']);
                        $al=$albLink[0];
    
                        $gal = array_reverse(explode("/", $target));
                        $browsed= new dirRecursif('data/images/Album/'.$gal[0]);
                         if(isset($browsed->album_num)) $num_img = $browsed->album_num; else $num_img ='0';
                        echo '<p class="link_album"><span class="tampon"><a href="'.$al.'&galerie='.$gal[0].'" title="acceder à l\'Album  :'.$gal[0].'"  >'.$gal[0].' <small>('.$num_img.' Image(s)</small></a>';
                        if ($this->mode_admin =='Actif') {echo' <a class="deleterep" href="'.$al.'&delrep='.$gal[0].'&hash='.$_SESSION['hash'].'" title="Supprimer l\'Album : '.$gal[0].'" onclick="Check=confirm(\'Supprimer cet Album ?\');if(Check==false) return false;"><img src="core/admin/img/delete.png" alt="Supprimer" /></a>';}
                        echo '</span></p>';
                        break;
    
                        default :
                        echo '<p>'.$way.$target.'</p>';
                        break;
                    }// fin switch
    
    }   // fin liste_Tpl()
    
    function    showliste($dir,$tri='file',$tpl='link',$mode_admin)     {
        $this->mode_admin=$mode_admin;
        $this->triliste($dir,$tri);
    
        $ct=count($this->browsed);
        if ( ($ct>0) || (is_array($this->browsed))) {
            for ($i=0;$i<$ct;$i++)
                {
                        $this->liste_Tpl($dir,$tri,$tpl,$i);
                }
            }
        else {
            echo '<p>Désolé, Aucun fichiers ou répertoire trouvé .</p>';
            }
    
    }   // fin showliste();                             
    
    #########                                       
    }// fin class 
    
    
    if (isset($_GET['galerie'])) {
    
    $album= preg_replace('/[\.\%\&\"\s\'\:\/\[\],_|#*$£=`\+]+/',' ',$_GET['galerie']);
    $browse= new dirRecursif('data/images/Album/'.$album);
     if(isset($browse->album_num)) $num_img = $browse->album_num; else $num_img ='0';
    if ($mode_admin !='Actif') {
    echo '<h3>Album :'.$album.' </h3>
    <p>'.$num_img .' Image(s) dans cet Album .</p>
    <div class="post">';
    
    
    $browse->showliste('data/images/Album/'.$album,'file','album',$mode_admin);
    echo '</div>';
    }
    }
    ?>
    <h3>Les Albums photos disponibles .</h3>
    <div class="post"><?php
    $browse2= new dirRecursif('data/images/Album/');
    $browse2->showliste('data/images/Album/','dir','linkdir',$mode_admin);
    
    ?>
    </div>
    
    <style>#admin,
    #admin > form,
    #admin form fieldset {
      border: solid 1px;
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      text-align: center;
      gap: 1em;
    }
    #admin h1,
    #admin > p:first-of-type,
    #admin h2,
    #admin form,
    legend,
    [type="submit"] {
      grid-column: 1/-1;
      margin: 0 auto 0.5em;
      padding: 0 0.25em;
    }
    #admin fieldset {
      margin: 1em;
      padding: 0.5em;
      grid-column: 1/-1;
    }
    #admin p:empty {
      display: none;
    }
    
    .tampon {
      height: 100%;
      display: flex;
      flex-direction: column;
    }
    .thumb {
      margin: auto;
    }
    
    /* VISITEUR */
    article h3{
      font-weight:bold;
      font-size:1.25em;
    }
    .post,
    .post .tampon {
      display: grid;
      gap: 0.5em;
    }
    .post {
      grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    }
    .album {
      border: solid 1px;
      text-align: center;
    }
    .post .tampon {
      grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
      gap: 0.5em;
      align-items: center;
    }
    .post img {
      width: 90%;
      max-width: 250px;
      aspect-ratio: 1/1;
      object-fit: scale-down;
      box-shadow: inset 0 0 0 510px rgba(255,255,255, 0.25);
      background-size: 200% auto !important;
    }
    </style>
    


    Cordialement,
    gcyrillus

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

Connectez-vous ou Inscrivez-vous pour répondre.