require_once "phpfspot_cfg.php";
require_once "phpfspot_db.php";
-require_once "phpfspot_tmpl.php";
class PHPFSPOT {
*/
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);
}
- $this->cfg = new PHPFSPOT_CFG;
-
- $this->db = new PHPFSPOT_DB(&$this, $this->cfg->fspot_db);
+ $this->db = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
+ if(!is_writeable($this->cfg->fspot_db)) {
+ print $this->cfg->fspot_db ." is not writeable for user ". $this->getuid() ."\n";
+ exit(1);
+ }
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);
+ $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();
+ /* 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();
+ /* check if all necessary indices exist */
+ $this->checkDbIndices();
session_start();
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'] = '';
$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;
+ 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($_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()
/**
*
* this function will get all available tags from
* the f-spot database and store them within two
- * arrays within this clase for later usage. in
+ * arrays within this class for later usage. in
* fact, if the user requests (hide_tags) it will
* opt-out some of them.
*
$this->avail_tags = Array();
$count = 0;
- $result = $this->db->db_query("
- SELECT id,name
- FROM tags
- ORDER BY sort_priority ASC
- ");
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str="
+ SELECT
+ DISTINCT t1.id as id, t1.name as name
+ FROM
+ photo_tags pt1
+ INNER JOIN photo_tags
+ pt2 ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t1
+ ON t1.id=pt1.tag_id
+ INNER JOIN tags t2
+ ON t2.id=pt2.tag_id
+ WHERE
+ t2.name IN ('".implode("','",$this->cfg->show_tags)."')
+ ORDER BY
+ t1.sort_priority ASC";
+
+ $result = $this->db->db_query($query_str);
+ }
+ else
+ {
+ $result = $this->db->db_query("
+ SELECT id,name
+ FROM tags
+ ORDER BY sort_priority ASC
+ ");
+ }
while($row = $this->db->db_fetch_object($result)) {
$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 you include the following if-clause and 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;
-
$count++;
}
*/
public function get_photo_details($idx)
{
- $result = $this->db->db_query("
- SELECT *
- FROM photos
- WHERE id='". $idx ."'
- ");
-
+ $query_str = "
+ SELECT p.id, p.name, p.time, p.directory_path, p.description
+ FROM photos p
+ ";
+
+ /* if show_tags is set, only return details for photos which
+ are specified to be shown
+ */
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "
+ INNER JOIN photo_tags pt
+ ON p.id=pt.photo_id
+ INNER JOIN tags t
+ ON pt.tag_id=t.id
+ WHERE p.id='". $idx ."'
+ AND t.name IN ('".implode("','",$this->cfg->show_tags)."')";
+ }
+ else {
+ $query_str.= "
+ WHERE p.id='". $idx ."'
+ ";
+ }
+
+ $result = $this->db->db_query($query_str);
return $this->db->db_fetch_object($result);
} // get_photo_details
public function getPhotoName($idx, $limit = 0)
{
if($details = $this->get_photo_details($idx)) {
- $name = $details['name'];
- if($limit != 0 && strlen($name) > $limit) {
- $name = substr($name, 0, $limit-5) ."...". substr($name, -($limit-5));
- }
+ $name = $this->shrink_text($details['name'], $limit);
return $name;
}
} // getPhotoName()
+ /**
+ * shrink text according provided limit
+ *
+ * If the length of the name exceeds $limit the
+ * text will be shortend and some content in between
+ * will be replaced with "..."
+ */
+ private function shrink_text($text, $limit)
+ {
+ if($limit != 0 && strlen($text) > $limit) {
+ $text = substr($text, 0, $limit-5) ."...". substr($text, -($limit-5));
+ }
+
+ return $text;
+
+ } // shrink_text();
+
/**
* translate f-spoth photo path
*
}
$orig_path = $this->translate_path($details['directory_path']) ."/". $details['name'];
- $thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->photo_width ."_". $this->getMD5($photo);
+ $thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
if(!file_exists($orig_path)) {
- $this->_warning("Photo ". $orig_path ." does not exist!<br />\n");
+ $this->_error("Photo ". $orig_path ." does not exist!<br />\n");
}
if(!is_readable($orig_path)) {
- $this->_warning("Photo ". $orig_path ." is not readable for user ". $this->getuid() ."<br />\n");
+ $this->_error("Photo ". $orig_path ." is not readable for user ". $this->getuid() ."<br />\n");
}
/* If the thumbnail doesn't exist yet, try to create it */
if(!file_exists($thumb_path)) {
$this->gen_thumb($photo, true);
- $thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->photo_width ."_". $this->getMD5($photo);
+ $thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
}
/* get f-spot database meta information */
$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);
$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;
}
$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");
*/
public function getAvailableTags()
{
+ $this->get_tags();
+
$output = "";
$result = $this->db->db_query("
// uncomment if you want sizes in whole %:
$size = ceil($size);
- $output.= "<a href=\"javascript:Tags('add', ". $key .");\" class=\"tag\" style=\"font-size: ". $size ."%;\">". $this->tags[$key] ."</a>, ";
+ if(isset($this->tags[$key])) {
+ $output.= "<a href=\"javascript:Tags('add', ". $key .");\" class=\"tag\" style=\"font-size: ". $size ."%;\">". $this->tags[$key] ."</a>, ";
+ }
}
*/
public function getSelectedTags()
{
+ $this->get_tags();
+
$output = "";
foreach($this->avail_tags as $tag)
{
*/
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();
{
$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("
- SELECT DISTINCT photo_id
- FROM photo_tags pt
+ $query_str = "
+ SELECT DISTINCT pt1.photo_id
+ FROM photo_tags pt1
+ INNER JOIN photo_tags pt2
+ ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t1
+ ON pt1.tag_id=t1.id
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
- ");
+ ON pt1.photo_id=p.id
+ INNER JOIN tags t2
+ ON pt2.tag_id=t2.id
+ WHERE t1.name LIKE '%". $_SESSION['searchfor'] ."%' ";
+
+ if(isset($additional_where_cond))
+ $query_str.= "AND ". $additional_where_cond ." ";
+
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "AND t2.name IN ('".implode("','",$this->cfg->show_tags)."')";
+ }
+
+ 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']);
}
$selected.= $tag .",";
$selected = substr($selected, 0, strlen($selected)-1);
+ /* photo has to match at least on of the selected tags */
if($_SESSION['tag_condition'] == 'or') {
- $result = $this->db->db_query("
- SELECT DISTINCT photo_id
- FROM photo_tags pt
+ $query_str = "
+ SELECT DISTINCT pt1.photo_id
+ FROM photo_tags pt1
+ INNER JOIN photo_tags pt2
+ ON pt1.photo_id=pt2.photo_id
+ INNER JOIN tags t
+ ON pt2.tag_id=t.id
INNER JOIN photos p
- ON p.id=pt.photo_id
- WHERE pt.tag_id IN (". $selected .")
- ORDER BY p.time ASC
- ");
+ ON pt1.photo_id=p.id
+ WHERE pt1.tag_id IN (". $selected .")
+ ";
+ if(isset($additional_where_cond))
+ $query_str.= "AND ". $additional_where_cond ." ";
+
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags)."')";
+ }
+
+ if(isset($order_str))
+ $query_str.= $order_str;
}
+ /* photo has to match all selected tags */
elseif($_SESSION['tag_condition'] == 'and') {
if(count($_SESSION['selected_tags']) >= 32) {
FROM photo_tags pt1
";
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "
+ INNER JOIN tags t
+ ON pt1.tag_id=t.id
+ ";
+ }
+
for($i = 0; $i < count($_SESSION['selected_tags']); $i++) {
$query_str.= "
INNER JOIN photo_tags pt". ($i+2) ."
ON pt1.photo_id=pt". ($i+2) .".photo_id
";
}
- $query_str.= "WHERE pt1.tag_id=". $_SESSION['selected_tags'][0];
+ $query_str.= "
+ INNER JOIN photos p
+ ON pt1.photo_id=p.id
+ ";
+ $query_str.= "WHERE pt2.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] ."
+ AND pt". ($i+2) .".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($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
+ }
+
+ if(isset($order_str))
+ $query_str.= $order_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
- ");
+ $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;
- }
+ }
/* 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
- ");
+ INNER JOIN tags t
+ ON pt.tag_id=t.id
+ ";
+ if(isset($additional_where_cond))
+ $query_str.= "WHERE ". $additional_where_cond ." ";
+
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
+ }
+
+ 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']);
}
$img_name[$rows][$cols] = htmlspecialchars($this->getPhotoName($photos[$i], 15));
$img_title[$rows][$cols] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0));
- $thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->thumb_width ."_". $this->getMD5($photos[$i]);
+ $thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i]);
if(file_exists($thumb_path)) {
$info = getimagesize($thumb_path);
$this->tmpl->assign('searchfor', $_SESSION['searchfor']);
if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
- $this->tmpl->assign('from_date', $_SESSION['from_date']);
- $this->tmpl->assign('to_date', $_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'])) {
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) ||
$current_tags = $this->getCurrentTags();
$extern_link = "index.php?mode=showpi";
+ $rss_link = "index.php?mode=rss";
if($current_tags != "") {
$extern_link.= "&tags=". $current_tags;
+ $rss_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']);
+ $rss_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('rss_link', $rss_link);
$this->tmpl->assign('count', $count);
$this->tmpl->assign('width', $this->cfg->thumb_width);
$this->tmpl->assign('images', $images);
$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;
}
$file_md5 = md5_file($full_path);
- $this->_debug("Image [". $idx ."] ". $details['name'] ." Thumbnails:");
+ $this->_debug("Image [". $idx ."] ". $this->shrink_text($details['name'], 20) ." Thumbnails:");
+
+ $changes = false;
foreach($resolutions as $resolution) {
- $thumb_path = $this->cfg->base_path ."/thumbs/". $resolution ."_". $file_md5;
+ $thumb_sub_path = substr($file_md5, 0, 2);
+ $thumb_path = $this->cfg->thumb_path ."/". $thumb_sub_path ."/". $resolution ."_". $file_md5;
+
+ if(!file_exists(dirname($thumb_path))) {
+ mkdir(dirname($thumb_path), 0755);
+ }
/* if the thumbnail file doesn't exist, create it */
if(!file_exists($thumb_path)) {
$this->_debug(" ". $resolution ."px");
if(!$this->create_thumbnail($full_path, $thumb_path, $resolution))
$error = 1;
+
+ $changes = true;
}
/* if the file hasn't changed there is no need to regen the thumb */
elseif($file_md5 != $this->getMD5($idx) || $force) {
if(!$this->create_thumbnail($full_path, $thumb_path, $resolution))
$error = 1;
+ $changes = true;
}
}
+ if(!$changes) {
+ $this->_debug(" already exist");
+ }
+
/* set the new/changed MD5 sum for the current photo */
if(!$error) {
$this->setMD5($idx, $file_md5);
} // 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)
{
+ $this->get_tags();
+
$_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
$missing = true;
}
- if(!function_exists("sqlite3_open")) {
+ if($this->cfg->db_access == "native" && !function_exists("sqlite3_open")) {
print "PHP SQLite3 library extension is missing<br />\n";
$missing = true;
}
} // checkifImageSupported()
- public function _warning($text)
+ public function _error($text)
{
- print "<img src=\"resources/green_info.png\" alt=\"warning\" />\n";
- print $text;
+ switch($this->cfg->logging) {
+ case 'display':
+ print "<img src=\"resources/green_info.png\" alt=\"warning\" />\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 = "<input type=\"text\" size=\"3\" id=\"". $mode ."year\" value=\"". $year ."\" />\n";
- $output.= "<input type=\"text\" size=\"1\" id=\"". $mode ."month\" value=\"". $month ."\" />\n";
- $output.= "<input type=\"text\" size=\"1\" id=\"". $mode ."day\" value=\"". $day ."\" />\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 = "<input type=\"text\" size=\"3\" id=\"". $mode ."year\" value=\"". $year ."\"";
+ if(!isset($_SESSION[$mode .'_date'])) $output.= " disabled=\"disabled\"";
+ $output.= " />\n";
+ $output.= "<input type=\"text\" size=\"1\" id=\"". $mode ."month\" value=\"". $month ."\"";
+ if(!isset($_SESSION[$mode .'_date'])) $output.= " disabled=\"disabled\"";
+ $output.= " />\n";
+ $output.= "<input type=\"text\" size=\"1\" id=\"". $mode ."day\" value=\"". $day ."\"";
+ if(!isset($_SESSION[$mode .'_date'])) $output.= " disabled=\"disabled\"";
+ $output.= " />\n";
return $output;
} // get_calendar()
$pictures = $this->getPhotoSelection();
$current_tags = $this->getCurrentTags();
- if(!isset($_SERVER['HTTPS'])) $protocol = "http";
- else $protocol = "https";
-
- $server_name = $_SERVER['SERVER_NAME'];
-
foreach($pictures as $picture) {
- $orig_url = $protocol ."://". $server_name . $this->cfg->web_path ."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;
}
$orig_url.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date'];
}
- $thumb_url = $protocol ."://". $server_name . $this->cfg->web_path ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width;
+ $thumb_url = $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width;
switch($mode) {
break;
case 'MoinMoin':
- // [%pictureurl% %thumbnailurl%]
- print htmlspecialchars(" * [".$orig_url." ".$thumb_url."&fake=1.jpg]") ."<br />\n";
+ // "[%pictureurl% %thumbnailurl%]"
+ print htmlspecialchars("[".$orig_url." ".$thumb_url."&fake=1.jpg]") ."<br />\n";
break;
+
+ case 'MoinMoinList':
+ // " * [%pictureurl% %thumbnailurl%]"
+ print " " . htmlspecialchars("* [".$orig_url." ".$thumb_url."&fake=1.jpg]") ."<br />\n";
+ break;
+ }
+
+ }
+
+ } // getExport()
+
+ /**
+ * output RSS feed
+ */
+ public function getRSSFeed()
+ {
+ Header("Content-type: text/xml; charset=utf-8");
+ print "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+?>
+<rss version="2.0"
+ xmlns:media="http://search.yahoo.com/mrss/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ >
+ <channel>
+ <title>phpfspot</title>
+ <description>phpfspot RSS feed</description>
+ <link><?php print htmlspecialchars($this->get_phpfspot_url()); ?></link>
+ <pubDate><?php print strftime("%a, %d %b %Y %T %z"); ?></pubDate>
+ <generator>phpfspot</generator>
+<?php
+
+ $pictures = $this->getPhotoSelection();
+ $current_tags = $this->getCurrentTags();
+
+ foreach($pictures as $picture) {
+
+ $orig_url = $this->get_phpfspot_url() ."index.php?mode=showp&id=". $picture;
+ if($current_tags != "") {
+ $orig_url.= "&tags=". $current_tags;
+ }
+ if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
+ $orig_url.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date'];
}
+ $details = $this->get_photo_details($picture);
+
+ $thumb_url = $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width;
+ $thumb_html = htmlspecialchars("
+<a href=\"". $orig_url ."\"><img src=\"". $thumb_url ."\" /></a>
+<br>
+". $details['description']);
+
+ $orig_path = $this->translate_path($details['directory_path']) ."/". $details['name'];
+ $meta = $this->get_meta_informations($orig_path);
+ $meta_date = isset($meta['FileDateTime']) ? $meta['FileDateTime'] : filemtime($orig_path);
+
+?>
+ <item>
+ <title><?php print htmlspecialchars($details['name']); ?></title>
+ <link><?php print htmlspecialchars($orig_url); ?></link>
+ <guid><?php print htmlspecialchars($orig_url); ?></guid>
+ <dc:date.Taken><?php print strftime("%Y-%m-%dT%H:%M:%S+00:00", $meta_date); ?></dc:date.Taken>
+ <description>
+ <?php print $thumb_html; ?>
+ </description>
+ <pubDate><?php print strftime("%a, %d %b %Y %T %z", $meta_date); ?></pubDate>
+ </item>
+<?php
+
}
+?>
+ </channel>
+</rss>
+<?php
+
} // getExport()
+
/**
* return all selected tags as one string
*/
*/
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";
}
} // getuid()
+ /**
+ * returns a select-dropdown box to select photo index sort parameters
+ */
+ private function get_sort_field()
+ {
+ $output = "<select name=\"sort_order\">";
+ foreach(array('date_asc', 'date_desc', 'name_asc', 'name_desc') as $sort_order) {
+ $output.= "<option value=\"". $sort_order ."\"";
+ if($sort_order == $_SESSION['sort_order']) {
+ $output.= " selected=\"selected\"";
+ }
+ $output.= ">". $sort_order ."</option>";
+ }
+ $output.= "</select>";
+ 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']++;
+
+ return $this->get_phpfspot_url() ."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']--;
+
+ return $this->get_phpfspot_url() ."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()
+
+ /**
+ * returns the full path to a thumbnail
+ */
+ public function get_thumb_path($width, $photo)
+ {
+ $md5 = $this->getMD5($photo);
+ $sub_path = substr($md5, 0, 2);
+ return $this->cfg->thumb_path
+ . "/"
+ . $sub_path
+ . "/"
+ . $width
+ . "_"
+ . $md5;
+
+ } // get_thumb_path()
+
+ /**
+ * returns server's virtual host name
+ */
+ private function get_server_name()
+ {
+ return $_SERVER['SERVER_NAME'];
+ } // get_server_name()
+
+ /**
+ * returns type of webprotocol which is
+ * currently used
+ */
+ private function get_web_protocol()
+ {
+ if(!isset($_SERVER['HTTPS']))
+ return "http";
+ else
+ return "https";
+ } // get_web_protocol()
+
+ /**
+ * return url to this phpfspot installation
+ */
+ private function get_phpfspot_url()
+ {
+ return $this->get_web_protocol() ."://". $this->get_server_name() . $this->cfg->web_path;
+ } // get_phpfspot_url()
+
+ /**
+ * check file exists and is readable
+ *
+ * returns true, if everything is ok, otherwise false
+ * if $silent is not set, this function will output and
+ * error message
+ */
+ private function check_readable($file, $silent = null)
+ {
+ if(!file_exists($file)) {
+ if(!isset($silent))
+ print "File \"". $file ."\" does not exist.\n";
+ return false;
+ }
+
+ if(!is_readable($file)) {
+ if(!isset($silent))
+ print "File \"". $file ."\" is not reachable for user ". $this->getuid() ."\n";
+ return false;
+ }
+
+ return true;
+
+ } // check_readable()
+
+ /**
+ * check if all needed indices are present
+ *
+ * this function checks, if some needed indices are already
+ * present, or if not, create them on the fly. they are
+ * necessary to speed up some queries like that one look for
+ * all tags, when show_tags is specified in the configuration.
+ */
+ private function checkDbIndices()
+ {
+ $result = $this->db->db_exec("
+ CREATE INDEX IF NOT EXISTS
+ phototag
+ ON
+ photo_tags
+ (photo_id, tag_id)
+ ");
+
+ } // checkDbIndices()
+
}
?>