jag - just another gallery

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

jag - just another gallery

Beitrag von _Marc » Fr 2. Feb 2007, 23:38

Hallo zusammen,

um der Community auch mal was zurückgeben zu können (*dresch*) stelle ich im Folgenden mein just gebasteltes Galeriemodul zur Verfügung.
Ich weiß, es gibt schon viel in dieser Richtung, aber vielleicht braucht jemand genau das:

Was es kann:

- Auswahl des Bildordners über drop-down
- Anzeige der Bilder inkl Medianotiz
- Vergrößerung über Lightbox mit Bildbeschreibung
- Resize und Wasserzeichen
- Vor- und Zurückblättern :wink:

Was es nicht kann:

- eigentlich alles, es ging mir um eine Galerie, die einigermaßen schlank daherkommt und, einmal konfiguriert, komplett automatisiert läuft.


edit 13.2.2007: Anführungszeichen und neue Beschriftung für vor und zurück
edit 19.2.2007: Endtag </a> bei vorherige Bilder eingefügt, Lightbox-Skript-Aufruf ist jetzt im Modul eingebaut und erwartet das Script im Ordner /js/.



Demo:
http://www.chorakademie.de/chorakademie ... p?idcat=60

Installation:
Bilder in der Dateiverwaltung nach Bedarf beschriften, Wasserzeichen als wasserzeichen.png in /images speichern.
Sonst ist nichts zu beachten.

Download als xml:
http://www.chorakademie.de/info/jag_-_j ... y_1.01.xml


Input

Code: Alles auswählen

?><?php
/***********************************************
* jag - just another gallery 1.01  INPUT
*
* Input basiert auf Bildergalerie
* Author      :     Timo A. Hummel
* Copyright   :     four for business AG
* Created     :     30-09-2005
* modified    :     02-02-2007 by Marc Schettke
************************************************/?>

<table>
 <?php echo '<tr><td>'.mi18n("Verzeichnis auswählen").'</td><td>
      <select name="CMS_VAR[0]" size="1" style="width: 320px">
         <option value="">Nichts ausgewählt</option>';
         recursive_list($cfgClient[$client]["upl"]["path"], '\__');
   echo '</select></td></tr>';?>
  <tr>
    <td><?php echo "Größe Vorschaubilder <br> (Breite x Höhe)";?></td>
    <td><input type="text" size="5" name="<?php echo "CMS_VAR[1]"; ?>" value="<?php echo "CMS_VALUE[1]"; ?>"> x
    <input type="text" size="5" name="<?php echo "CMS_VAR[2]"; ?>" value="<?php echo "CMS_VALUE[2]"; ?>"></td>
  </tr>
 
  <tr>
    <td><?php echo "Vorschautabelle <br> (Spalten x Zeilen)";?></td>
    <td><input type="text" size="5" name="<?php echo "CMS_VAR[3]"; ?>" value="<?php echo "CMS_VALUE[3]"; ?>"> x
    <input type="text" size="5" name="<?php echo "CMS_VAR[4]"; ?>" value="<?php echo "CMS_VALUE[4]"; ?>">
    </td>
  </tr>
  <tr>
    <td><?php echo "Breite Detailansicht";?></td>
    <td><input type="text" name="<?php echo "CMS_VAR[5]"; ?>" value="<?php echo "CMS_VALUE[5]"; ?>"></td>
  </tr>
  <!--  <tr>
   <td><?php echo "Sortierung";?></td>
   <td>   
   <select name="<?php echo "CMS_VAR[6]"; ?>" value="<?php echo "CMS_VALUE[6]"; ?>">     
      <option value=Dateiname>Dateiname</option>
      <option value=Medienname>Medienname</option>
      <option value=Beschreibung>Beschreibung</option>
      <option value=Schluesselwoerter>Schluesselwoerter</option>
      <option value=Internenotiz>Internenotiz</option>
   </select>
   </td>
</tr> -->
 
   
</table>
<?php

