issue implode() instead of looping around an array, arun
[phpfspot.git] / phpfspot.class.php
index 818aca658730bf4e0468a9735711abc612ebafc7..d67c7e39dc4f1b1543296ce209ed7e0071a4beaa 100644 (file)
@@ -1,8 +1,28 @@
 <?php
 
 <?php
 
+/***************************************************************************
+ *
+ * Copyright (c) by Andreas Unterkircher, unki@netshadow.at
+ * All rights reserved
+ *
+ *  This program 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 2 of the License, or
+ *  any later version.
+ *
+ *  This program 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 this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ ***************************************************************************/
+
 require_once "phpfspot_cfg.php";
 require_once "phpfspot_db.php";
 require_once "phpfspot_cfg.php";
 require_once "phpfspot_db.php";
-require_once "phpfspot_tmpl.php";
 
 class PHPFSPOT {
 
 
 class PHPFSPOT {
 
@@ -12,21 +32,48 @@ class PHPFSPOT {
    var $tmpl;
    var $tags;
    var $avail_tags;
    var $tmpl;
    var $tags;
    var $avail_tags;
-   var $current_tags;
 
 
+   /**
+    * class constructor
+    *
+    * this function will be called on class construct
+    * and will check requirements, loads configuration,
+    * open databases and start the user session
+    */
    public function __construct()
    {
    public function __construct()
    {
+      $this->cfg = new PHPFSPOT_CFG;
+
+      /* set application name and version information */
+      $this->cfg->product = "phpfspot";
+      $this->cfg->version = "1.2";
+
       /* Check necessary requirements */
       if(!$this->checkRequirements()) {
          exit(1);
       }
 
       /* Check necessary requirements */
       if(!$this->checkRequirements()) {
          exit(1);
       }
 
-      $this->cfg = new PHPFSPOT_CFG;
-
-      $this->db  = new PHPFSPOT_DB(&$this, $this->cfg->fspot_db);
-      $this->cfg_db = new PHPFSPOT_DB(&$this, $this->cfg->phpfspot_db);
+      $this->db  = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
+      
+      if(!is_writeable(dirname($this->cfg->phpfspot_db))) {
+         print dirname($this->cfg->phpfspot_db) .": directory is not writeable!";
+         exit(1);
+      }
+         
+      $this->cfg_db = new PHPFSPOT_DB($this, $this->cfg->phpfspot_db);
+      if(!is_writeable($this->cfg->phpfspot_db)) {
+         print $this->cfg->phpfspot_db ." is not writeable for user ". $this->getuid() ."\n";
+         exit(1);
+      }
       $this->check_config_table();
 
       $this->check_config_table();
 
+      /* include Smarty template engine */
+      if(!$this->check_readable($this->cfg->smarty_path .'/libs/Smarty.class.php')) {
+         exit(1);
+      }
+      require $this->cfg->smarty_path .'/libs/Smarty.class.php';
+      /* overload Smarty class if our own template handler */
+      require_once "phpfspot_tmpl.php";
       $this->tmpl = new PHPFSPOT_TMPL($this);
 
       $this->get_tags();
       $this->tmpl = new PHPFSPOT_TMPL($this);
 
       $this->get_tags();
@@ -36,6 +83,9 @@ class PHPFSPOT {
       if(!isset($_SESSION['tag_condition']))
          $_SESSION['tag_condition'] = 'or';
 
       if(!isset($_SESSION['tag_condition']))
          $_SESSION['tag_condition'] = 'or';
 
+      if(!isset($_SESSION['sort_order']))
+         $_SESSION['sort_order'] = 'date_asc';
+
       if(!isset($_SESSION['searchfor']))
          $_SESSION['searchfor'] = '';
 
       if(!isset($_SESSION['searchfor']))
          $_SESSION['searchfor'] = '';
 
@@ -50,29 +100,99 @@ class PHPFSPOT {
 
    } // __destruct()
 
 
    } // __destruct()
 
+   /**
+    * show - generate html output
+    *
+    * this function can be called after the constructor has
+    * prepared everyhing. it will load the index.tpl smarty
+    * template. if necessary it will registere pre-selects
+    * (photo index, photo, tag search, date search) into
+    * users session.
+    */
    public function show()
    {
       $this->tmpl->assign('searchfor', $_SESSION['searchfor']);
       $this->tmpl->assign('page_title', $this->cfg->page_title);
       $this->tmpl->assign('current_condition', $_SESSION['tag_condition']);
    public function show()
    {
       $this->tmpl->assign('searchfor', $_SESSION['searchfor']);
       $this->tmpl->assign('page_title', $this->cfg->page_title);
       $this->tmpl->assign('current_condition', $_SESSION['tag_condition']);
+      $this->tmpl->assign('template_path', 'themes/'. $this->cfg->theme_name);
+
+      $_SESSION['start_action'] = $_GET['mode'];
 
       switch($_GET['mode']) {
          case 'showpi':
             if(isset($_GET['tags'])) {
 
       switch($_GET['mode']) {
          case 'showpi':
             if(isset($_GET['tags'])) {
-               $_SESSION['selected_tags'] = split(',', $_GET['tags']);
+               $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
+            }
+            if(isset($_GET['from_date']) && $this->isValidDate($_GET['from_date'])) {
+               $_SESSION['from_date'] = strtotime($_GET['from_date'] ." 00:00:00");
+            }
+            if(isset($_GET['to_date']) && $this->isValidDate($_GET['to_date'])) {
+               $_SESSION['to_date'] = strtotime($_GET['to_date'] ." 23:59:59");
+            }
+            break;
+         case 'showp':
+            if(isset($_GET['tags'])) {
+               $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
+               $_SESSION['start_action'] = 'showp';
+            }
+            if(isset($_GET['id']) && is_numeric($_GET['id'])) {
+               $_SESSION['current_photo'] = $_GET['id'];
+               $_SESSION['start_action'] = 'showp';
+            }
+            if(isset($_GET['from_date']) && $this->isValidDate($_GET['from_date'])) {
+               $_SESSION['from_date'] = strtotime($_GET['from_date']);
+            }
+            if(isset($_GET['to_date']) && $this->isValidDate($_GET['to_date'])) {
+               $_SESSION['to_date'] = strtotime($_GET['to_date']);
+            }
+            break;
+         case 'export':
+            $this->tmpl->show("export.tpl");
+            return;
+            break;
+         case 'slideshow':
+            $this->tmpl->show("slideshow.tpl");
+            return;
+            break;
+         case 'rss':
+            if(isset($_GET['tags'])) {
+               $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
             }
             }
+            if(isset($_GET['from_date']) && $this->isValidDate($_GET['from_date'])) {
+               $_SESSION['from_date'] = strtotime($_GET['from_date'] ." 00:00:00");
+            }
+            if(isset($_GET['to_date']) && $this->isValidDate($_GET['to_date'])) {
+               $_SESSION['to_date'] = strtotime($_GET['to_date'] ." 23:59:59");
+            }
+            $this->getRSSFeed();
+            return;
             break;
       }
 
             break;
       }
 
+      if(isset($_SESSION['from_date']) && isset($_SESSION['to_date']))
+         $this->tmpl->assign('date_search_enabled', true);
+
+      $this->tmpl->assign('from_date', $this->get_calendar('from'));
+      $this->tmpl->assign('to_date', $this->get_calendar('to'));
+      $this->tmpl->assign('sort_field', $this->get_sort_field());
       $this->tmpl->assign('content_page', 'welcome.tpl');
       $this->tmpl->show("index.tpl");
 
       $this->tmpl->assign('content_page', 'welcome.tpl');
       $this->tmpl->show("index.tpl");
 
-
    } // show()
 
    } // show()
 
+   /**
+    * get_tags - grab all tags of f-spot's database
+    *
+    * this function will get all available tags from
+    * the f-spot database and store them within two
+    * arrays within this class for later usage. in
+    * fact, if the user requests (hide_tags) it will
+    * opt-out some of them.
+    *
+    * this function is getting called once by show()
+    */
    private function get_tags()
    {
    private function get_tags()
    {
-   
       $this->avail_tags = Array();
       $count = 0;
    
       $this->avail_tags = Array();
       $count = 0;
    
@@ -87,49 +207,135 @@ class PHPFSPOT {
          $tag_id = $row['id'];
          $tag_name = $row['name'];
 
          $tag_id = $row['id'];
          $tag_name = $row['name'];
 
-         /* check if config requests to ignore this tag */
+         /* if the user has specified to ignore this tag in phpfspot's
+            configuration, ignore it here so it does not get added to
+            the tag list.
+         */
          if(in_array($row['name'], $this->cfg->hide_tags))
             continue;
 
          if(in_array($row['name'], $this->cfg->hide_tags))
             continue;
 
+         /* if the user has specified to only show certain tags which
+            are specified in phpfspot's configuration, ignore all others
+            so they will not be added to the tag list.
+         */
+         if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags) &&
+            !in_array($row['name'], $this->cfg->show_tags))
+            continue;
+
          $this->tags[$tag_id] = $tag_name; 
          $this->avail_tags[$count] = $tag_id;
          $this->tags[$tag_id] = $tag_name; 
          $this->avail_tags[$count] = $tag_id;
-
          $count++;
 
       }
 
    } // get_tags()
 
          $count++;
 
       }
 
    } // get_tags()
 
+   /** 
+    * extract all photo details
+    * 
+    * retrieve all available details from f-spot's
+    * database and return them as object
+    */
    public function get_photo_details($idx)
    {
    public function get_photo_details($idx)
    {
-      $result = $this->db->db_query("
-         SELECT *
-         FROM photos
-         WHERE id='". $idx ."'
-      ");