///clef:Az34u78fZt //1.50/fr/ identification + version, ne pas modifier --
//------------------------------------------------------------------------------
// Galerie photos automatique utilisant un seul fichier PHP
// ce fichier PHP se charge de créer les vignettes photos, de les présenter
// en une page de galerie photos, et de présenter à la demande les photos dans
// une page secondaire (popup). Le fichier gère les photos placées dans le même
// dossier et également les photos placées dans des sous-dossiers.
// > 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, pour un script PHP, /* pour un script CSS
//
$Fichoptions= NULL; $Locfichopts= array('commun'=>'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
?>
exit;
}
/********** Partie fenêtre POP-UP ($action='popup')****************************/
if ($action=='popup'){ // nom de l'image appelée: $fichimage
// préparation des légendes
$nomimg=substr($fichimage,0,strrpos($fichimage,'.'));
if ($afffichtop=='oui'){
(isset($Legpp_etiq[$nomimg]))? $etiquette=$Legpp_etiq[$nomimg]: $etiquette=$fichimage; $altimage='';
}
else{
$etiquette=''; $altimage=$fichimage;
}
if ($affnomcart=='oui'){
(isset($Legpp_cart[$nomimg]))? $cartouche=$Legpp_cart[$nomimg]: $cartouche=$nomimg;
}
// l'image existe t'elle ?
if (@$Iminfo=getimagesize($fichimage)){ // image existante
$annonce='... Veuillez patienter ...
';
$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
$chemmodule=ChemModule('stylepop',$clef);
if ($chemmodule) echo(''.chr(10));
?>
echo(''.$annonce.''.chr(10));?>
echo(''.chr(10));?>
echo(''.$etiquette.''.chr(10));?>
echo(''.$signature.''.chr(10));?>
echo(''.$cartouche.''.chr(10));?>
exit; // fin du module POPUP >> 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é
$chemmodule=ChemModule('stylegal',$clef);
if ($chemmodule) echo(''.chr(10));
?>
$chemmodule=ChemModule('entetgal',$clef);
if ($chemmodule){
include($chemmodule); // option si prévu
}
else{
echo(''.chr(10));
}
?>
// synthèse du lien vers la galerie principale
if($galsup==1){
(($chemdirgalprim!='/')&&($chemdirgalprim!=chr(92)))? $chemin=$chemdirgalprim: $chemin='';
echo('
');
$chemmodule=ChemModule('colgagal',$clef); // colonne à gauche
if ($chemmodule){echo('
'); include($chemmodule); echo('
'.chr(10));}
echo('
'.chr(10));
$chemmodule=ChemModule('coldrgal',$clef); // colonne à droite
if ($chemmodule){echo('
'); include($chemmodule); echo('
'.chr(10));}
echo('
');
?>
// affichage photos ou images par bandes
$html='
'.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);
}
else{
//Le dossier ne contient pas d'image !
$html=' Le dossier ne contient pas d\'image'.chr(10);
}
$html.='
'.chr(10);
echo($html);
?>
');?>
');?>
if ($ch=ChemModule('piedpgal',$clef)) include($ch); // option si prévu
?>
exit; // fin du module galerie >> 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 **************************************************/