//Build folder list recursively
function recursive_list($sPathDir, $sPrefix, $sPathBase = 0) {
  if (!$sPathBase) { $sPathBase = $sPathDir; } //Basispfad sichern
 
   $sSelected = "CMS_VALUE[0]";
   $old_path = getcwd();

   if (is_dir($sPathDir)) {
      chdir($sPathDir);
      $myhandle = opendir('.');

      while (($mydir = readdir($myhandle)) !== false) {
         if (($mydir != ".") && ($mydir != "..") && ($mydir != "thumbs")) {
            if (is_dir($mydir)) {
              $cleandir =  str_replace($sPathBase, '', $sPathDir.$mydir);       
               if ($sSelected == $cleandir.'/') {
                  echo '<option selected value="'.$cleandir.'/">'.$sPrefix.$mydir.'</option>';
               } else {
                  echo '<option value="'.$cleandir.'/">'.$sPrefix.$mydir.'</option>';
               }
               recursive_list($sPathDir.$mydir."/", '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$sPrefix, $sPathBase);
               chdir($sPathDir);
            }
         }
      }
      closedir($myhandle);
   }

   chdir($old_path);
   return;
} 
Output

Code: Alles auswählen

<?php
/***********************************************
* jag - just another gallery 1.01 OUTPUT
*
* Author      :     Marc Schettke / Codeschnipsel: Timo Hummel, Large Green Wood
* Created     :     31-01-2007
************************************************/
?>
<script type="text/javascript" src="js/lightbox.js"></script>
<style>
#lightbox{
   background-color:#eee;
   padding: 10px;
   border-bottom: 2px solid #666;
   border-right: 2px solid #666;
   }
#lightboxDetails{
   font-size: 0.8em;
   padding-top: 0.4em;
   }   
#lightboxCaption{ float: left; }
#keyboardMsg{ float: right; }

#lightbox img{ border: none; }
#overlay img{ border: none; }
</style>

<?php

cInclude("includes", "functions.api.images.php");
cInclude("classes", "class.ui.php");
cInclude("classes", "class.htmlelements.php");
cInclude("classes", "class.properties.php");
cInclude("includes", "functions.upl.php");
$properties = new PropertyCollection;

$imageDir="CMS_VALUE[0]";

$thbXSize="CMS_VALUE[1]";
$thbYSize="CMS_VALUE[2]";

$cols="CMS_VALUE[3]";
$rows="CMS_VALUE[4]";

$detailSize="CMS_VALUE[5]";
/***** EINSTELLUNGEN ***********/
$thbDir = $imageDir.'thumbs/';
$validExtensions = array (
   "jpg",
   "jpeg",
   "gif",
   "png"
);

// Verzeichnis auslesen
if ($dir = opendir($cfgClient[$client]['upl']['path'].$imageDir))
{
  $imageFiles = array();
  while (false !== ($file = readdir($dir))) {
    if ($file != "." && $file != "..") {
    array_push($imageFiles, $file);
    }
  }
  closedir($dir);
}
   
if (is_array($imageFiles)) {
// Bilder mit falscher Dateiendung aussortieren
  foreach ($imageFiles as $key => $imageFile) {
    $fileExtension = strtolower(getFileExtension($imageFile));
    if (!in_array($fileExtension, $validExtensions)) {
      unset ($imageFiles[$key]); 
      }
    }
// anzuzeigende Bilder filtern

  $imagesPerPage = $rows * $cols;
  $fileCount = count($imageFiles);
  $pages = ceil($fileCount / $imagesPerPage);
 
    if (!isset($page) || $page>$pages || $page<1) {$page = 1;}
  $imagesToDisplay = array_slice($imageFiles, ($page -1) * $imagesPerPage, $imagesPerPage);


// Array mit allen Bildattributen erstellen
  $galleryArray = array();
  foreach ($imagesToDisplay as $file) {
    $imageAttributes = array (file => $file,
                              medianame => getMedianame($imageDir.$file),
                              description => getImageDescription($imageDir,$file),
                              keywords => getKeywords($imageDir.$file),
                              medianotes => getMedianotes($imageDir.$file));
    array_push($galleryArray, $imageAttributes);
  }
} else {
echo "In dieser Galerie wurden keine Bilder hinterlegt!";
}
// Thumbnails generieren und Bilder verkleinern (wenn nötig)
foreach ($galleryArray as $key => $image) {
 $imgPath = $cfgClient[$client]['upl']['path'].$imageDir.$image['file'];
 $thbPath = $cfgClient[$client]['upl']['path'].$imageDir.'thumbs/thb_'.$image['file'];
 if (!is_dir($cfgClient[$client]['upl']['path'].$imageDir.'thumbs/'))
      { @mkdir($cfgClient[$client]['upl']['path'].$imageDir.'thumbs/');}
        if (!file_exists($thbPath) ) { 
          // Thumbnails mit GD verkleinern
          @ini_set("max_execution_time", 120);
          @resizeImageGD($imgPath, $thbPath, $thbXSize,$thbYSize);
         $thumbnail=file_exists($thbPath);
          //Wasserzeichen einbauen und Bilder verkleinern
               $size        = getimagesize($imgPath);   
               $width_old   = $size[0];   
               $height_old  = $size[1];
               $old_picture = imagecreatefromjpeg($imgPath);
                   
                if ($width_old > $height_old) {       
                   $width_new  = $detailSize;       
                   $height_new = intval($height_old * $width_new / $width_old);   
                   }
                   else {       
                   $height_new = $detailSize;       
                   $width_new  = intval($width_old * $height_new / $height_old);   
                   }
                if ($height_new > $height_old || $width_new > $width_old) {
                    $height_new = $height_old;
                    $width_new = $width_old;
                    }   
                $new_picture = imagecreatetruecolor($width_new, $height_new);
               
             imagecopyresampled($new_picture, $old_picture, 0, 0, 0, 0, $width_new, $height_new, $width_old, $height_old);   
               $transition          = 40;   
                $watermarkfile       = imagecreatefrompng('images/wasserzeichen.png');   
                $watermarkpic_width  = imagesx($watermarkfile);   
                $watermarkpic_height = imagesy($watermarkfile);   
                $watermarkdest_x     = $width_new - $watermarkpic_width - 5;
                $watermarkdest_y     = $height_new - $watermarkpic_height - 5;   
               imagecopymerge($new_picture, $watermarkfile, $watermarkdest_x, $watermarkdest_y, 0, 0, $watermarkpic_width, $watermarkpic_height, $transition);   
               imagejpeg($new_picture, $imgPath, 100);
        }
        else {
        $thumbnail=true;
        } 
}

