* Die Funktion getGalleryLinks() in includes/galleryfunctions.php liefert die Menüeinträge und in index.php werden diese gerendert (fixes #16) * Der PHP-Code wurde so formatiert, dass phpcs --standard=Zend keine Fehler mehr findet (fixes #3) * Der PHP-Code wurde vollständig mit Doxygen dokumentiert und eine Doxygen-Konfiguration in doc/doxygen.conf hinterlegt (fixes #27)
		
			
				
	
	
		
			360 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @file
 | |
|  * Funktionen für den Aufbau der Bildergalerie.
 | |
|  *
 | |
|  * @author Jan Dittberner <jan@dittberner.info>
 | |
|  * @version \$Id$
 | |
|  *
 | |
|  * Copyright (c) 2007, 2008 Jan Dittberner <jan@dittberner.info>
 | |
|  * Jan Dittberner IT-Consulting & -Solutions,
 | |
|  * Cottbuser Str. 1, D-01129 Dresden
 | |
|  *
 | |
|  * This file is part of the ScrollingJQueryGallery component of the
 | |
|  * gnuviech-server.de Websitetools
 | |
|  *
 | |
|  * ScrollingJQueryGallery is free software: you can redistribute it
 | |
|  * and/or modify it under the terms of the GNU General Public License as
 | |
|  * published by the Free Software Foundation, either version 3 of the
 | |
|  * License, or (at your option) any later version.
 | |
|  *
 | |
|  * ScrollingJQueryGallery is distributed in the hope that it will be
 | |
|  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with ScrollingJQueryGallery.  If not, see
 | |
|  * <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| define(GALLERYPREFIX, "bilder");
 | |
| define(INFOFILE, "galleryinfo.ini");
 | |
| define(IMAGESEC, "images");
 | |
| define(GALLERYSEC, "gallery");
 | |
| define(GALLERY_RE, '/^[\w\d _-]+$/');
 | |
| 
 | |
| /**
 | |
|  * Breite der Vorschaubilder.
 | |
|  */
 | |
| $previewwidth = 311;
 | |
| 
 | |
| /**
 | |
|  * Höhe der Thumbnailbilder.
 | |
|  */
 | |
| $thumbheight = 67;
 | |
| 
 | |
| /**
 | |
|  * Prüft, ob eine Galerie mit dem übergebenen Namen existiert.
 | |
|  *
 | |
|  * @param $galleryname Galeriename
 | |
|  *
 | |
|  * @return @c true, wenn die Galerie existiert und einen erlaubten
 | |
|  * Verzeichnisnamen hat, sonst @c false
 | |
|  */
 | |
| function galleryExists($galleryname) {
 | |
|   return preg_match(GALLERY_RE, $galleryname) &&
 | |
|     realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Liefert geparste Konfigurationsinformationen zu einer Galerie oder
 | |
|  * die globale Konfiguration. Die Konfigurationsdaten einer Galerie
 | |
|  * stehen in der Datei @c galleryinfo.ini in dem Verzeichnis der
 | |
|  * Galerie. Die globale Konfiguration liegt in der gleichnamigen Datei
 | |
|  * im Elternverzeichnis der Galerien.
 | |
|  *
 | |
|  * @param $galleryname Galeriename oder @c null, wenn die globale
 | |
|  * Konfiguration geparst werden soll
 | |
|  *
 | |
|  * @return Ergebnis von @c parse_ini_file() oder ein leeres Array,
 | |
|  * wenn keine Konfigurationsdatei vorhanden ist
 | |
|  */
 | |
| function getGalleryConfig($galleryname = null) {
 | |
|   if ($galleryname) {
 | |
|     $filepath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR .
 | |
|                          $galleryname . DIRECTORY_SEPARATOR . INFOFILE);
 | |
|   } else {
 | |
|     $filepath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . INFOFILE);
 | |
|   }
 | |
|   if (is_file($filepath)) {
 | |
|     return parse_ini_file($filepath, true);
 | |
|   }
 | |
|   return array();
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Holt die Bildinformationen zu einem Bild.
 | |
|  *
 | |
|  * @param $imagename Bildname
 | |
|  *
 | |
|  * @param $galleryname Galleriename
 | |
|  *
 | |
|  * @return assoziatives Array mit folgenden Feldern
 | |
|  * @li @a name Bildname
 | |
|  * @li @a data Label des Bildes
 | |
|  * @li @a preview relative URL des Vorschaubildes
 | |
|  * @li @a full relative URL des Vollbildes
 | |
|  *
 | |
|  * @bug @a data sollte @a label heißen
 | |
|  */
 | |
| function getImgInfo($galleryname, $imagename) {
 | |
|   return array("name" => $imagename,
 | |
|                "data" => getImageLabel($galleryname, $imagename),
 | |
|                "preview" => GALLERYPREFIX . DIRECTORY_SEPARATOR .
 | |
|                getScaledImage($galleryname, $imagename,
 | |
|                               $GLOBALS["previewwidth"], false),
 | |
|                "full" => GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname .
 | |
|                DIRECTORY_SEPARATOR . $imagename
 | |
|                );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Liefert das Label zu einem Bild. Wenn es in der @a images-Sektion
 | |
|  * der Datei @c galleryinfo.ini der angegebenen Galerie einen Eintrag
 | |
|  * mit dem übergebenen Bildnamen gibt, wird dieser zurückgegeben,
 | |
|  * ansonsten der Bildname selbst.
 | |
|  *
 | |
|  * @param $galleryname Galeriename
 | |
|  *
 | |
|  * @param $imagename Bildname
 | |
|  *
 | |
|  * @return Label zu dem Bild
 | |
|  */
 | |
| function getImageLabel($galleryname, $imagename) {
 | |
|   $gallerypath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname);
 | |
|   if (empty($gallerypath) || !is_dir($gallerypath)) {
 | |
|     return false;
 | |
|   }
 | |
|   $filepath = $gallerypath . DIRECTORY_SEPARATOR . $imagename;
 | |
|   if (!is_file($filepath)) {
 | |
|     return false;
 | |
|   }
 | |
|   $inidata = getGalleryConfig($galleryname);
 | |
|   $value = $inidata[IMAGESEC][$imagename];
 | |
|   if ($value) {
 | |
|     return $value;
 | |
|   }
 | |
|   return $imagename;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Liefert die aktuelle Gallerie. Die Gallerie kann entweder im
 | |
|  * GET-Parameter @c galleryname stehen, als Wert @a default in der @a
 | |
|  * gallery-Sektion der zentralen galleryinfo.ini angegeben werden oder
 | |
|  * es wird das erste Unterverzeichnis von GALLERYPREFIX verwendet.
 | |
|  *
 | |
|  * @return Galeriename
 | |
|  */
 | |
| function getCurrentGallery() {
 | |
|   if (galleryExists($_GET["galleryname"])) {
 | |
|     return $_GET["galleryname"];
 | |
|   }
 | |
|   $filepath = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . INFOFILE);
 | |
|   if (!empty($filepath)) {
 | |
|     $inidata = getGalleryConfig();
 | |
|     if (galleryExists($inidata[GALLERYSEC]["default"])) {
 | |
|       return $inidata[GALLERYSEC]["default"];
 | |
|     }
 | |
|   }
 | |
|   foreach (glob(realpath(GALLERYPREFIX) . DIRECTORY_SEPARATOR . '*',
 | |
|                 GLOB_ONLYDIR) as $directory) {
 | |
|     $basename = basename($directory);
 | |
|     if (galleryExists($basename)) {
 | |
|       return $basename;
 | |
|     }
 | |
|   }
 | |
|   return null;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Liefert eine skalierte Version zu dem übergebenen Bild der
 | |
|  * übergebenen Galerie und generiert dieses bei Bedarf.
 | |
|  *
 | |
|  * @param $galleryname Galeriename
 | |
|  *
 | |
|  * @param $basename Bildname
 | |
|  *
 | |
|  * @param $maxdim maximale Breite oder Höhe des skalierten Bildes in
 | |
|  * Pixeln
 | |
|  *
 | |
|  * @param $scaleheight Angabe ob die Höhe oder die Breite für den
 | |
|  * Maximalwert beachtet werden soll, wenn dieser Parameter @c true
 | |
|  * ist, wird die Höhe auf @a $maxdim skaliert, ansonsten die Breite
 | |
|  *
 | |
|  * @return Pfad des skalierten Bildes relativ zu @a GALLERYPREFIX
 | |
|  */
 | |
| function getScaledImage($galleryname, $basename, $maxdim, $scaleheight=true) {
 | |
|   if ($maxdim == 0) {
 | |
|     debug_print_backtrace();
 | |
|   }
 | |
|   $gallerydir = realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname);
 | |
|   if ($scaleheight) {
 | |
|     $scaleddir = sprintf("%s%sscaled_x%d", $galleryname,
 | |
|                          DIRECTORY_SEPARATOR, $maxdim);
 | |
|   } else {
 | |
|     $scaleddir = sprintf("%s%sscaled%dx_", $galleryname,
 | |
|                          DIRECTORY_SEPARATOR, $maxdim);
 | |
|   }
 | |
|   $scaleddirpath = GALLERYPREFIX . DIRECTORY_SEPARATOR . $scaleddir;
 | |
|   if (!is_dir($scaleddirpath)) {
 | |
|     // versuchen das Thumbnail-Verzeichnis anzulegen
 | |
|     $mkdir = @mkdir($scaleddirpath, 0755);
 | |
|     if (!$mkdir) {
 | |
|       return $galleryname . DIRECTORY_SEPARATOR . $basename;
 | |
|     }
 | |
|   }
 | |
|   
 | |
|   $scaledimage = $scaleddirpath . DIRECTORY_SEPARATOR . $basename;
 | |
|   if (!is_file($scaledimage)) {
 | |
|     // Datei erzeugen
 | |
|     $originalfile = $gallerydir . DIRECTORY_SEPARATOR . $basename;
 | |
|     $origimage = imagecreatefromjpeg($originalfile);
 | |
|     $origx = imagesx($origimage);
 | |
|     $origy = imagesy($origimage);
 | |
|     if ($scaleheight) {
 | |
|       $scaleratio = $origy / (1.0 * $maxdim);
 | |
|       $newy = $maxdim;
 | |
|       $newx = (int) $origx / $scaleratio;
 | |
|     } else {
 | |
|       $scaleratio = $origx / (1.0 * $maxdim);
 | |
|       $newx = $maxdim;
 | |
|       $newy = (int) $origy / $scaleratio;
 | |
|     }
 | |
|     $newimage = imagecreatetruecolor($newx, $newy);
 | |
|     imagecopyresampled($newimage, $origimage, 0, 0, 0, 0, $newx, $newy,
 | |
|                        $origx, $origy);
 | |
|     imagejpeg($newimage, $scaledimage, 90);
 | |
|   }
 | |
|   return $scaleddir . DIRECTORY_SEPARATOR . $basename;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Gibt die Informationen über Vorschaubilder zurück.
 | |
|  *
 | |
|  * @param $galleryname Galeriename
 | |
|  *
 | |
|  * @return Array mit drei Elementen, dessen erstes Element die
 | |
|  * aufsummierte Breite der Einzelbilder, dessen zweites Element der
 | |
|  * Galeriename und dessen drittes Element ein assoziatives Array mit
 | |
|  * den Bildnamen als Keys und Arrays mit dem Pfadnamen das Thumbnails
 | |
|  * und dem Ergebnis von getimagesize() als Werten ist.
 | |
|  */
 | |
| function getThumbNailInfo($galleryname) {
 | |
|   $thumbsizes = array();
 | |
|   $thumbwidthsum = 2;
 | |
|   foreach (glob(realpath(GALLERYPREFIX . DIRECTORY_SEPARATOR .
 | |
|                          $galleryname) . DIRECTORY_SEPARATOR .
 | |
|                 '*.jp{e,}g', GLOB_BRACE) as $filename) {
 | |
|     $basename = basename($filename);
 | |
|     $thumbfile = getScaledImage($galleryname, $basename,
 | |
|                                 $GLOBALS["thumbheight"]);
 | |
|     if ($thumbsize = getimagesize(realpath(GALLERYPREFIX .
 | |
|                                            DIRECTORY_SEPARATOR .
 | |
|                                            $thumbfile))) {
 | |
|       $thumbsizes[$basename] = array($thumbfile, $thumbsize);
 | |
|       $thumbwidthsum = $thumbwidthsum + $thumbsize[0] + 3;
 | |
|     }
 | |
|   }
 | |
|   return array($thumbwidthsum, $galleryname, $thumbsizes);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Gibt die Links zu den existierenden Galerien zurück.
 | |
|  *
 | |
|  * @return Array, welches je Gallerie ein assoziatives Array mit den
 | |
|  * Keys @a gallery, @a label und @a url enthält. Die Labels für die
 | |
|  * Galerien werden aus dem @a title-Feld der @a gallery-Sektion der @c
 | |
|  * galleryinfo.ini ausgelesen. Wenn diese Feld nicht gesetzt ist, wird
 | |
|  * der Galeriename verwendet.
 | |
|  *
 | |
|  * @see galleryExists()
 | |
|  * @see getGalleryConfig()
 | |
|  */
 | |
| function getGalleryLinks() {
 | |
|   $retval = array();
 | |
|   foreach (glob(realpath(GALLERYPREFIX) . DIRECTORY_SEPARATOR . '*',
 | |
|                 GLOB_ONLYDIR) as $directory) {
 | |
|     $basename = basename($directory);
 | |
|     if (galleryExists($basename)) {
 | |
|       $inidata = getGalleryConfig($basename);
 | |
|       if ($inidata[GALLERYSEC]['title']) {
 | |
|         $label = $inidata[GALLERYSEC]['title'];
 | |
|       } else {
 | |
|         $label = $basename;
 | |
|       }
 | |
|       $url = sprintf('index.php?galleryname=%s', urlencode($basename));
 | |
|     }
 | |
|     $retval[] = array('gallery' => $basename,
 | |
|                       'label' => $label,
 | |
|                       'url' => $url);
 | |
|   }
 | |
|   return $retval;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Gibt die Thumbnail-Bilder die in @a $thumbinfo definiert sind aus.
 | |
|  *
 | |
|  * @param &$thumbinfo Referenz auf ein Array, wie es von
 | |
|  * getThumbNailInfo() zurückgegeben wird
 | |
|  *
 | |
|  * @bug die HTML-Ausgabe sollte in die Ausgabeseite verschoben werden
 | |
|  * und diese Funktion nur noch die Daten entsprechend aufbereiten
 | |
|  *
 | |
|  * @see getThumbNailInfo()
 | |
|  */
 | |
| function showThumbnails(&$thumbinfo) {
 | |
|   foreach ($thumbinfo[2] as $basename => $data) {
 | |
|     printf("<div class=\"thumbnail\"><img src=\"%s\" alt=\"\" \"%s\" /></div>",
 | |
|            GALLERYPREFIX . DIRECTORY_SEPARATOR . $data[0],
 | |
|            $data[1][3]);;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Gibt das erste Vorschaubild aus @a $thumbinfo aus.
 | |
|  *
 | |
|  * @param &$thumbinfo Referenz auf ein Array, wie es von
 | |
|  * getThumbNailInfo() zurückgegeben wird
 | |
|  *
 | |
|  * @bug die HTML-Ausgabe sollte in die Ausgabeseite verschoben werden
 | |
|  * und diese Funktion nur noch die Daten entsprechend aufbereiten
 | |
|  *
 | |
|  * @see getThumbNailInfo()
 | |
|  */
 | |
| function showPreview(&$thumbinfo) {
 | |
|   foreach ($thumbinfo[2] as $basename => $data) {
 | |
|     $galleryname = $thumbinfo[1];
 | |
|     $fullname = GALLERYPREFIX . DIRECTORY_SEPARATOR . $galleryname .
 | |
|       DIRECTORY_SEPARATOR . $basename;
 | |
|     $scaledimage = getScaledImage($galleryname, $basename,
 | |
|                                   $GLOBALS["previewwidth"], false);
 | |
|     $scaledimagesize = getimagesize(realpath(GALLERYPREFIX .
 | |
|                                              DIRECTORY_SEPARATOR .
 | |
|                                              $scaledimage));
 | |
|     $label = getImageLabel($galleryname, $basename);
 | |
|     printf('<a  class="lightbox" title="%s" href="%s" rel="lightbox">' .
 | |
|            '<img id="contentimg" src="%s%s%s" alt="%s" %s /></a>',
 | |
|            $label, $fullname, GALLERYPREFIX, DIRECTORY_SEPARATOR,
 | |
|            $scaledimage, $label, $scaledimagesize[3]);
 | |
|     break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Gibt die Beschreibung des ersten Bildes aus @a $thumbinfo aus.
 | |
|  *
 | |
|  * @param &$thumbinfo Referenz auf ein Array, wie es von
 | |
|  * getThumbNailInfo() zurückgegeben wird
 | |
|  *
 | |
|  * @bug die HTML-Ausgabe sollte in die Ausgabeseite verschoben werden
 | |
|  * und diese Funktion nur noch die Daten entsprechend aufbereiten
 | |
|  *
 | |
|  * @see getThumbNailInfo()
 | |
|  */
 | |
| function renderDescription(&$thumbinfo) {
 | |
|   foreach ($thumbinfo[2] as $basename => $data) {
 | |
|     print htmlentities(getImageLabel($thumbinfo[1], $basename));
 | |
|     break;
 | |
|   }
 | |
| }
 |