X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=phpfspot.git;a=blobdiff_plain;f=phpfspot.class.php;h=58cda4e2f5776452aa56e07762aa107f17aa6834;hp=99b0d7b9fe1c767837205385d901ed421d2e5d7d;hb=4686714d35c3758f32b56cee37d446d24b579698;hpb=867cf65e5ec98f5be8529a584329385814543e4d
diff --git a/phpfspot.class.php b/phpfspot.class.php
index 99b0d7b..58cda4e 100644
--- a/phpfspot.class.php
+++ b/phpfspot.class.php
@@ -157,6 +157,7 @@ class PHPFSPOT {
");
}
+ /* get F-Spot database version */
$this->dbver = $this->getFspotDBVersion();
if(!is_writeable($this->cfg->base_path ."/templates_c")) {
@@ -201,6 +202,17 @@ class PHPFSPOT {
require_once "phpfspot_tmpl.php";
$this->tmpl = new PHPFSPOT_TMPL();
+ $this->tmpl->assign('web_path', $this->cfg->web_path);
+
+ /* Starting with F-Spot 0.4.2, the rating-feature was available */
+ if($this->dbver > 10) {
+ $this->tmpl->assign('has_rating', true);
+ $this->sort_orders = array_merge($this->sort_orders, array(
+ 'rate_asc' => 'Rate ↑',
+ 'rate_desc' => 'Rate ↓',
+ ));
+ }
+
/* check if all necessary indices exist */
$this->checkDbIndices();
@@ -221,6 +233,11 @@ class PHPFSPOT {
if(isset($_SESSION['begin_with']) && $this->cfg->thumbs_per_page == 0)
unset($_SESSION['begin_with']);
+ // if user-friendly-url's are enabled, set also a flag for the template handler
+ if($this->is_user_friendly_url()) {
+ $this->tmpl->assign('user_friendly_url', 'true');
+ }
+
} // __construct()
public function __destruct()
@@ -305,17 +322,35 @@ class PHPFSPOT {
}
}
+ /* if date-search variables are registered in the session, set the check
+ for "consider date-range" in the html output
+ */
if(isset($_SESSION['from_date']) && isset($_SESSION['to_date']))
$this->tmpl->assign('date_search_enabled', true);
+ /* if rate-search variables are registered in the session, set the check
+ for "consider rate-range" in the html output
+ */
+ if(isset($_SESSION['rate_from']) && isset($_SESSION['rate_to'])) {
+ $this->tmpl->assign('rate_search_enabled', true);
+ }
+
$this->tmpl->register_function("sort_select_list", array(&$this, "smarty_sort_select_list"), false);
- $this->tmpl->assign('from_date', $this->get_calendar('from'));
- $this->tmpl->assign('to_date', $this->get_calendar('to'));
+ $this->tmpl->assign('search_from_date', $this->get_calendar('from'));
+ $this->tmpl->assign('search_to_date', $this->get_calendar('to'));
- if(!isset($content))
- $this->tmpl->assign('content_page', $this->tmpl->fetch('welcome.tpl'));
+ $this->tmpl->assign('preset_selected_tags', $this->getSelectedTags());
+ $this->tmpl->assign('preset_available_tags', $this->getAvailableTags());
+ $this->tmpl->assign('rate_search', $this->get_rate_search());
+
+ if(!isset($content)) {
+ if(isset($_SESSION['selected_tags']) && !empty($_SESSION['selected_tags']))
+ $this->tmpl->assign('initial_content', $this->showPhotoIndex());
+ else
+ $this->tmpl->assign('initial_content', $this->tmpl->fetch('welcome.tpl'));
+ }
else
- $this->tmpl->assign('content_page', $content);
+ $this->tmpl->assign('initial_content', $content);
$this->tmpl->show("index.tpl");
@@ -411,10 +446,19 @@ class PHPFSPOT {
";
}
else {
- $query_str = "
- SELECT p.id, p.uri, p.time, p.description
- FROM photos p
- ";
+ /* till F-Spot version 0.4.1 */
+ if($this->dbver < 11) {
+ $query_str = "
+ SELECT p.id, p.uri, p.time, p.description
+ FROM photos p
+ ";
+ }
+ else {
+ $query_str = "
+ SELECT p.id, p.uri, p.time, p.description, p.rating
+ FROM photos p
+ ";
+ }
}
/* if show_tags is set, only return details for photos which
@@ -474,6 +518,75 @@ class PHPFSPOT {
} // getPhotoName()
+ /**
+ * get photo rating level
+ *
+ * this function will return the integer-based rating
+ * level of the photo. This can only be done, if the F-Spot
+ * database is at a specific level. If rating value can not
+ * be found, zero will be returned indicating no rating value
+ * is available.
+ * @param integer idx
+ * @return integer
+ */
+ public function get_photo_rating($idx)
+ {
+ if($detail = $this->get_photo_details($idx)) {
+ if(isset($detail['rating']))
+ return $detail['rating'];
+ }
+
+ return 0;
+
+ } // get_photo_rating()
+
+ /**
+ * get rate-search bars
+ *
+ * this function will return the rating-bars for the
+ * search field.
+ * @return string
+ */
+ public function get_rate_search()
+ {
+ $bar = "";
+
+ for($i = 1; $i <= 5; $i++) {
+
+ $bar.= "cfg->web_path ."/resources/star.png";
+ else
+ $bar.= $this->cfg->web_path ."/resources/empty_rate.png";
+
+ $bar.= "\"
+ onmouseover=\"show_rate('from', ". $i .");\"
+ onmouseout=\"reset_rate('from');\"
+ onclick=\"set_rate('from', ". $i .")\" />";
+ }
+
+ $bar.= "
\n";
+
+ for($i = 1; $i <= 5; $i++) {
+
+ $bar.= "cfg->web_path ."/resources/star.png";
+ else
+ $bar.= $this->cfg->web_path ."/resources/empty_rate.png";
+
+ $bar.= "\"
+ onmouseover=\"show_rate('to', ". $i .");\"
+ onmouseout=\"reset_rate('to');\"
+ onclick=\"set_rate('to', ". $i .");\" />";
+ }
+
+ return $bar;
+
+ } // get_rate_search()
+
/**
* shrink text according provided limit
*
@@ -611,6 +724,7 @@ class PHPFSPOT {
$this->tmpl->assign('description', $details['description']);
$this->tmpl->assign('image_name', $this->parse_uri($details['uri'], 'filename'));
+ $this->tmpl->assign('image_rating', $this->get_photo_rating($photo));
$this->tmpl->assign('width', $info_thumb[0]);
$this->tmpl->assign('height', $info_thumb[1]);
@@ -635,12 +749,12 @@ class PHPFSPOT {
$this->tmpl->assign('current_img', $photo);
if($previous_img) {
- $this->tmpl->assign('previous_url', "javascript:showImage(". $previous_img .");");
+ $this->tmpl->assign('previous_url', "javascript:showPhoto(". $previous_img .");");
$this->tmpl->assign('prev_img', $previous_img);
}
if($next_img) {
- $this->tmpl->assign('next_url', "javascript:showImage(". $next_img .");");
+ $this->tmpl->assign('next_url', "javascript:showPhoto(". $next_img .");");
$this->tmpl->assign('next_img', $next_img);
}
$this->tmpl->assign('mini_width', $this->cfg->mini_width);
@@ -725,13 +839,15 @@ class PHPFSPOT {
$b = '88';
if(isset($this->tags[$key])) {
- $output.= "". $this->tags[$key] .", ";
+ if($this->is_user_friendly_url())
+ $output.= "cfg->web_path ."/tag/". $key ."\" onclick=\"Tags('add', ". $key ."); return false;\" class=\"tag\" style=\"font-size: ". $size ."%; color: #". $r.$g.$b .";\">". $this->tags[$key] .", ";
+ else
+ $output.= "cfg->web_path ."/index.php?mode=showpi\" onclick=\"Tags('add', ". $key ."); return false;\" class=\"tag\" style=\"font-size: ". $size ."%; color: #". $r.$g.$b .";\">". $this->tags[$key] .", ";
}
-
}
$output = substr($output, 0, strlen($output)-2);
- print $output;
+ return $output;
} // getAvailableTags()
@@ -762,17 +878,10 @@ class PHPFSPOT {
break;
case 'img':
$output.= "
-
-
-
+
";
break;
@@ -856,7 +965,7 @@ class PHPFSPOT {
} // resetTags()
/**
- * returns the value for the autocomplet tag-search
+ * returns the value for the autocomplete tag-search
* @return string
*/
public function get_xml_tag_list()
@@ -947,8 +1056,7 @@ class PHPFSPOT {
/**
* reset date search
*
- * if any date search has taken place, reset
- * it now
+ * if any date search has taken place, reset it now.
*/
public function resetDateSearch()
{
@@ -959,6 +1067,20 @@ class PHPFSPOT {
} // resetDateSearch();
+ /**
+ * reset rate search
+ *
+ * if any rate search has taken place, reset it now.
+ */
+ public function resetRateSearch()
+ {
+ if(isset($_SESSION['rate_from']))
+ unset($_SESSION['rate_from']);
+ if(isset($_SESSION['rate_to']))
+ unset($_SESSION['rate_to']);
+
+ } // resetRateSearch();
+
/**
* return all photo according selection
*
@@ -984,6 +1106,12 @@ class PHPFSPOT {
}
if(isset($_SESSION['searchfor_name'])) {
+
+ /* check for previous conditions. if so add 'AND' */
+ if(!empty($additional_where_cond)) {
+ $additional_where_cond.= " AND ";
+ }
+
if($this->dbver < 9) {
$additional_where_cond.= "
(
@@ -1004,6 +1132,24 @@ class PHPFSPOT {
}
}
+ /* limit result based on rate-search */
+ if(isset($_SESSION['rate_from']) && isset($_SESSION['rate_to'])) {
+
+ if($this->dbver > 10) {
+
+ /* check for previous conditions. if so add 'AND' */
+ if(!empty($additional_where_cond)) {
+ $additional_where_cond.= " AND ";
+ }
+
+ $additional_where_cond.= "
+ p.rating >= ". $_SESSION['rate_from'] ."
+ AND
+ p.rating <= ". $_SESSION['rate_to'] ."
+ ";
+ }
+ }
+
if(isset($_SESSION['sort_order'])) {
$order_str = $this->get_sort_order();
}
@@ -1023,7 +1169,7 @@ class PHPFSPOT {
ON pt2.tag_id=t2.id
WHERE t.name LIKE '%". $_SESSION['searchfor_tag'] ."%' ";
- if(isset($additional_where_cond) && !empty($additional_where_cond))
+ if(!empty($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
@@ -1060,7 +1206,7 @@ class PHPFSPOT {
ON pt1.photo_id=p.id
WHERE pt1.tag_id IN (". $selected .")
";
- if(isset($additional_where_cond) && !empty($additional_where_cond))
+ if(!empty($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
@@ -1116,7 +1262,7 @@ class PHPFSPOT {
AND pt". ($i+2) .".tag_id=". $_SESSION['selected_tags'][$i] ."
";
}
- if(isset($additional_where_cond) && !empty($additional_where_cond))
+ if(!empty($additional_where_cond))
$query_str.= "AND ". $additional_where_cond;
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
@@ -1145,11 +1291,11 @@ class PHPFSPOT {
ON pt.tag_id=t.id
";
- if(isset($additional_where_cond) && !empty($additional_where_cond))
+ if(!empty($additional_where_cond))
$query_str.= "WHERE ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- if(isset($additional_where_cond) && !empty($additional_where_cond))
+ if(!empty($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). "')";
@@ -1171,6 +1317,7 @@ class PHPFSPOT {
*
* this function provides all the necessary information
* for the photo index template.
+ * @return string
*/
public function showPhotoIndex()
{
@@ -1204,6 +1351,7 @@ class PHPFSPOT {
$img_name[$thumbs] = Array();
$img_fullname[$thumbs] = Array();
$img_title = Array();
+ $img_rating = Array();
for($i = $begin_with; $i < $end_with; $i++) {
@@ -1214,6 +1362,7 @@ class PHPFSPOT {
$img_name[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 15));
$img_fullname[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 0));
$img_title[$thumbs] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0));
+ $img_rating[$thumbs] = $this->get_photo_rating($photos[$i]);
$thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i]);
@@ -1282,7 +1431,16 @@ class PHPFSPOT {
else
$style = "";
- $select = "
is_user_friendly_url()) {
+ $select = "cfg->web_path ."/tag/205/". $start_with ."\"";
+ }
+ else {
+ $select = "cfg->web_path ."/index.php?mode=showpi tags=". $current_tags ." begin_with=". $begin_with ."\"";
+ }
+ $select.= " onclick=\"showPhotoIndex(". $start_with ."); return false;\"";
+
if($style != "")
$select.= $style;
$select.= ">". $i ." ";
@@ -1320,7 +1478,6 @@ class PHPFSPOT {
if($last_page > 1)
$this->tmpl->assign('page_selector', $page_select);
}
-
$current_tags = $this->getCurrentTags();
$extern_link = "index.php?mode=showpi";
@@ -1353,6 +1510,7 @@ class PHPFSPOT {
$this->tmpl->assign('img_name', $img_name);
$this->tmpl->assign('img_fullname', $img_fullname);
$this->tmpl->assign('img_title', $img_title);
+ $this->tmpl->assign('img_rating', $img_rating);
$this->tmpl->assign('thumbs', $thumbs);
$this->tmpl->assign('selected_tags', $this->getSelectedTags('img'));
@@ -1828,6 +1986,7 @@ class PHPFSPOT {
*/
public function startSearch()
{
+ /* date search */
if(isset($_POST['from']) && $this->isValidDate($_POST['from'])) {
$from = $_POST['from'];
}
@@ -1835,15 +1994,36 @@ class PHPFSPOT {
$to = $_POST['to'];
}
+ /* tag-name search */
if(isset($_POST['for_tag']) && is_string($_POST['for_tag'])) {
$searchfor_tag = $_POST['for_tag'];
$_SESSION['searchfor_tag'] = $_POST['for_tag'];
}
+ else {
+ unset($_SESSION['searchfor_tag']);
+ }
+ /* file-name search */
if(isset($_POST['for_name']) && is_string($_POST['for_name'])) {
- $searchfor_name = $_POST['for_name'];
$_SESSION['searchfor_name'] = $_POST['for_name'];
}
+ else {
+ unset($_SESSION['searchfor_name']);
+ }
+
+ /* rate-search */
+ if(isset($_POST['rate_from']) && is_numeric($_POST['rate_from'])) {
+
+ $_SESSION['rate_from'] = $_POST['rate_from'];
+
+ if(isset($_POST['rate_to']) && is_numeric($_POST['rate_to'])) {
+ $_SESSION['rate_to'] = $_POST['rate_to'];
+ }
+ }
+ else {
+ /* delete any previously set value */
+ unset($_SESSION['rate_to'], $_SESSION['rate_from']);
+ }
$this->get_tags();
@@ -2437,7 +2617,6 @@ class PHPFSPOT {
public function whatToDo()
{
if(isset($_SESSION['current_photo']) && $_SESSION['start_action'] == 'showp') {
- return "show_photo";
}
elseif(isset($_SESSION['selected_tags']) && !empty($_SESSION['selected_tags'])) {
return "showpi_tags";
@@ -2446,8 +2625,6 @@ class PHPFSPOT {
return "showpi";
}
- return "nothing special";
-
} // whatToDo()
/**
@@ -2523,6 +2700,12 @@ class PHPFSPOT {
case 'tags_desc':
return " ORDER BY t.name DESC ,p.time ASC";
break;
+ case 'rate_asc':
+ return " ORDER BY t.name ASC, p.rating ASC";
+ break;
+ case 'rate_desc':
+ return " ORDER BY t.name DESC, p.rating DESC";
+ break;
}
} // get_sort_order()
@@ -2702,7 +2885,9 @@ class PHPFSPOT {
*/
private function ts2str($timestamp)
{
- return strftime("%Y-%m-%d", $timestamp);
+ if(!empty($timestamp) && is_numeric($timestamp))
+ return strftime("%Y-%m-%d", $timestamp);
+
} // ts2str()
/**
@@ -2771,15 +2956,7 @@ class PHPFSPOT {
*/
private function get_phpfspot_url()
{
- if($this->cfg->web_path == "/")
- $web_path = "";
- /* remove trailing slash */
- elseif(preg_match('/\/$/', $this->cfg->web_path))
- $web_path = preg_replace('/\/$/', '', $this->cfg->web_path);
- else
- $web_path = $this->cfg->web_path;
-
- return $this->get_web_protocol() ."://". $this->get_server_name() . $web_path;
+ return $this->get_web_protocol() ."://". $this->get_server_name() . $this->cfg->web_path;
} // get_phpfspot_url()
@@ -2973,9 +3150,11 @@ class PHPFSPOT {
}
- /* check for pending slash on web_path */
- if(!preg_match("/\/$/", $this->cfg->web_path))
- $this->cfg->web_path.= "/";
+ /* remove trailing slash, if set */
+ if($this->cfg->web_path == "/")
+ $this->cfg->web_path = "";
+ elseif(preg_match('/\/$/', $this->cfg->web_path))
+ $this->cfg->web_path = preg_replace('/\/$/', '', $this->cfg->web_path);
return $this->runtime_error;
@@ -3092,19 +3271,24 @@ class PHPFSPOT {
} // get_tag_name()
-
+ /**
+ * parse user friendly url which got rewritten by the websever
+ * @param string $request_uri
+ * @return string
+ */
private function parse_user_friendly_url($request_uri)
{
if(preg_match('/\/photoview\/|\/photo\/|\/tag\//', $request_uri)) {
- unset($_SESSION['start_action']);
- unset($_SESSION['selected_tags']);
-
$options = explode('/', $request_uri);
switch($options[1]) {
case 'photoview':
if(is_numeric($options[2])) {
+ $this->session_cleanup();
+ //unset($_SESSION['start_action']);
+ //unset($_SESSION['selected_tags']);
+ $_GET['mode'] = 'showp';
return $this->showPhoto($options[2]);
}
break;
@@ -3121,10 +3305,11 @@ class PHPFSPOT {
break;
case 'tag':
if(is_numeric($options[2])) {
- $_GET['mode'] = 'showpi';
- $_SESSION['selected_tags'] = Array($options[2]);
- $this->tmpl->assign('preset_selected_tags', $this->getSelectedTags());
+ $this->session_cleanup();
$_GET['tags'] = $options[2];
+ $_SESSION['selected_tags'] = Array($options[2]);
+ if(isset($options[3]) && is_numeric($options[3]))
+ $_SESSION['begin_with'] = $options[3];
return $this->showPhotoIndex();
}
break;
@@ -3149,6 +3334,22 @@ class PHPFSPOT {
} // is_user_friendly_url()
+ /**
+ * session cleanup
+ *
+ * this function will cleanup user's session information
+ */
+ private function session_cleanup()
+ {
+ unset($_SESSION['begin_with']);
+ $this->resetDateSearch();
+ $this->resetPhotoView();
+ $this->resetTagSearch();
+ $this->resetNameSearch();
+ $this->resetDateSearch();
+ $this->resetTags();
+
+ } // session_cleanup()
} // class PHPFSPOT