X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=phpfspot.git;a=blobdiff_plain;f=phpfspot.class.php;h=b82fbeef01d5333f4d2477591c1a6e6f257ab4d5;hp=265fa1d6c70b6e22d37695c09d1a461b469dfea9;hb=b654689c263f6ce32c9d2ea01a3d04b2448532c3;hpb=7f50c5e33bc845582d0d12c4d76d601e2e700094
diff --git a/phpfspot.class.php b/phpfspot.class.php
index 265fa1d..b82fbee 100644
--- a/phpfspot.class.php
+++ b/phpfspot.class.php
@@ -58,8 +58,13 @@ class PHPFSPOT {
}
$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->tmpl = new PHPFSPOT_TMPL($this);
$this->get_tags();
@@ -69,6 +74,9 @@ class PHPFSPOT {
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'] = '';
@@ -97,49 +105,57 @@ class PHPFSPOT {
$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'])) {
- $_SESSION['selected_tags'] = split(',', $_GET['tags']);
+ $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
}
- if(isset($_GET['from_date'])) {
- $_SESSION['from_date'] = $_GET['from_date'];
+ 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'])) {
- $_SESSION['to_date'] = $_GET['to_date'];
+ 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'] = split(',', $_GET['tags']);
+ $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
$_SESSION['start_action'] = 'showp';
}
- if(isset($_GET['id'])) {
+ if(isset($_GET['id']) && is_numeric($_GET['id'])) {
$_SESSION['current_photo'] = $_GET['id'];
$_SESSION['start_action'] = 'showp';
}
- if(isset($_GET['from_date'])) {
- $_SESSION['from_date'] = $_GET['from_date'];
+ if(isset($_GET['from_date']) && $this->isValidDate($_GET['from_date'])) {
+ $_SESSION['from_date'] = strtotime($_GET['from_date']);
}
- if(isset($_GET['to_date'])) {
- $_SESSION['to_date'] = $_GET['to_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;
}
+ 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");
-
} // show()
/**
@@ -279,11 +295,11 @@ class PHPFSPOT {
$thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->photo_width ."_". $this->getMD5($photo);
if(!file_exists($orig_path)) {
- $this->_warning("Photo ". $orig_path ." does not exist!
\n");
+ $this->_error("Photo ". $orig_path ." does not exist!
\n");
}
if(!is_readable($orig_path)) {
- $this->_warning("Photo ". $orig_path ." is not readable for user ". $this->getuid() ."
\n");
+ $this->_error("Photo ". $orig_path ." is not readable for user ". $this->getuid() ."
\n");
}
/* If the thumbnail doesn't exist yet, try to create it */
@@ -304,7 +320,7 @@ class PHPFSPOT {
}
$meta_date = isset($meta['FileDateTime']) ? strftime("%a %x %X", $meta['FileDateTime']) : "n/a";
- $meta_make = isset($meta['Make']) ? $meta['Make'] ." ". $meta['Model'] : "n/a";
+ $meta_make = isset($meta['Make']) ? $meta['Make'] ." / ". $meta['Model'] : "n/a";
$meta_size = isset($meta['FileSize']) ? round($meta['FileSize']/1024, 1) ."kbyte" : "n/a";
$extern_link = "index.php?mode=showp&id=". $photo;
@@ -313,7 +329,7 @@ class PHPFSPOT {
$extern_link.= "&tags=". $current_tags;
}
if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
- $extern_link.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date'];
+ $extern_link.= "&from_date=". $this->ts2str($_SESSION['from_date']) ."&to_date=". $this->ts2str($_SESSION['to_date']);
}
$this->tmpl->assign('extern_link', $extern_link);
@@ -339,7 +355,7 @@ class PHPFSPOT {
$this->tmpl->assign('current', $current);
}
else {
- $this->_warning("Can't open file ". $thumb_path ."\n");
+ $this->_error("Can't open file ". $thumb_path ."\n");
return;
}
@@ -353,6 +369,8 @@ class PHPFSPOT {
$this->tmpl->assign('next_img', $next_img);
}
$this->tmpl->assign('mini_width', $this->cfg->mini_width);
+ $this->tmpl->assign('photo_number', $i);
+ $this->tmpl->assign('photo_count', count($all_photos));
$this->tmpl->show("single_photo.tpl");
@@ -367,6 +385,8 @@ class PHPFSPOT {
*/
public function getAvailableTags()
{
+ $output = "";
+
$result = $this->db->db_query("
SELECT tag_id as id, count(tag_id) as quantity
FROM photo_tags
@@ -414,10 +434,13 @@ class PHPFSPOT {
// uncomment if you want sizes in whole %:
$size = ceil($size);
- print "". $this->tags[$key] .", ";
+ $output.= "". $this->tags[$key] .", ";
}
+ $output = substr($output, 0, strlen($output)-2);
+ print $output;
+
} // getAvailableTags()
/**
@@ -452,9 +475,6 @@ class PHPFSPOT {
*/
public function addTag($tag)
{
- // if the result of a date search are displayed, reset them
- $this->resetDateSearch();
-
if(!isset($_SESSION['selected_tags']))
$_SESSION['selected_tags'] = Array();
@@ -545,18 +565,37 @@ class PHPFSPOT {
{
$matched_photos = Array();
+ if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
+ $from_date = $_SESSION['from_date'];
+ $to_date = $_SESSION['to_date'];
+ $additional_where_cond = "
+ p.time>='". $from_date ."'
+ AND
+ p.time<='". $to_date ."'
+ ";
+ }
+
+ if(isset($_SESSION['sort_order'])) {
+ $order_str = $this->get_sort_order();
+ }
+
/* return a search result */
if(isset($_SESSION['searchfor']) && $_SESSION['searchfor'] != '') {
- $result = $this->db->db_query("
+ $query_str = "
SELECT DISTINCT photo_id
FROM photo_tags pt
INNER JOIN photos p
ON p.id=pt.photo_id
INNER JOIN tags t
ON pt.tag_id=t.id
- WHERE t.name LIKE '%". $_SESSION['searchfor'] ."%'
- ORDER BY p.time ASC
- ");
+ WHERE t.name LIKE '%". $_SESSION['searchfor'] ."%'";
+
+ if(isset($additional_where_cond))
+ $query_str.= "AND ". $additional_where_cond ." ";
+ if(isset($order_str))
+ $query_str.= $order_str;
+
+ $result = $this->db->db_query($query_str);
while($row = $this->db->db_fetch_object($result)) {
array_push($matched_photos, $row['photo_id']);
}
@@ -571,14 +610,17 @@ class PHPFSPOT {
$selected = substr($selected, 0, strlen($selected)-1);
if($_SESSION['tag_condition'] == 'or') {
- $result = $this->db->db_query("
+ $query_str = "
SELECT DISTINCT photo_id
FROM photo_tags pt
INNER JOIN photos p
ON p.id=pt.photo_id
WHERE pt.tag_id IN (". $selected .")
- ORDER BY p.time ASC
- ");
+ ";
+ if(isset($additional_where_cond))
+ $query_str.= "AND ". $additional_where_cond ." ";
+ if(isset($order_str))
+ $query_str.= $order_str;
}
elseif($_SESSION['tag_condition'] == 'and') {
@@ -608,49 +650,42 @@ class PHPFSPOT {
ON pt1.photo_id=pt". ($i+2) .".photo_id
";
}
+ $query_str.= "
+ INNER JOIN photos p
+ ON pt1.photo_id=p.id
+ ";
$query_str.= "WHERE pt1.tag_id=". $_SESSION['selected_tags'][0];
for($i = 1; $i < count($_SESSION['selected_tags']); $i++) {
$query_str.= "
AND pt". ($i+1) .".tag_id=". $_SESSION['selected_tags'][$i] ."
";
}
- $result = $this->db->db_query($query_str);
+ if(isset($additional_where_cond))
+ $query_str.= "AND ". $additional_where_cond;
+ if(isset($order_str))
+ $query_str.= $order_str;
}
+ $result = $this->db->db_query($query_str);
while($row = $this->db->db_fetch_object($result)) {
array_push($matched_photos, $row['photo_id']);
}
return $matched_photos;
}
- if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
- $from_date = strtotime($_SESSION['from_date']);
- $to_date = strtotime($_SESSION['to_date']);
- $result = $this->db->db_query("
- SELECT DISTINCT photo_id
- FROM photo_tags pt
- INNER JOIN photos p
- ON p.id=pt.photo_id
- WHERE
- time>='". $from_date ."'
- AND
- time<='". $to_date ."'
- ORDER BY p.time ASC
- ");
- while($row = $this->db->db_fetch_object($result)) {
- array_push($matched_photos, $row['photo_id']);
- }
- return $matched_photos;
- }
-
/* return all available photos */
- $result = $this->db->db_query("
+ $query_str = "
SELECT DISTINCT photo_id
FROM photo_tags pt
INNER JOIN photos p
ON p.id=pt.photo_id
- ORDER BY p.time ASC
- ");
+ ";
+ if(isset($additional_where_cond))
+ $query_str.= "WHERE ". $additional_where_cond ." ";
+ if(isset($order_str))
+ $query_str.= $order_str;
+
+ $result = $this->db->db_query($query_str);
while($row = $this->db->db_fetch_object($result)) {
array_push($matched_photos, $row['photo_id']);
}
@@ -746,6 +781,15 @@ class PHPFSPOT {
if(isset($_SESSION['searchfor']) && $_SESSION['searchfor'] != '')
$this->tmpl->assign('searchfor', $_SESSION['searchfor']);
+ if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
+ $this->tmpl->assign('from_date', $this->ts2str($_SESSION['from_date']));
+ $this->tmpl->assign('to_date', $this->ts2str($_SESSION['to_date']));
+ }
+
+ if(isset($_SESSION['selected_tags']) && !empty($_SESSION['selected_tags'])) {
+ $this->tmpl->assign('tag_result', 1);
+ }
+
/* do we have to display the page selector ? */
if($this->cfg->rows_per_page != 0) {
@@ -771,10 +815,12 @@ class PHPFSPOT {
}
}
+ $dotdot_made = 0;
+
for($i = 1; $i <= $last_page; $i++) {
if($current_page == $i)
- $style = "style=\"font-size: 125%;\"";
+ $style = "style=\"font-size: 125%; text-decoration: underline;\"";
elseif($current_page-1 == $i || $current_page+1 == $i)
$style = "style=\"font-size: 105%;\"";
elseif(($current_page-5 >= $i) && ($i != 1) ||
@@ -805,12 +851,16 @@ class PHPFSPOT {
$i == $current_page+3 || $i == $current_page+2 || $i == $current_page+1 /* three after */) {
$page_select.= $select;
+ $dotdot_made = 0;
continue;
}
}
- $page_select.= ".";
+ if(!$dotdot_made) {
+ $page_select.= "......... ";
+ $dotdot_made = 1;
+ }
}
/* only show the page selector if we have more then one page */
@@ -825,12 +875,14 @@ class PHPFSPOT {
$extern_link.= "&tags=". $current_tags;
}
if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
- $extern_link.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date'];
+ $extern_link.= "&from_date=". $this->ts2str($_SESSION['from_date']) ."&to_date=". $this->ts2str($_SESSION['to_date']);
}
$export_link = "index.php?mode=export";
+ $slideshow_link = "index.php?mode=slideshow";
$this->tmpl->assign('extern_link', $extern_link);
+ $this->tmpl->assign('slideshow_link', $slideshow_link);
$this->tmpl->assign('export_link', $export_link);
$this->tmpl->assign('count', $count);
$this->tmpl->assign('width', $this->cfg->thumb_width);
@@ -1062,12 +1114,12 @@ class PHPFSPOT {
$full_path = $this->translate_path($details['directory_path']) ."/". $details['name'];
if(!file_exists($full_path)) {
- $this->_warning("File ". $full_path ." does not exist\n");
+ $this->_error("File ". $full_path ." does not exist\n");
return;
}
if(!is_readable($full_path)) {
- $this->_warning("File ". $full_path ." is not readable for ". $this->getuid() ."\n");
+ $this->_error("File ". $full_path ." is not readable for ". $this->getuid() ."\n");
return;
}
@@ -1152,39 +1204,37 @@ class PHPFSPOT {
} // setTagCondition()
/**
- * invoke tag search
+ * invoke tag & date search
*
* this function will return all matching tags and store
- * them in the session variable selected_tags.
+ * them in the session variable selected_tags. furthermore
+ * it also handles the date search.
* getPhotoSelection() will then only return the matching
* photos.
*/
- public function startTagSearch($searchfor)
+ public function startSearch($searchfor, $sort_order, $from = 0, $to = 0)
{
$_SESSION['searchfor'] = $searchfor;
- $_SESSION['selected_tags'] = Array();
+ $_SESSION['sort_order'] = $sort_order;
+ if($from != 0)
+ $_SESSION['from_date'] = strtotime($from);
+ else
+ unset($_SESSION['from_date']);
+ if($to != 0)
+ $_SESSION['to_date'] = strtotime($to);
+ else
+ unset($_SESSION['to_date']);
- foreach($this->avail_tags as $tag) {
- if(preg_match('/'. $searchfor .'/i', $this->tags[$tag]))
- array_push($_SESSION['selected_tags'], $tag);
+ if($searchfor != "") {
+ /* new search, reset the current selected tags */
+ $_SESSION['selected_tags'] = Array();
+ foreach($this->avail_tags as $tag) {
+ if(preg_match('/'. $searchfor .'/i', $this->tags[$tag]))
+ array_push($_SESSION['selected_tags'], $tag);
+ }
}
- $this->resetDateSearch();
-
- } // startTagSearch()
-
- /**
- * invoke date search
- *
- * this function in fact does nothing then only setting
- * the from- and to-date in the users session variables.
- * the result is generated by getPhotoSelection().
- */
- public function startDateSearch($from, $to)
- {
- $_SESSION['from_date'] = $from;
- $_SESSION['to_date'] = $to;
- }
+ } // startSearch()
/**
* rotate image
@@ -1370,25 +1420,41 @@ class PHPFSPOT {
} // checkifImageSupported()
- public function _warning($text)
+ public function _error($text)
{
- print "\n";
- print $text;
+ switch($this->cfg->logging) {
+ case 'display':
+ print "\n";
+ print $text;
+ break;
+ case 'errorlog':
+ error_log($text);
+ break;
+ case 'logfile':
+ error_log($text, 3, $his->cfg->log_file);
+ break;
+ }
- } // _warning()
+ } // _error()
/**
* output calendard input fields
*/
private function get_calendar($mode)
{
- $year = $_SESSION[$mode .'_date'] ? date("Y", strtotime($_SESSION[$mode .'_date'])) : date("Y");
- $month = $_SESSION[$mode .'_date'] ? date("m", strtotime($_SESSION[$mode .'_date'])) : date("m");
- $day = $_SESSION[$mode .'_date'] ? date("d", strtotime($_SESSION[$mode .'_date'])) : date("d");
-
- $output = "\n";
- $output.= "\n";
- $output.= "\n";
+ $year = $_SESSION[$mode .'_date'] ? date("Y", $_SESSION[$mode .'_date']) : date("Y");
+ $month = $_SESSION[$mode .'_date'] ? date("m", $_SESSION[$mode .'_date']) : date("m");
+ $day = $_SESSION[$mode .'_date'] ? date("d", $_SESSION[$mode .'_date']) : date("d");
+
+ $output = "\n";
+ $output.= "\n";
+ $output.= "\n";
return $output;
} // get_calendar()
@@ -1504,8 +1570,13 @@ class PHPFSPOT {
break;
case 'MoinMoin':
- // [%pictureurl% %thumbnailurl%]
- print htmlspecialchars(" * [".$orig_url." ".$thumb_url."&fake=1.jpg]") ."
\n";
+ // "[%pictureurl% %thumbnailurl%]"
+ print htmlspecialchars("[".$orig_url." ".$thumb_url."&fake=1.jpg]") ."
\n";
+ break;
+
+ case 'MoinMoinList':
+ // " * [%pictureurl% %thumbnailurl%]"
+ print " " . htmlspecialchars("* [".$orig_url." ".$thumb_url."&fake=1.jpg]") ."
\n";
break;
}
@@ -1549,15 +1620,12 @@ class PHPFSPOT {
*/
public function whatToDo()
{
- if(isset($_SESSION['selected_tags']) && !empty($_SESSION['selected_tags'])) {
- return "showpi_tags";
- }
- elseif(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
- return "showpi_date";
- }
- elseif(isset($_SESSION['current_photo'])) {
+ if(isset($_SESSION['current_photo']) && $_SESSION['start_action'] == 'showp') {
return "show_photo";
}
+ elseif(isset($_SESSION['selected_tags']) && !empty($_SESSION['selected_tags'])) {
+ return "showpi_tags";
+ }
elseif(isset($_SESSION['start_action']) && $_SESSION['start_action'] == 'showpi') {
return "showpi";
}
@@ -1581,6 +1649,165 @@ class PHPFSPOT {
} // getuid()
+ /**
+ * returns a select-dropdown box to select photo index sort parameters
+ */
+ private function get_sort_field()
+ {
+ $output = "";
+ return $output;
+
+ } // get_sort_field()
+
+ /**
+ * returns the currently selected sort order
+ */
+ private function get_sort_order()
+ {
+ switch($_SESSION['sort_order']) {
+ case 'date_asc':
+ return " ORDER BY p.time ASC";
+ break;
+ case 'date_desc':
+ return " ORDER BY p.time DESC";
+ break;
+ case 'name_asc':
+ return " ORDER BY p.name ASC";
+ break;
+ case 'name_desc':
+ return " ORDER BY p.name DESC";
+ break;
+ }
+
+ } // get_sort_order()
+
+ /***
+ * return the next to be shown slide show image
+ *
+ * this function returns the URL of the next image
+ * in the slideshow sequence.
+ */
+ public function getNextSlideShowImage()
+ {
+ $all_photos = $this->getPhotoSelection();
+
+ if(!isset($_SESSION['slideshow_img']) || $_SESSION['slideshow_img'] == count($all_photos)-1)
+ $_SESSION['slideshow_img'] = 0;
+ else
+ $_SESSION['slideshow_img']++;
+
+ $server_name = $_SERVER['SERVER_NAME'];
+ if(!isset($_SERVER['HTTPS'])) $protocol = "http";
+ else $protocol = "https";
+
+ return $protocol ."://". $server_name . $this->cfg->web_path ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width;
+
+ } // getNextSlideShowImage()
+
+ /***
+ * return the previous to be shown slide show image
+ *
+ * this function returns the URL of the previous image
+ * in the slideshow sequence.
+ */
+ public function getPrevSlideShowImage()
+ {
+ $all_photos = $this->getPhotoSelection();
+
+ if(!isset($_SESSION['slideshow_img']) || $_SESSION['slideshow_img'] == 0)
+ $_SESSION['slideshow_img'] = 0;
+ else
+ $_SESSION['slideshow_img']--;
+
+ $server_name = $_SERVER['SERVER_NAME'];
+ if(!isset($_SERVER['HTTPS'])) $protocol = "http";
+ else $protocol = "https";
+
+ return $protocol ."://". $server_name . $this->cfg->web_path ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width;
+
+ } // getPrevSlideShowImage()
+
+ public function resetSlideShow()
+ {
+ if(isset($_SESSION['slideshow_img']))
+ unset($_SESSION['slideshow_img']);
+ } // resetSlideShow()
+
+ /***
+ * get random photo
+ *
+ * this function will get all photos from the fspot
+ * database and randomly return ONE entry
+ *
+ * saddly there is yet no sqlite3 function which returns
+ * the bulk result in array, so we have to fill up our
+ * own here.
+ */
+ public function get_random_photo()
+ {
+ $all = Array();
+
+ $result = $this->db->db_query("
+ SELECT id
+ FROM photos
+ ");
+
+ while($row = $this->db->db_fetch_object($result)) {
+ array_push($all, $row['id']);
+ }
+
+ return $all[array_rand($all)];
+
+ } // get_random_photo()
+
+ /**
+ * validates provided date
+ *
+ * this function validates if the provided date
+ * contains a valid date and will return true
+ * if it is.
+ */
+ public function isValidDate($date_str)
+ {
+ $timestamp = strtotime($date_str);
+
+ if(is_numeric($timestamp))
+ return true;
+
+ return false;
+
+ } // isValidDate()
+
+ /**
+ * timestamp to string conversion
+ */
+ private function ts2str($timestamp)
+ {
+ return strftime("%Y-%m-%d", $timestamp);
+ } // ts2str()
+
+ private function extractTags($tags_str)
+ {
+ $not_validated = split(',', $_GET['tags']);
+ $validated = array();
+
+ foreach($not_validated as $tag) {
+ if(is_numeric($tag))
+ array_push($validated, $tag);
+ }
+
+ return $validated;
+
+ } // extractTags()
+
}
?>