ce code a besoin des fonctionnalités GD, à vérifier avec phpinfo() // > ce code nécessite la prise en charge de JavaScript par le navigateur client // Sur options en ajoutant des fichiers annexes: // il est possible de changer le comportement et l'apparence de la galerie // - de personnaliser les paramètres, les styles et les légendes // - d'étendre les fonctionnalités par des extensions par inclusion de code //----------- // Version 1.50: mise en chantier le 18-07-2007, mise à jour le 19-juin-2008 // (2008) //------------------------------------------------------------------------------ /*========= Paramétres généraux ==============================================*/ $nompage= 'index.php'; // nom attendu des pages PHP de galerie (cette page) $nomdosvgt='Vignettes'; // nom du dossier réservé au vignettes $sfx='_vgt.jpg'; // suffixe des fichiers de vignettes $actiondef='galerie'; // action par défaut $autclone='oui'; // clonage dans les sous-dossiers, permis=>'oui' // liste des actions prises en charge, activées par passage de variables GET $Actionliste= array('galerie','popup'); // extensions permises des fichiers photos (insensibles à la casse) $Extimg= array('jpg','jpeg','gif','png'); // dossiers masqués ou réservés (tout le contenu, fichiers + sous-dossiers) $MasqDo= array('secret0','secret1'); // compteur de visite $dlvisite=2; // delai (s) pour considérer le même IP comme nouveau visiteur /*========= Paramétrages de présentation (par défaut) ========================*/ $ordre='na'; // ordre d'affichage des vignettes: '','i','a','ia','na','hz' $dimmaxvgt=100; // taille de la dimension max de la vignette, en pixel $marg=5; // marge autour de la vignette, en pixel $nipbdmax=20; // nombre maximal d'images par bande de photos $emprise=75; // emprise des bandes sur la largeur d'écran, en % $afflegende='oui'; // légende brève sous les vignettes $afflegplus='oui'; // légende étendue sous les vignettes suivant pointage $signature=''; // signature qui sera affichée en bas du POPUP $afffichtop='oui'; // affichage du nom de fichier "photo" en haut du POPUP $affnomcart='oui'; // affichage du nom de la "photo" dans un cartouche $hcart=15; // hauteur du cartouche en pixel $centrage=150; // centrage de la fenêtre POPUP en %, si >100 = aléatoire /*========= Paramétres de gestion des options (extensions, styles, ...) ======*/ $options='oui'; // prise en compte des options $nomdosopt='Options'; // nom du dossier réservé aux options /*============================================================================*/ /********** Traitements préliminaires *****************************************/ // environnement dossiers $racine=$_SERVER['DOCUMENT_ROOT']; $chempageself=$_SERVER['PHP_SELF']; $chemdirself=dirname($chempageself); // récupération du nom de fichier de cette page PHP $nomself=basename($chempageself); // récupération de son identification et du numéro de version $Champ=Idenfichier($nomself,'.'); $clef=$Champ[0]; $numversion=$Champ[1]; // récupération du nom du dossier parent $nomdirparent= basename($chemdirself); // recherche d'autres galeries $nompage dans les dossiers supérieurs $Chemdirgalsup=AnalyseGaleriesSup($nompage,$clef,$chemdirself,$racine); $galsup=0; $nomdirgrparent=''; $chemdirgalprim='/'.$nomdirparent; ($Chemdirgalsup[0]!='')? $ngalsup=count($Chemdirgalsup): $ngalsup=0; If ($ngalsup>0){ $galsup=1; $nomdirgrparent= basename($Chemdirgalsup[0]); $chemdirgalprim=$Chemdirgalsup[$ngalsup-1]; } $racinegalprim=$racine.$chemdirgalprim; // Création de dossiers d'environnement si absents CreationDossier($nomdosvgt); // création du dossier de vignettes si absent CreationDossier($nomdosopt); // création du dossier pour les options si absent array_push($MasqDo,$nomdosvgt,$nomdosopt); // récupération du numéro IP du visiteur $ipc=$_SERVER['REMOTE_ADDR']; /********** Gestion des options ***********************************************/ // Le tableau $Fichoptions contient les noms de fichier des divers modules qui // vont apporter différentes options pour une personnalisation et une extension // des possibilités du script PHP. Si les fichiers sont absents le module n'est // pas chargé. Les fichiers sont par défaut dans le répertoire local $nomdosopt. // Le tableau $Locfichopts précise si faut chercher le module dans le répertoire // $nomdosopt de la galerie principale (dossier local par défaut). // Ces deux tableaux sont des tableaux associatifs dont les éléments sont // identifiés par des index. // la première ligne des fichiers "module" doivent contenir la bonne clef et le // bon nom de l'index associé comme l'exemple ci-dessous: // ##///clef:Az34u78fZt //nom-de-l'index/version/ commentaire // où ## sont deux caractères, 'C'); if ($options=='oui'){ // index de tableau utilisés dans ce script auquel une valeur est attribuée $Fichoptions= array( 'commun'=>'commun.inc', 'optionplus'=>'optionplus.inc', 'modifparam'=>'modifparam.inc', 'legsphotos'=>'legsphotos.inc', 'entetgal'=>'entetgal.inc', 'colgagal'=>'colgagal.inc', 'coldrgal'=>'coldrgal.inc', 'piedpgal'=>'piedpgal.inc', 'stylegal'=>'stylegalerie.css', 'stylepop'=>'stylepopup.css', ); // index de tableau utilisés dans ce script sans valeur attribuée: // 'varsmetget' , 'traitemsup' , 'actionssup' // ( utiliser le module 'optionplus' pour attribuer des valeurs ) } if ($ch=ChemModule('optionplus',$clef)) include($ch); // option: modifie $Fichoptions if (!is_array($Fichoptions)) $options='erreur'; if ($ch=ChemModule('commun',$clef)) include($ch); // option: modifie $Locfichopts if ($ch=ChemModule('modifparam',$clef)) include($ch); // option: modifie les paramétres if ($ch=ChemModule('legsphotos',$clef)) include($ch); // option: renseigne les légendes // Légendes: tableaux associatifs['nom du fichier photo (sans l'extension)'] // Vignettes: $Legvi_brev[] légende brève, $Legvi_long[] légende longue // Popups: $Legpp_etiq[] étiquette, $Legpp_cart[] cartouche /********* Gestion des variables passées en méthode GET, et traitements *******/ (isset($_GET['action']))? $action=$_GET['action']: $action=''; (isset($_GET['sw']))? $sw= $_GET['sw']:$sw=640; (isset($_GET['nf']))? $fichimage= $_GET['nf']:$fichimage=''; if ($ch=ChemModule('varsmetget',$clef)) include($ch); // option: modifs-ajouts de variables /********** Traitements supplémentaires ***************************************/ if ($action!='' and !in_array($action,$Actionliste)) $action=''; if ($sw<0) $sw=640; if ($sw>5120) $sw=5120; $dimcase=$dimmaxvgt+2*$marg; $cmptxt=''; // texte compteur, valeur par défaut if ($affnomcart!='oui') $hcart=0; array_push($MasqDo,$nomdosvgt,$nomdosopt); // si le nom du fichier est différent du nom prévu, pas de clonage par sécurité if ($nomself!=$nompage) $autclone='non'; if ($ch=ChemModule('traitemsup',$clef)) include($ch); // option: ajouts de traitements /*============================================================================*/ // Ce script PHP est divisé en parties pour effectuer des réactions différentes // $action=''=> recharge avec info client $sw (largeur en pixel de l'écran) // $action='popup' => affichage d'une photo dans une fenêtre secondaire // $action='galerie' => affichage des vignettes photos en bandes // (pour des extensions utiliser l'option d'un module 'actionssup') /*============================================================================*/ /********** Partie par défaut ($action est vide) ******************************/ if ($action==''){ // flux HTML de la page défaut if ($ch=ChemModule('partdeft',$clef)) include($ch); // option si prévu ?>
'; $annonce.='l\'image " '.$fichimage.' " est en cours de chargement.'; // la fenêtre POPUP a été ouverte aux dimensions $largim x $hautim $largim=$Iminfo[0]; $hautim=$Iminfo[1]; } else{ // image absente $annonce='Erreur:
image inexistante'; $fichimage=''; $hcart= 0; $cartouche=''; $largim=100; $hautim=100; } // flux HTML de la fenêtre POP-UP ?> Fenêtre POPUP '.chr(10)); ?>
'.$annonce.''.chr(10));?>
'.chr(10));?>
'.$etiquette.''.chr(10));?>
'.$signature.''.chr(10));?>
'.$cartouche.''.chr(10));?>
> sortie du script PHP } /********** Partie fenêtre GALERIE PHOTOS ($action='galerie')******************/ if ($action=='galerie'){ AnalyseDossFich(); // analyse de l'environnement dossiers-fichiers Nettoyagedosvgt($nomdosvgt); // nettoyage du dossier de vignettes Creationvignettes($nomdosvgt); // création des vignettes (si absentes) Gestionsousgaleries($autclone);// galeries dans les sous-dossiers $cmptxt=Compteur($ipc,$dlvisite,$nomdosvgt); //compteur // calcul du nombre d'images par bande en fonction de la largeur de l'écran $emprise=abs($emprise/100); if ($emprise>1) $emprise=1; $nipbd= floor($emprise*$sw/$dimcase); if ($nipbd==0) $nipbd=1; if ($nipbd>$nipbdmax) $nipbd=$nipbdmax; // flux HTML de la galerie de photos ?> Gallerie du Village de Boisdoré '.chr(10)); ?> '.chr(10)); } ?>

«« '); echo('Galerie principale'); echo(''.chr(10)); } ?>
'); $chemmodule=ChemModule('colgagal',$clef); // colonne à gauche if ($chemmodule){echo(''.chr(10));} echo(''.chr(10)); $chemmodule=ChemModule('coldrgal',$clef); // colonne à droite if ($chemmodule){echo(''.chr(10));} echo(''); ?>
'); include($chemmodule); echo(' '); include($chemmodule); echo('
'.chr(10); if ($nimag>0){ // le dossier contient des photos $nbd=Ceil($nimag/$nipbd); $iima=0; $iilg=0; $html.=''.chr(10); for ($ibd=1; $ibd<=$nbd; $ibd++){ // ouverture d'une bande de photos $html.=''.chr(10); for ($icl=0; $icl<$nipbd; $icl++){ if ($iima<$nimag){ // la photo existe, création d'une cellule avec la vignette photo $nomfich=$Nf_image[$iima]; if ($Iminfo=getimagesize($nomfich)){ $largim=$Iminfo[0]; $hautim=$Iminfo[1]; } $nomimg=substr($nomfich,0,strrpos($nomfich,'.')); $nomvgt=$nomdosvgt.'/'.rawurlencode($nomimg).'_vgt.jpg'; $html.=''.chr(10); } else{ // la photo n'existe pas, création d'une cellule sans vignette $html.=''.chr(10); } $iima++; } $html.=''.chr(10); } $html.='
'.chr(10); $html.=''.chr(10); // legende de vignette if ($afflegende=='oui'){ $html.='
'.chr(10); (isset($Legvi_brev[$nomimg]))? $legende1=$Legvi_brev[$nomimg]: $legende1=$nomimg; $html.='
'.$legende1.'
'.chr(10); } else{ $html.='
'.chr(10); } if ($afflegplus=='oui'){ $legdef='fichier:
'.$nomfich.'
('.$largim.'x'.$hautim.' pixels)'; (isset($Legvi_long[$nomimg]))? $legende2=$Legvi_long[$nomimg]: $legende2=$legdef; $html.='
'.$legende2.'
'.chr(10); } $html.='
'.chr(10); $html.='
 
'.chr(10); } else{ //Le dossier ne contient pas d'image ! $html=' Le dossier ne contient pas d\'image'.chr(10); } $html.=''.chr(10); echo($html); ?>
 
');?> ');?>


> sortie du script PHP } if ($ch=ChemModule('actionssup',$clef)) include($ch); // option si prévu // Fonctions:------------------------------------------------------------------/ //--- Identification d'un fichier suivant le contenu de sa première ligne function Idenfichier($fichier,$chemin,$racine=''){ // première ligne: #clef:champ0 //champ1/champ2/ .... (champ0= 10 caractères) $Champ= array('','','','',''); ($chemin!='/'&&$chemin!=chr(92))? $chemfich=$chemin.'/'.$fichier: $chemfich='/'.$fichier; $chemfich=$racine.$chemfich; if (is_readable($chemfich)){ $fp0=fopen($chemfich,'r'); $ligne1=fgets($fp0); fclose($fp0); $Champ[0]=substr($ligne1,strpos($ligne1,'clef:')+5,10); $tok=strtok(substr($ligne1,strpos($ligne1,'clef:')+15),'/'); $Champ[1]=strtok('/'); $Champ[2]=strtok('/'); } return $Champ; } //--- Création d'un dossier, $nomdos, si absent function CreationDossier($nomdos){ if (!(@filetype($nomdos)=='dir')){ if (@mkdir($nomdos)){ // écriture d'un fichier index.html minimal dans le dossier de vignettes $html=''.chr(10).''.chr(10); $html.=''.chr(10); $html.=' '.chr(10).''.chr(10).''; if ($pf0=fopen('./'.$nomdos.'/'.'index.html','w')){ fwrite($pf0,$html); fclose($pf0 ); } } else{ echo('
ERREUR: le dossier "$nomdos" n'a pu être créé !
'.chr(10)); } } } //--- Chemin d'un module d'extension valide pour inclusion de code PHP function ChemModule($index,$clef){ $chemfich= FALSE; global $options, $racinegalprim, $nomdosopt, $Fichoptions, $Locfichopts; // entrées ((isset($Locfichopts[$index]))&&($Locfichopts[$index]='C'))? $chem0=$racinegalprim: $chem0='.'; if (($options=='oui')&&(isset($Fichoptions[$index]))){ $chemfich=$chem0.'/'.$nomdosopt.'/'.$Fichoptions[$index]; $Champ=Idenfichier($Fichoptions[$index],'/'.$nomdosopt,$chem0); if (($Champ[0]!=$clef)||($Champ[1]!=$index)) $chemfich= NULL; } return $chemfich; } //--- Analyse la présence de galeries dans les dossiers supérieurs function AnalyseGaleriesSup($nompage,$clef,$chem,$racine,$ngalsupmax=15){ $tst='1'; $nsup=0; $Chemdir=array(''); while($tst=='1'&&($chem!=dirname($chem))&&($nsup<=$ngalsupmax)){ $chem= dirname($chem); $tst='0'; if (is_readable($racine.$chem)){ $Champ=Idenfichier($nompage,$chem,$racine); // vérification qu'il s'agit du bon fichier PHP if ($Champ[0]==$clef){ ($chem!='/'&&$chem!=chr(92))? $chempage=$chem: $chempage='/'; $tst='1'; $Chemdir[$nsup++]= $chempage; } } } return $Chemdir; } //--- Analyse de l'environnement dossiers-fichiers, recherche des images function AnalyseDossFich(){ global $MasqDo, $Extimg, $ordre; // entrées global $Doss, $ndoss, $Nf_image, $nimag, $listenomimg; // sorties $dp=opendir('.'); $ndoss=0; $nfich=0; while (gettype($file=readdir($dp))!=@boolean){ if (in_array($file,$MasqDo))$file='?'; if ($file!='.' and $file!='..' and $file!='?'){ if (is_dir('./'.$file)) $Doss[++$ndoss-1]=$file; // dossiers if (is_file('./'.$file)) $Fich[++$nfich-1]=$file; // fichiers } } closedir($dp); // liste des images, tableau et chaîne de caractères $nimag=0; $listenomimg='>/'; if ($nfich>0){ for ($i=0;$i<$nfich;$i++){ $nomfich=$Fich[$i]; $ext=''; // tri, uniquement les fichiers d'extensions permises if ($pp=strrpos($nomfich,'.')) $ext=strtolower(substr($nomfich, $pp+1)); if (in_array($ext,$Extimg)){ $Nf_image[++$nimag-1]=$nomfich; $nomimg=substr($nomfich,0,$pp); $listenomimg.= $nomimg.'/'; } } } // réarrangement de l'ordre de présentation des images if ($nimag!=0){ switch ($ordre){ // par défaut, ordre par date de téléchargement case 'i': // ordre inverse $Nf_image= array_reverse($Nf_image); break; case 'a': // ordre numérique ou aphabétique sort($Nf_image); break; case 'na': // ordre naturel natcasesort($Nf_image); $Nf_image=array_values($Nf_image); break; case 'ia': // ordre inverse numérique ou aphabétique rsort($Nf_image); break; case 'hz': // ordre aléatoire shuffle($Nf_image); break; } } } //--- Création des vignettes si absentes sur la base des images identifiées function Creationvignettes($nomdosvgt){ global $nimag, $Nf_image, $sfx, $dimmaxvgt; for ($iima=0;$iima<$nimag;$iima++){ $nomfich= $Nf_image[$iima]; $nomimg=substr($nomfich,0,strrpos($nomfich,'.')); // si la vignette n'existe pas on la créer $nomvgt=$nomdosvgt.'/'.$nomimg.$sfx; if (!file_exists($nomvgt)){ if (@$Iminfo=getimagesize($nomfich)){ $type=$Iminfo[2]; $ok=0; switch ($type){ case 1: // format GIF if (@$im=ImageCreateFromGIF($nomfich)) $ok=1; break; case 2: // format JPEG if (@$im=ImageCreateFromJPEG($nomfich)) $ok=1; break; case 3: // format PNG if (@$im=ImageCreateFromPNG($nomfich)) $ok=1; break; } } if ($ok==1){ $larg=ImageSX($im); $haut=ImageSY($im); if($larg>=$haut){ $vlrg=$dimmaxvgt; $vhut=round($dimmaxvgt/$larg*$haut); } else{ $vhut=$dimmaxvgt; $vlrg=round($dimmaxvgt/$haut*$larg); } $imv=ImageCreateTrueColor($vlrg,$vhut); ImageCopyResampled($imv,$im,0,0,0,0,$vlrg,$vhut,$larg,$haut); ImageJPEG($imv,$nomvgt,100); ImageDestroy($im); ImageDestroy($imv); } } } } //--- Nettoyage et mise à jour des vignettes: // suffixe correct, correspond à une image présente dans ../, la taille correspond à "$dimmaxvgt" function Nettoyagedosvgt($nomdosvgt){ global $sfx, $listenomimg, $dimmaxvgt; // entrées $Exceptions= array('index.html','cptmip.txt'); $dpvgt=opendir('./'.$nomdosvgt); while (gettype($file=readdir($dpvgt))!=@boolean){ if ($file!='.' and $file!='..'){ $eff=0; $fichvgt='./'.$nomdosvgt.'/'.$file; if (is_file($fichvgt)){ (strrpos($file,$sfx))? $c=strrpos($file,$sfx):$c=strrpos($file,'.'); // le suffixe n'est pas le bon if (substr($file,$c)!=$sfx) $eff=1; // l'image n'est pas dans la liste if (!strpos($listenomimg,'/'.substr($file,0,$c).'/')) $eff+=2; if (@$Iminfo=getimagesize($fichvgt)){ // la vignette n'a pas la bonne taille if (max($Iminfo[0],$Iminfo[1])!=$dimmaxvgt) $eff+=4; } if (in_array($file,$Exceptions)) $eff=0; } // efface ou tente d'effacer le fichier si $eff > 0 if ($eff>0) @unlink($fichvgt); } } closedir($dpvgt); } //--- Gestion des galeries photos dans les sous-dossiers, clonage si autorisé function Gestionsousgaleries($autclone){ global $nompage, $clef, $numversion, $ndoss, $Doss; // entrées global $nlien, $Nc_lien; // sorties (liens vers les sous-galeries) $nlien=0; // nombre de lien vers des sous-galeries for ($i=0;$i<$ndoss;$i++){ $nomdos=$Doss[$i]; // existence d'un fichier PHP de nom "$nompage" if (is_file('./'.$nomdos.'/'.$nompage)){ $Champ=Idenfichier($nompage,'./'.$nomdos); // vérification qu'il s'agit du bon fichier PHP if ($Champ[0]==$clef){ // une galerie photos est déjà active dans ce sous-dossier $Nc_lien[++$nlien-1]=$nomdos; // contrôle du numéro de version if ($Champ[1]!=$numversion){ // mise à jour du fichier PHP @copy('./'.$nompage, './'.$nomdos.'/'.$nompage); } } } else{ // clonage du fichier PHP de galerie photos dans le sous-dossier if ($autclone=='oui'){ if (@copy('./'.$nompage, './'.$nomdos.'/'.$nompage)) $Nc_lien[++$nlien-1]=$nomdos; } } } if ($nlien!=0){ natcasesort($Nc_lien); $Nc_lien=array_values($Nc_lien);} } //--- Compteur de visite, renvoie le texte $cmptxt function Compteur($ipc,$delai,$dossier){ if (!file_exists('./'.$dossier.'/'.'cptmip.txt')) touch('./'.$dossier.'/'.'cptmip.txt'); if ($pf0=fopen('./'.$dossier.'/'.'cptmip.txt','r+')){ $sgn='Compteur galphoto'; $ipcf=sprintf('%15s',$ipc); $chrono=sprintf('%10s',time()); $i=0; // lecture du fichier de comptage while (!feof($pf0)){ $Ligne[$i++]=fgets($pf0,1024); } $n=$i-2; // -1 à cause du dernier retour ligne // analyse du fichier compteur et traitement $nouveau=1; $cmp=substr($Ligne[0],1,8); for ($i=1;$i<=$n;$i++){ $ipcs[$i]=substr($Ligne[$i],1,15); if ($ipcf==$ipcs[$i]){ $chronos[$i]=substr($Ligne[$i],17,10); if (($chrono-$chronos[$i])>$delai) $cmp++; $nouveau=0; $present[$i]=1; $chronos[$i]=$chrono; } } if ($nouveau==1){ $i=++$n; $cmp++; $present[$i]=1; $ipcs[$i]=$ipcf; $chronos[$i]=$chrono; } // mise à jour du fichier compteur rewind($pf0); ftruncate($pf0,0); $cmp=sprintf('%08s',$cmp); fwrite($pf0,':'.$cmp.':'.$sgn.':'.chr(10)); $nv=0; for ($i=1;$i<=$n;$i++){ if ($present[$i]==1){ fwrite($pf0,':'.$ipcs[$i].':'.$chronos[$i].':'.chr(10)); $nv++; } } fclose($pf0 ); $pl=($nv==1)? '':'s'; $cmptxt=$cmp.' visiteurs
actuellement '.$nv.' visiteur'.$pl.' sur cette page'; } return $cmptxt; } /************* fin du script **************************************************/