X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=phpfspot.git;a=blobdiff_plain;f=phpfspot.class.php;h=0711499f3ef113893fe89255225afb5c8baaee11;hp=c56ececc94c7998a273ab0c602ddd6cd59f72e42;hb=6da6a0bae7001a35ac6530fbd6ff9aeab140983f;hpb=66085a7572b5ce488134e5f9642a1b96e61dc45e diff --git a/phpfspot.class.php b/phpfspot.class.php index c56ecec..0711499 100644 --- a/phpfspot.class.php +++ b/phpfspot.class.php @@ -122,7 +122,7 @@ class PHPFSPOT { /* set application name and version information */ $this->cfg->product = "phpfspot"; - $this->cfg->version = "1.4"; + $this->cfg->version = "1.5"; $this->sort_orders= array( 'date_asc' => 'Date ↑', @@ -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,16 @@ 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->sort_orders = array_merge($this->sort_orders, array( + 'rate_asc' => 'Rate ↑', + 'rate_desc' => 'Rate ↓', + )); + } + /* check if all necessary indices exist */ $this->checkDbIndices(); @@ -221,6 +232,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() @@ -244,6 +260,11 @@ class PHPFSPOT { $this->tmpl->assign('current_condition', $_SESSION['tag_condition']); $this->tmpl->assign('template_path', 'themes/'. $this->cfg->theme_name); + /* parse URL */ + if($this->is_user_friendly_url()) { + $content = $this->parse_user_friendly_url($_SERVER['REQUEST_URI']); + } + if(isset($_GET['mode'])) { $_SESSION['start_action'] = $_GET['mode']; @@ -304,9 +325,21 @@ class PHPFSPOT { $this->tmpl->assign('date_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('content_page', 'welcome.tpl'); + $this->tmpl->assign('search_from_date', $this->get_calendar('from')); + $this->tmpl->assign('search_to_date', $this->get_calendar('to')); + + $this->tmpl->assign('preset_selected_tags', $this->getSelectedTags()); + $this->tmpl->assign('preset_available_tags', $this->getAvailableTags()); + + 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('initial_content', $content); + $this->tmpl->show("index.tpl"); } // show() @@ -401,10 +434,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 @@ -464,6 +506,28 @@ 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() + /** * shrink text according provided limit * @@ -601,6 +665,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]); @@ -609,8 +674,15 @@ class PHPFSPOT { $this->tmpl->assign('ExifOrigResolution', $meta_res); $this->tmpl->assign('ExifFileSize', $meta_size); - $this->tmpl->assign('image_url', 'phpfspot_img.php?idx='. $photo ."&width=". $this->cfg->photo_width); - $this->tmpl->assign('image_url_full', 'phpfspot_img.php?idx='. $photo); + if($this->is_user_friendly_url()) { + $this->tmpl->assign('image_url', '/photo/'. $photo ."/". $this->cfg->photo_width); + $this->tmpl->assign('image_url_full', '/photo/'. $photo); + } + else { + $this->tmpl->assign('image_url', 'phpfspot_img.php?idx='. $photo ."&width=". $this->cfg->photo_width); + $this->tmpl->assign('image_url_full', 'phpfspot_img.php?idx='. $photo); + } + $this->tmpl->assign('image_filename', $this->parse_uri($details['uri'], 'filename')); $this->tmpl->assign('tags', $this->get_photo_tags($photo)); @@ -618,12 +690,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); @@ -631,7 +703,7 @@ class PHPFSPOT { $this->tmpl->assign('photo_number', $i); $this->tmpl->assign('photo_count', count($all_photos)); - $this->tmpl->show("single_photo.tpl"); + return $this->tmpl->fetch("single_photo.tpl"); } // showPhoto() @@ -708,13 +780,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() @@ -726,7 +800,7 @@ class PHPFSPOT { * session-variable $_SESSION['selected_tags'] * @return string */ - public function getSelectedTags() + public function getSelectedTags($type = 'link') { /* retrive tags from database */ $this->get_tags(); @@ -737,7 +811,22 @@ class PHPFSPOT { { // return all selected tags if(isset($_SESSION['selected_tags']) && in_array($tag, $_SESSION['selected_tags'])) { - $output.= "". $this->tags[$tag] .", "; + + switch($type) { + default: + case 'link': + $output.= "". $this->tags[$tag] .", "; + break; + case 'img': + $output.= " +
+ tags[$tag] ."\"> + cfg->web_path ."/phpfspot_img.php?tagidx=". $tag ."\" /> + +
+ "; + break; + } } } @@ -817,7 +906,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() @@ -1132,6 +1221,7 @@ class PHPFSPOT { * * this function provides all the necessary information * for the photo index template. + * @return string */ public function showPhotoIndex() { @@ -1165,6 +1255,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++) { @@ -1175,6 +1266,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]); @@ -1243,7 +1335,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 ." "; @@ -1281,7 +1382,6 @@ class PHPFSPOT { if($last_page > 1) $this->tmpl->assign('page_selector', $page_select); } - $current_tags = $this->getCurrentTags(); $extern_link = "index.php?mode=showpi"; @@ -1314,19 +1414,23 @@ 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')); - $this->tmpl->show("photo_index.tpl"); + $result = $this->tmpl->fetch("photo_index.tpl"); /* if we are returning to photo index from an photo-view, scroll the window to the last shown photo-thumbnail. after this, unset the last_photo session variable. */ if(isset($_SESSION['last_photo'])) { - print "\n"; + $result.= "\n"; unset($_SESSION['last_photo']); } + return $result; + } // showPhotoIndex() /** @@ -1634,6 +1738,7 @@ class PHPFSPOT { $this->cfg->thumb_width, $this->cfg->photo_width, $this->cfg->mini_width, + 30, ); /* get details from F-Spot's database */ @@ -2239,7 +2344,7 @@ class PHPFSPOT { foreach($pictures as $picture) { - $orig_url = $this->get_phpfspot_url() ."index.php?mode=showp&id=". $picture; + $orig_url = $this->get_phpfspot_url() ."/index.php?mode=showp&id=". $picture; if($current_tags != "") { $orig_url.= "&tags=". $current_tags; } @@ -2247,7 +2352,12 @@ class PHPFSPOT { $orig_url.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date']; } - $thumb_url = $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width; + if($this->is_user_friendly_url()) { + $thumb_url = $this->get_phpfspot_url() ."/photo/". $picture ."/". $this->cfg->thumb_width; + } + else { + $thumb_url = $this->get_phpfspot_url() ."/phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width; + } switch($mode) { @@ -2296,7 +2406,7 @@ class PHPFSPOT { foreach($pictures as $picture) { - $orig_url = $this->get_phpfspot_url() ."index.php?mode=showp&id=". $picture; + $orig_url = $this->get_phpfspot_url() ."/index.php?mode=showp&id=". $picture; if($current_tags != "") { $orig_url.= "&tags=". $current_tags; } @@ -2306,7 +2416,13 @@ class PHPFSPOT { $details = $this->get_photo_details($picture); - $thumb_url = $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width; + if($this->is_user_friendly_url()) { + $thumb_url = $this->get_phpfspot_url() ."/photo/". $picture ."/". $this->cfg->thumb_width; + } + else { + $thumb_url = $this->get_phpfspot_url() ."/phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width; + } + $thumb_html = htmlspecialchars("
@@ -2383,7 +2499,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"; @@ -2392,8 +2507,6 @@ class PHPFSPOT { return "showpi"; } - return "nothing special"; - } // whatToDo() /** @@ -2469,6 +2582,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() @@ -2489,7 +2608,11 @@ class PHPFSPOT { else $_SESSION['slideshow_img']++; - return $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width; + if($this->is_user_friendly_url()) { + return $this->get_phpfspot_url() ."/photo/". $all_photos[$_SESSION['slideshow_img']] ."/". $this->cfg->photo_width; + } + + return $this->get_phpfspot_url() ."/phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width; } // getNextSlideShowImage() @@ -2509,7 +2632,11 @@ class PHPFSPOT { else $_SESSION['slideshow_img']--; - return $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width; + if($this->is_user_friendly_url()) { + return $this->get_phpfspot_url() ."/photo/". $all_photos[$_SESSION['slideshow_img']] ."/". $this->cfg->photo_width; + } + + return $this->get_phpfspot_url() ."/phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width; } // getPrevSlideShowImage() @@ -2563,6 +2690,56 @@ class PHPFSPOT { } // get_random_photo() + /** + * get random photo tag photo + * + * this function will get all photos tagged with the requested + * tag 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. + * @return array + */ + public function get_random_tag_photo($tagidx) + { + $all = Array(); + + $query_str = " + SELECT p.id + FROM photos p + INNER JOIN photo_tags pt + ON p.id=pt.photo_id + "; + + if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) { + $query_str.= " + INNER JOIN tags t + ON pt.tag_id=t.id + "; + } + $query_str.= " + WHERE + pt.tag_id LIKE '". $tagidx ."' + "; + + /*if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) { + $query_str.= " + AND + t.name IN ('".implode("','",$this->cfg->show_tags)."') + "; + }*/ + + $result = $this->db->db_query($query_str); + + while($row = $this->db->db_fetch_object($result)) { + array_push($all, $row['id']); + } + + return $all[array_rand($all)]; + + } // get_random_tag_photo() + /** * validates provided date * @@ -2590,7 +2767,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() /** @@ -2660,6 +2839,7 @@ class PHPFSPOT { private function get_phpfspot_url() { return $this->get_web_protocol() ."://". $this->get_server_name() . $this->cfg->web_path; + } // get_phpfspot_url() /** @@ -2852,9 +3032,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; @@ -2930,7 +3112,7 @@ class PHPFSPOT { */ public function get_mime_info($file) { - $details = getimagesize($orig_image); + $details = getimagesize($file); /* if getimagesize() returns empty, try at least to find out the mime type. @@ -2971,6 +3153,86 @@ 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)) { + + $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; + case 'photo': + if(is_numeric($options[2])) { + require_once "phpfspot_img.php"; + $img = new PHPFSPOT_IMG; + if(isset($options[3]) && is_numeric($options[3])) + $img->showImg($options[2], $options[3]); + else + $img->showImg($options[2]); + } + exit; + break; + case 'tag': + if(is_numeric($options[2])) { + $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; + } + } + + } // parse_user_friendly_url() + + /** + * check if user-friendly-urls are enabled + * + * this function will return true, if the config option + * $user_friendly_url has been set. Otherwise false. + * @return boolean + */ + private function is_user_friendly_url() + { + if(isset($this->cfg->user_friendly_url) && $this->cfg->user_friendly_url) + return true; + + return false; + + } // 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 ?>