issue97, add missing DISTINCT keyword to SQL query
[phpfspot.git] / phpfspot.class.php
index 03fe9d487b79112e5e0c91877c892a2ced2ca0ec..c2ec3ac78e381c738b68a169cef3657463bf7f33 100644 (file)
@@ -32,6 +32,8 @@ class PHPFSPOT {
    var $tmpl;
    var $tags;
    var $avail_tags;
+
+   private $runtime_error = false;
    private $dbver;
 
    /**
@@ -45,15 +47,22 @@ class PHPFSPOT {
    {
       $this->cfg = new PHPFSPOT_CFG;
 
+      /* verify config settings */
+      if($this->check_config_options()) {
+         exit(1);
+      }
+
       /* set application name and version information */
       $this->cfg->product = "phpfspot";
-      $this->cfg->version = "1.2";
+      $this->cfg->version = "1.3";
 
       $this->sort_orders= array(
          'date_asc' => 'Date ↑',
          'date_desc' => 'Date ↓',
          'name_asc' => 'Name ↑',
-         'name_desc' => 'Name ↓'
+         'name_desc' => 'Name ↓',
+         'tags_asc' => 'Tags ↑',
+         'tags_desc' => 'Tags ↓',
       );
 
       /* Check necessary requirements */
@@ -865,7 +874,7 @@ class PHPFSPOT {
 
       /* return all available photos */
       $query_str = "
-         SELECT p.id
+         SELECT DISTINCT p.id
          FROM photos p
          LEFT JOIN photo_tags pt
             ON p.id=pt.photo_id
@@ -877,10 +886,10 @@ class PHPFSPOT {
          $query_str.= "WHERE ". $additional_where_cond ." ";
 
       if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
-        if(isset($additional_where_cond))
-           $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
-        else
-           $query_str.= "WHERE t.name IN ('".implode("','",$this->cfg->show_tags). "')";
+         if(isset($additional_where_cond))
+            $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
+         else
+            $query_str.= "WHERE t.name IN ('".implode("','",$this->cfg->show_tags). "')";
       }
  
       if(isset($order_str))
@@ -1124,26 +1133,26 @@ class PHPFSPOT {
       $meta = $this->get_meta_informations($orig_image);
 
       $rotate = 0;
-      $flip = false;
+      $flip_hori = false;
+      $flip_vert = false;
 
       switch($meta['Orientation']) {
-
          case 1: /* top, left */
-            $rotate = 0; $flip = false; break;
+            /* nothing to do */ break;
          case 2: /* top, right */
-            $rotate = 0; $flip = true; break;
+            $rotate = 0; $flip_hori = true; break;
          case 3: /* bottom, left */
-            $rotate = 180; $flip = false; break;
+            $rotate = 180; break;
          case 4: /* bottom, right */
-            $rotate = 180; $flip = true; break;
+            $flip_vert = true; break;
          case 5: /* left side, top */
-            $rotate = 90; $flip = true; break;
+            $rotate = 90; $flip_vert = true; break;
          case 6: /* right side, top */
-            $rotate = 90; $flip = false; break;
+            $rotate = 90; break;
          case 7: /* left side, bottom */
-            $rotate = 270; $flip = true; break;
+            $rotate = 270; $flip_vert = true; break;
          case 8: /* right side, bottom */
-            $rotate = 270; $flip = false; break;
+            $rotate = 270; break;
       }
 
       $src_img = @imagecreatefromjpeg($orig_image);
@@ -1215,12 +1224,14 @@ class PHPFSPOT {
       imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, imagesx($src_img), imagesy($src_img));
 
       /* needs the image to be flipped horizontal? */
-      if($flip) {
-         print "(FLIP)";
-         $image = $dst_img;
-         for($x = 0; $x < $new_w; $x++) {
-            imagecopy($dst_img, $image, $x, 0, $w - $x - 1, 0, 1, $h);
-         }
+      if($flip_hori) {
+         $this->_debug("(FLIP)");
+         $dst_img = $this->flipImage($dst_img, 'hori');
+      }
+      /* needs the image to be flipped vertical? */
+      if($flip_vert) {
+         $this->_debug("(FLIP)");
+         $dst_img = $this->flipImage($dst_img, 'vert');
       }
 
       if($rotate) {
@@ -1536,6 +1547,35 @@ class PHPFSPOT {
 
    } // rotateImage()
 
+   /**
+    * returns flipped image
+    *
+    * this function will return an either horizontal or
+    * vertical flipped truecolor image.
+    */
+   private function flipImage($image, $mode)
+   {
+      $w = imagesx($image);
+      $h = imagesy($image);
+      $flipped = imagecreatetruecolor($w, $h);
+
+      switch($mode) {
+         case 'vert':
+            for ($y = 0; $y < $h; $y++) {
+               imagecopy($flipped, $image, 0, $y, 0, $h - $y - 1, $w, 1);
+            }
+            break;
+         case 'hori':
+            for ($x = 0; $x < $w; $x++) {
+               imagecopy($flipped, $image, $x, 0, $w - $x - 1, 0, 1, $h);
+            }
+            break;
+      }
+
+      return $flipped;
+
+   } // flipImage()
+
    /**
     * return all assigned tags for the specified photo
     */
@@ -1651,9 +1691,10 @@ class PHPFSPOT {
    public function _error($text)
    {
       switch($this->cfg->logging) {
+         default:
          case 'display':
             print "<img src=\"resources/green_info.png\" alt=\"warning\" />\n";
-            print $text;
+            print $text ."<br />\n";
             break;
          case 'errorlog':  
             error_log($text);
@@ -1663,6 +1704,8 @@ class PHPFSPOT {
             break;
       }
 
+      $this->runtime_error = true;
+
    } // _error()
 
    /**
@@ -1991,6 +2034,12 @@ class PHPFSPOT {
                return " ORDER BY basename(p.uri) DESC";
             }
             break;
+         case 'tags_asc':
+            return " ORDER BY t.name ASC ,p.time ASC";
+            break;
+         case 'tags_desc':
+            return " ORDER BY t.name DESC ,p.time ASC";
+            break;
       }
 
    } // get_sort_order()
@@ -2241,6 +2290,86 @@ class PHPFSPOT {
 
    } // parse_uri()
 
+   /**
+    * validate config options
+    *
+    * this function checks if all necessary configuration options are
+    * specified and set.
+    */
+   private function check_config_options()
+   {
+      if(!isset($this->cfg->page_title) || $this->cfg->page_title == "")
+         $this->_error("Please set \$page_title in phpfspot_cfg");
+
+      if(!isset($this->cfg->base_path) || $this->cfg->base_path == "")
+         $this->_error("Please set \$base_path in phpfspot_cfg");
+
+      if(!isset($this->cfg->web_path) || $this->cfg->web_path == "")
+         $this->_error("Please set \$web_path in phpfspot_cfg");
+
+      if(!isset($this->cfg->thumb_path) || $this->cfg->thumb_path == "")
+         $this->_error("Please set \$thumb_path in phpfspot_cfg");
+
+      if(!isset($this->cfg->smarty_path) || $this->cfg->smarty_path == "")
+         $this->_error("Please set \$smarty_path in phpfspot_cfg");
+
+      if(!isset($this->cfg->fspot_db) || $this->cfg->fspot_db == "")
+         $this->_error("Please set \$fspot_db in phpfspot_cfg");
+
+      if(!isset($this->cfg->db_access) || $this->cfg->db_access == "")
+         $this->_error("Please set \$db_access in phpfspot_cfg");
+
+      if(!isset($this->cfg->phpfspot_db) || $this->cfg->phpfspot_db == "")
+         $this->_error("Please set \$phpfspot_db in phpfspot_cfg");
+
+      if(!isset($this->cfg->thumb_width) || $this->cfg->thumb_width == "")
+         $this->_error("Please set \$thumb_width in phpfspot_cfg");
+
+      if(!isset($this->cfg->thumb_height) || $this->cfg->thumb_height == "")
+         $this->_error("Please set \$thumb_height in phpfspot_cfg");
+
+      if(!isset($this->cfg->photo_width) || $this->cfg->photo_width == "")
+         $this->_error("Please set \$photo_width in phpfspot_cfg");
+
+      if(!isset($this->cfg->mini_width) || $this->cfg->mini_width == "")
+         $this->_error("Please set \$mini_width in phpfspot_cfg");
+
+      if(!isset($this->cfg->thumbs_per_page))
+         $this->_error("Please set \$thumbs_per_page in phpfspot_cfg");
+
+      if(!isset($this->cfg->path_replace_from) || $this->cfg->path_replace_from == "")
+         $this->_error("Please set \$path_replace_from in phpfspot_cfg");
+
+      if(!isset($this->cfg->path_replace_to) || $this->cfg->path_replace_to == "")
+         $this->_error("Please set \$path_replace_to in phpfspot_cfg");
+
+      if(!isset($this->cfg->hide_tags))
+         $this->_error("Please set \$hide_tags in phpfspot_cfg");
+
+      if(!isset($this->cfg->theme_name))
+         $this->_error("Please set \$theme_name in phpfspot_cfg");
+
+      if(!isset($this->cfg->logging))
+         $this->_error("Please set \$logging in phpfspot_cfg");
+
+      if(isset($this->cfg->logging) && $this->cfg->logging == 'logfile') {
+
+         if(!isset($this->cfg->log_file))
+            $this->_error("Please set \$log_file because you set logging = log_file in phpfspot_cfg");
+
+         if(!is_writeable($this->cfg->log_file))
+            $this->_error("The specified \$log_file ". $log_file ." is not writeable!");
+
+      }
+
+      /* check for pending slash on web_path */
+      if(!preg_match("/\/$/", $this->web_path))
+         $this->web_path.= "/";
+
+      return $this->runtime_error;
+
+   } // check_config_options()
+
 } // class PHPFSPOT
 
 ?>