$thbDir = $cfgClient[$client]['upl']['htmlpath'].$imageDir.'thumbs/';
$imgDir = $cfgClient[$client]['upl']['htmlpath'].$imageDir;
$linkNext = $cfgClient[$client]["path"]["htmlpath"] . sprintf("front_content.php?idcatart=%s&page=%s", $idcatart, $page+1);
$linkPrev = $cfgClient[$client]["path"]["htmlpath"] . sprintf("front_content.php?idcatart=%s&page=%s", $idcatart, $page-1);
reset($galleryArray);
echo "<h1>CMS_HTMLHEAD[1]</h1>";
echo '<table><tr><td>
      zeige Bilder: '.($imagesPerPage*($page-1)+1).' - '.($imagesPerPage*($page-1)+$imagesPerPage).'</td>';
if($page>1) {
  echo '<td><a href="'.$linkPrev.'">... vorherige Bilder </a></td>';}
echo '<td>';
if ($pages>$page){
  echo '<a href="'.$linkNext.'"> weitere Bilder...</a>';}
echo '</td></tr>';
for($i=$rows;$i>0;$i--) { 
  echo "<tr name='$i'>";
    for($j=$cols;$j>0;$j--){
      if($img = each ($galleryArray)){
      echo '<td name='.$j.'><div class="galleryImg">
            <a href="'.
            $imgDir.$img[1]['file'].'" rel="lightbox" target="_blank" title="'.
            $img[1]['description'].'"><img src="'.$thbDir.'thb_'.$img[1]['file'].'"></a><br>'.
            $img[1]['medianame'].'</div></td>';
      } else {
      break;
      }
    }
  echo "</tr>";
}
echo '</table>';

/*********** FUNKTIONEN *****************/
function getKeywords($wname) {
   //schluesselwoerter   keywords   $keywords   
   global $properties;
   $keywords = $properties->getValue("upload", $wname, "file", "keywords");
   return $keywords;
}
function getMedianame($wname) {
   global $properties;
   $medianame = $properties->getValue("upload", $wname, "file", "medianame");
   return $medianame;
}
function getMedianotes($wname) {
   //internenotiz      medianotes   $medianotes
   global $properties;
   $medianotes = $properties->getValue("upload", $wname, "file", "medianotes");
   return $medianotes;
}
function getImageDescription($dirname,$filename){
   global $cfg, $cfgClient, $db, $client, $lang;
   $query = "SELECT description FROM ".$cfg["tab"]["upl"]." WHERE (dirname = '".$dirname."') AND (filename='".$filename."')";
   $db->query($query);
   if($db->next_record()){
      return htmlspecialchars(urldecode($db->f("description")));
   }else {
      return '';
   }
}
// verkleinert ein Bild auf die angegebene Breite (bei Querformat) oder Höhe (bei Hochformat)
// Seitenverhältnisse werden beibehalten
function resizeImageGD($sourceFile, $targetFile, $newwidth=50, $newheight=50){
   $source = ImageCreateFromJpeg($sourceFile);
   $width  = ImageSx($source);
   $height = ImageSy($source);
   if ($width > $height){ // Querformat
      $newheight = $height*($newwidth/$width);
   }else{ // Hochformat
      $newwidth  = $width*($newheight/$height);
   }
   $target = ImageCreateTrueColor($newwidth,$newheight);
   // ÄNDERUNG vgl. Forums-Beitrag imagecopyresized ($target, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
   imagecopyresampled ($target, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
   ImageJPEG($target,$targetFile,100);
}
?>


Wenn Euch Unsauberheiten im Programmcode auffallen, bitte Bescheid sagen!
ToDo: Sortierfunktion einarbeiten, Überschrift(?)


Viele Grüße
_Marc
Zuletzt geändert von _Marc am Mo 19. Feb 2007, 19:41, insgesamt 7-mal geändert.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 3. Feb 2007, 16:08

ich würd den namen ändern
nicht "galery" sondern "gallery"
*** make your own tools (wishlist :: thx)

Docsam
Beiträge: 13
Registriert: Sa 3. Feb 2007, 19:42
Kontaktdaten:

Beitrag von Docsam » Sa 3. Feb 2007, 20:56

bin gerad dabei das Modul zu testen. Also beim Verlinken der Bilder im Outputmodul hast Du nen Tippfehler beim Dateinamen.

$img[1]['description'].'"><img src="'.$thbDir.'thb_'.$img[1]['file'].'"><br>'.

(tbh hattest du geschrieben).

Ansonsten zeigt er mir noch nicht die Bilder an :-) bin aber noch am Suchen.[/code]

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Beitrag von _Marc » So 4. Feb 2007, 12:43

