set everywhere the correct path to scripts, stylesheets, images, ...
[phpfspot.git] / phpfspot.class.php
index 5e641172d6c0157cb0ec1d2a3892cb3961bc5a8a..8305ba5ba7289cddcc112d70f28065f542ed2da7 100644 (file)
@@ -2,8 +2,9 @@
 
 /***************************************************************************
  *
- * Copyright (c) by Andreas Unterkircher, unki@netshadow.at
- * All rights reserved
+ * phpfspot, presents your F-Spot photo collection in Web browsers.
+ *
+ * Copyright (c) by Andreas Unterkircher
  *
  *  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
 require_once "phpfspot_cfg.php";
 require_once "phpfspot_db.php";
 
+/**
+ * PHPFSPOT main class
+ *
+ * this class contains the most functions which will to the major
+ * work for phpfspot.
+ *
+ * @package phpfspot
+ */
 class PHPFSPOT {
 
+   /**
+     * phpfspot configuration
+     * @access public
+     * @see PHPFSPOT_CFG()
+     * @var PHPFSPOT_CFG
+     */
    var $cfg;
+
+   /**
+     * SQLite database handle to f-spot database
+     * @see PHPFSPOT_DB()
+     * @access public
+     * @var PHPFSPOT_DB
+     */
    var $db;
+
+   /**
+     * SQLite database handle to phpfspot database
+     * @see PHPFSPOT_DB()
+     * @access public
+     * @var PHPFSPOT_DB
+     */
    var $cfg_db;
+
+   /**
+    * Smarty template engine
+    * @link http://smarty.php.net smarty.php.net
+    * @see PHPFSPOT_TMPL()
+    * @access public
+    * @var PHPFSPOT_TMPL
+    */
    var $tmpl;
+
+   /**
+    * full tag - list
+    * @access public
+    * @var array
+    */
    var $tags;
+
+   /**
+    * list of available, not-selected, tags
+    * @access public
+    * @var array
+    */
    var $avail_tags;
+
+   /**
+    * true if runtime error occued
+    * @access private
+    * @var boolean
+    */
+   private $runtime_error = false;
+
+   /**
+    * F-Spot database version
+    * @access private
+    * @var integer
+    */
    private $dbver;
 
    /**
-    * class constructor
+    * class constructor ($cfg, $db, $cfg_db, $tmpl, $db_ver)
     *
     * this function will be called on class construct
     * and will check requirements, loads configuration,
@@ -43,62 +105,122 @@ class PHPFSPOT {
     */
    public function __construct()
    {
+      /**
+       * register PHPFSPOT class global
+       *
+       * @global PHPFSPOT $GLOBALS['phpfspot']
+       * @name $phpfspot
+       */
+      $GLOBALS['phpfspot'] =& $this;
+
       $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.5";
+
+      $this->sort_orders= array(
+         'date_asc' => 'Date ↑',
+         'date_desc' => 'Date ↓',
+         'name_asc' => 'Name ↑',
+         'name_desc' => 'Name ↓',
+         'tags_asc' => 'Tags ↑',
+         'tags_desc' => 'Tags ↓',
+      );
 
       /* Check necessary requirements */
-      if(!$this->checkRequirements()) {
+      if(!$this->check_requirements()) {
          exit(1);
       }
 
-      $this->db  = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
+      /******* Opening F-Spot's sqlite database *********/
+
+      /* Check if database file is writeable */
       if(!is_writeable($this->cfg->fspot_db)) {
          print $this->cfg->fspot_db ." is not writeable for user ". $this->getuid() ."\n";
          exit(1);
       }
 
+      /* open the database */
+      $this->db  = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
+
+      /* change sqlite temp directory, if requested */
+      if(isset($this->cfg->sqlite_temp_dir)) {
+         $this->db->db_exec("
+            PRAGMA
+               temp_store_directory = '". $this->cfg->sqlite_temp_dir ."'
+         ");
+      }
+
       $this->dbver = $this->getFspotDBVersion();
 
+      if(!is_writeable($this->cfg->base_path ."/templates_c")) {
+         print $this->cfg->base_path ."/templates_c: directory is not writeable for user ". $this->getuid() ."\n";
+         exit(1);
+      }
+
+      if(!is_writeable($this->cfg->thumb_path)) {
+         print $this->cfg->thumb_path .": directory is not writeable for user ". $this->getuid() ."\n";
+         exit(1);
+      }
+
+      /******* Opening phpfspot's sqlite database *********/
+
+      /* Check if directory where the database file is stored is writeable  */
       if(!is_writeable(dirname($this->cfg->phpfspot_db))) {
-         print dirname($this->cfg->phpfspot_db) .": directory is not writeable!";
+         print dirname($this->cfg->phpfspot_db) .": directory is not writeable for user ". $this->getuid() ."\n";
          exit(1);
       }
-         
-      $this->cfg_db = new PHPFSPOT_DB($this, $this->cfg->phpfspot_db);
+
+      /* Check if database file is writeable */
       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();
 
-      /* include Smarty template engine */
-      if(!$this->check_readable($this->cfg->smarty_path .'/libs/Smarty.class.php')) {
-         exit(1);
+      /* open the database */
+      $this->cfg_db = new PHPFSPOT_DB($this, $this->cfg->phpfspot_db);
+
+      /* change sqlite temp directory, if requested */
+      if(isset($this->cfg->sqlite_temp_dir)) {
+         $this->cfg_db->db_exec("
+            PRAGMA
+               temp_store_directory = '". $this->cfg->sqlite_temp_dir ."'
+         ");
       }
-      require $this->cfg->smarty_path .'/libs/Smarty.class.php';
-      /* overload Smarty class if our own template handler */
+
+      /* Check if some tables need to be created */
+      $this->check_config_table();
+
+      /* overload Smarty class with our own template handler */
       require_once "phpfspot_tmpl.php";
-      $this->tmpl = new PHPFSPOT_TMPL($this);
+      $this->tmpl = new PHPFSPOT_TMPL();
+
+      $this->tmpl->assign('web_path', $this->cfg->web_path);
 
       /* check if all necessary indices exist */
       $this->checkDbIndices();
 
-      session_start();
+      /* if session is not yet started, do it now */
+      if(session_id() == "")
+         session_start();
 
       if(!isset($_SESSION['tag_condition']))
          $_SESSION['tag_condition'] = 'or';
 
       if(!isset($_SESSION['sort_order']))
-         $_SESSION['sort_order'] = 'date_asc';
+         $_SESSION['sort_order'] = 'date_desc';
 
-      if(!isset($_SESSION['searchfor']))
-         $_SESSION['searchfor'] = '';
+      if(!isset($_SESSION['searchfor_tag']))
+         $_SESSION['searchfor_tag'] = '';
 
-      // if begin_with is still set but rows_per_page is now 0, unset it
-      if(isset($_SESSION['begin_with']) && $this->cfg->rows_per_page == 0)
+      // if begin_with is still set but thumbs_per_page is now 0, unset it
+      if(isset($_SESSION['begin_with']) && $this->cfg->thumbs_per_page == 0)
          unset($_SESSION['begin_with']);
 
    } // __construct()
@@ -119,71 +241,84 @@ class PHPFSPOT {
     */
    public function show()
    {
-      $this->tmpl->assign('searchfor', $_SESSION['searchfor']);
+      $this->tmpl->assign('searchfor_tag', $_SESSION['searchfor_tag']);
       $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'];
+      /* parse URL */
+      if($this->is_user_friendly_url()) {
+         $content = $this->parse_user_friendly_url($_SERVER['REQUEST_URI']);
+      }
 
-      switch($_GET['mode']) {
-         case 'showpi':
-            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");
-            }
-            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;
+      if(isset($_GET['mode'])) {
+
+         $_SESSION['start_action'] = $_GET['mode'];
+
+         switch($_GET['mode']) {
+            case 'showpi':
+               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");
+               }
+               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'])) {