Hallo,

schande über mein Haupt, da wollte ich mal englisch sprechen und dann :?
Und Rechtschreibfehler sind eigentlich auch nicht mein Ding, nuja, manchmal passierts doch.

Hab die Sachen natürlich korrigiert,

danke für die Anmerkungen!

Grüße
_Marc

Docsam
Beiträge: 13
Registriert: Sa 3. Feb 2007, 19:42
Kontaktdaten:

Beitrag von Docsam » So 4. Feb 2007, 13:18

kein Problem - habs zum Laufen bekommen. Das ganze gefällt mir super. Danke dafür.

Mein Problem war jetzt übrigens noch, das die angefassten Bilder die falschen Rechte im Dateisystem bekommen haben. Hatte es jetzt erstmal über den FTP-Client korriegiert, aber denke sollte sich auch problemlos im Script lösen lassen.

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Beitrag von _Marc » So 4. Feb 2007, 13:52

Schön, dass es jemandem hilft!

Das mit den Dateirechten schaue ich mir gleich mal an.
Ich habe bei einigen Bildern noch Probleme damit, dass mir GD unterstellt es seien keine jpg-Dateien, die erstellten Bilder sind dann einfach nur schwarz. Ist Dir so etwas auch aufgefallen?

Desweiteren bricht 1und1 die Verarbeitung von großen Dateien ab (wie in anderem Thread beschrieben), im Moment muss ich mir damit behelfen, so oft zu aktualisieren, bis alle Bilder verkleinert worden sind. Es gibt bestimmt eine bessere Methode, nur ist sie mir noch nicht eingefallen.

Viele Grüße
_Marc

Docsam
Beiträge: 13
Registriert: Sa 3. Feb 2007, 19:42
Kontaktdaten:

Beitrag von Docsam » Mo 5. Feb 2007, 00:28

keinerlei probleme (bin aber bei domainfactory) mit der verarbeitung nun. Die Dateirechte stimmen auch - weiss nicht woran das lag.

werde aber mal mit grösseren Bildern testen.
Gruß
Jens

Docsam
Beiträge: 13
Registriert: Sa 3. Feb 2007, 19:42
Kontaktdaten:

Beitrag von Docsam » Di 13. Feb 2007, 12:36

so hab noch 2 kleine Dinge gefunden beim Validieren.

bei den Vor&Zurück-Verweisen fehlten die Anführungszeichen für den link

Code: Alles auswählen

if($page>1) {
  echo '<a href="'.$linkPrev.'">zurück</a>';}</code>

Arbeitest Du daran noch weiter? Was mir noch fehlen würde, wären Templates, das man nicht den Code anfassen muss. 

Wenn Du magst, erweitere ich das ganze um die Funktion. 

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Beitrag von _Marc » Di 13. Feb 2007, 13:49

Tag Jens,

vielen Dank für den Hinweise, Anführungsstriche sind eingefügt und Modul ist aktualisiert.

Eigentlich bin ich kein großer Anhänger von Templates, weiß auch nicht woher das kommt, vermutlich weil man dann wieder 1-5 Dateien mehr hat die man installieren, konfigurieren und aktuell halten muss.
m.M. nach ist die Galerie noch nicht so komplex als dass man das mit Templates realisieren müsste, ich ziehe eine einfache Tabelle und alles weiter e über css vor. Allerdings gibt es sicherlich einige, die lieber mit Templates arbeiten, gerade wenn man nicht in php träumt oder es fließend spricht.
Wenn von anderer Seite noch Interesse an einer Templateumsetzung besteht, können wir das hier gerne ersetzen oder zweigleisig fahren.

Grüße
_Marc

Docsam
Beiträge: 13
Registriert: Sa 3. Feb 2007, 19:42
Kontaktdaten:

Beitrag von Docsam » Di 13. Feb 2007, 14:36

hatte noch was vergessen, bei dem Vor-Link (weitere Bilder) fehlt das </a> Tag.

Du hast schon recht, mit dem Argument, das es so schneller installiert ist, nur muss man halt das Modul für jede Seite neu anpassen - bei Templates hat man nur eine Modulversion zu pflegen mit unterschiedlichen Template-Dateien.

Schade eigentlich, das so wenig Resonanz hier ist.

paul.bernhard
Beiträge: 5
Registriert: Mi 14. Feb 2007, 21:54
Kontaktdaten:

Beitrag von paul.bernhard » So 18. Feb 2007, 18:44

Hallo!

Ich bin neu hier im Forum.
Habe dein Modul ausprobiert und es gefällt mir sehr gut. Habe nur 2 Probleme:

Bei den Thumbnails bekommen ich nur ein "X"...
und das Wasserzeichen... habs mittlerweile aus dem Code genommen jedoch habe ich trotzdem noch immer auf der HP das Wasserzeichen in den Bildern. Habe die Bilder sogar nochmal neu über ftp upgeloadet. hat aber auch nichts geholfen...

lG Pauli

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Beitrag von _Marc » Mo 19. Feb 2007, 14:03

Hallo zusammen,

@paul.bernhard: komische Phänomene. Bitte schau mal den Pfad zu den Thumbnails nach und prüfe ob sie erzeugt worden sind. Ich tippe darauf, dass es sie gibt, aber der falsche Pfad ausgegeben wird.
Was genau hast Du aus dem Code genommen? Das einfachste ist vermutlich die Datei mit dem Wasserzeichen zu löschen/umzubenennen. Sollte/n ich/wir das Modul noch weiter entwickeln wäre sicherlich eine Konfigurationsvariable oder eine Einstellmöglichkeit in der Modulkonfiguration denkbar.
Bitte poste auch mal die relevanten Teile aus dem Errorlog, falls dort was steht.

@Docsam: Ich setze gerne sämtliche Module ohne Templates um, weil die Serverperformance von 1und1, wo der Internetauftritt für den ich das Modul entwickelt habe, eh schon schlecht genug ist, da muss ich den Server nicht noch zusätzlich mit der Templateabarbeitung belasten.
Allerdings sind Deine Argumente auch richtig und wichtig, es hängt jetzt also von der weiteren Resonanz ab. Wenn keiner außer uns dreien das Modul einsetzt, kann sicher jeder seine Output-Szenarien so basteln wie er will und der Core wird zentral gepflegt. Sollte es noch andere Nutzer geben, die lieber Templates hätten wäre ich bereit das Modul umzuschreiben (oder von Dir umschreiben zu lassen?).

Viele Grüße
Marc

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Re: jag - just another gallery

Beitrag von _Marc » Mo 19. Feb 2007, 14:04

Endtag eingefügt und xml aktualisiert

coolbyte
Beiträge: 11
Registriert: Di 12. Sep 2006, 20:05
Kontaktdaten:

_Mark

Beitrag von coolbyte » Mo 19. Feb 2007, 18:44

Diese gefällt mir auch sehr gut....RESPEKT....

Werde ich mal testen....

Eine kurze Frage:
Installation:
Für PopUp-Funktion Lightbox-Script irgendwo einbinden (http://www.huddletogether.com/projects/lightbox/),
Wo soll das am Besten eingebunden werden ???

Gruß
Thorsten

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Beitrag von _Marc » Mo 19. Feb 2007, 19:41

Hi,

hab die Skripteinbindung jetzt mit ins Modul genommen, damit das Skript erst dann geladen wird wenn mans auch braucht (u.a. wegen der Ladegrafik bei ausgeschaltetem css), hatte ich vorher nicht gemacht weils Probleme mit dem Java-Editor gab, der ist jetzt wieder aus.

Den Satz nehme ich aus dem ersten Beitrag raus.

Grüße
Marc

Gesperrt