summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/gallery/controllers/albums.php3
-rw-r--r--modules/gallery/controllers/movies.php23
-rw-r--r--modules/gallery/controllers/photos.php23
-rw-r--r--modules/gallery/libraries/Display_Context.php71
-rw-r--r--modules/gallery/libraries/Item_Display_Context.php44
-rw-r--r--modules/search/controllers/search.php21
-rw-r--r--modules/search/helpers/search.php45
-rw-r--r--modules/search/libraries/Search_Display_Context.php52
-rw-r--r--modules/tag/controllers/tag.php21
-rw-r--r--modules/tag/helpers/tag.php19
-rw-r--r--modules/tag/libraries/Tag_Display_Context.php49
-rw-r--r--modules/tag/models/tag.php38
12 files changed, 343 insertions, 66 deletions
diff --git a/modules/gallery/controllers/albums.php b/modules/gallery/controllers/albums.php
index 1c48c734..9bf7b9bf 100644
--- a/modules/gallery/controllers/albums.php
+++ b/modules/gallery/controllers/albums.php
@@ -60,6 +60,9 @@ class Albums_Controller extends Items_Controller {
url::redirect($album->abs_url("page=$max_pages"));
}
+ Display_Context::factory("item")
+ ->save();
+
$template = new Theme_View("page.html", "collection", "album");
$template->set_global(
array("page" => $page,
diff --git a/modules/gallery/controllers/movies.php b/modules/gallery/controllers/movies.php
index 0f12c3fb..bbf89f17 100644
--- a/modules/gallery/controllers/movies.php
+++ b/modules/gallery/controllers/movies.php
@@ -27,27 +27,12 @@ class Movies_Controller extends Items_Controller {
access::required("view", $movie);
- $where = array(array("type", "!=", "album"));
- $position = item::get_position($movie, $where);
- if ($position > 1) {
- list ($previous_item, $ignore, $next_item) =
- $movie->parent()->viewable()->children(3, $position - 2, $where);
- } else {
- $previous_item = null;
- list ($next_item) = $movie->parent()->viewable()->children(1, $position, $where);
- }
-
$template = new Theme_View("page.html", "item", "movie");
$template->set_global(
- array("item" => $movie,
- "children" => array(),
- "children_count" => 0,
- "parents" => $movie->parents()->as_array(),
- "breadcrumbs" => Breadcrumb::array_from_item_parents($movie),
- "next_item" => $next_item,
- "previous_item" => $previous_item,
- "sibling_count" => $movie->parent()->viewable()->children_count($where),
- "position" => $position));
+ array_merge(array("item" => $movie,
+ "children" => array(),
+ "children_count" => 0),
+ Display_Context::factory()->display_context($movie)));
$template->content = new View("movie.html");
diff --git a/modules/gallery/controllers/photos.php b/modules/gallery/controllers/photos.php
index af8aed16..49bb5a25 100644
--- a/modules/gallery/controllers/photos.php
+++ b/modules/gallery/controllers/photos.php
@@ -27,27 +27,12 @@ class Photos_Controller extends Items_Controller {
access::required("view", $photo);
- $where = array(array("type", "!=", "album"));
- $position = item::get_position($photo, $where);
- if ($position > 1) {
- list ($previous_item, $ignore, $next_item) =
- $photo->parent()->viewable()->children(3, $position - 2, $where);
- } else {
- $previous_item = null;
- list ($next_item) = $photo->parent()->viewable()->children(1, $position, $where);
- }
-
$template = new Theme_View("page.html", "item", "photo");
$template->set_global(
- array("item" => $photo,
- "children" => array(),
- "children_count" => 0,
- "parents" => $photo->parents()->as_array(),
- "breadcrumbs" => Breadcrumb::array_from_item_parents($photo),
- "next_item" => $next_item,
- "previous_item" => $previous_item,
- "sibling_count" => $photo->parent()->viewable()->children_count($where),
- "position" => $position));
+ array_merge(array("item" => $photo,
+ "children" => array(),
+ "children_count" => 0),
+ Display_Context::factory()->display_context($photo)));
$template->content = new View("photo.html");
diff --git a/modules/gallery/libraries/Display_Context.php b/modules/gallery/libraries/Display_Context.php
new file mode 100644
index 00000000..5054cffb
--- /dev/null
+++ b/modules/gallery/libraries/Display_Context.php
@@ -0,0 +1,71 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2011 Bharat Mediratta
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+abstract class Display_Context_Core {
+ private $_display_context_name;
+ private $_data;
+
+ static function factory($display_context_name=null) {
+ if (empty($display_context_name)) {
+ $display_context_id = Session::instance()->get("display_context_id", "");
+ $context = Cache::instance()->get($display_context_id, null);
+ $context = empty($context) ? new Item_Display_Context() : unserialize($context);
+ } else {
+ $class_prefix = ucfirst(strtolower($display_context_name));
+ $class_name = "{$class_prefix}_Display_Context";
+ $context = new $class_name();
+ }
+
+ return $context;
+ }
+
+ protected function __construct($display_context_name) {
+ // $this->reset($display_context_name);
+ $this->_data = array();
+ $this->_display_context_name = $display_context_name;
+ }
+
+ final function get($key) {
+ return empty($this->_data[$key]) ? null : $this->_data[$key];
+ }
+
+ final function set($key, $value=null) {
+ if (is_array($key)) {
+ if ((array)$key == $key) {
+ $this->_data = array_merge($this->_data, $key);
+ } else {
+ $this->_data = array_merge($this->_data, array_fill_keys($key, $value));
+ }
+ } else {
+ $this->_data[$key] = $value;
+ }
+ return $this;
+ }
+
+ final function save() {
+ $context_data = serialize($this);
+ $display_context_id = "display_context_" . md5($context_data);
+ Session::instance()->set("display_context_id", $display_context_id);
+ Cache::instance()->set($display_context_id, $context_data);
+ return $this;
+ }
+
+ abstract function display_context($item);
+}
diff --git a/modules/gallery/libraries/Item_Display_Context.php b/modules/gallery/libraries/Item_Display_Context.php
new file mode 100644
index 00000000..d0562790
--- /dev/null
+++ b/modules/gallery/libraries/Item_Display_Context.php
@@ -0,0 +1,44 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2011 Bharat Mediratta
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+class Item_Display_Context_Core extends Display_Context {
+ protected function __construct() {
+ parent::__construct("item");
+ }
+
+ function display_context($item) {
+ $where = array(array("type", "!=", "album"));
+ $position = item::get_position($item, $where);
+ if ($position > 1) {
+ list ($previous_item, $ignore, $next_item) =
+ $item->parent()->viewable()->children(3, $position - 2, $where);
+ } else {
+ $previous_item = null;
+ list ($next_item) = $item->parent()->viewable()->children(1, $position, $where);
+ }
+
+ return array("position" =>$position,
+ "previous_item" => $previous_item,
+ "next_item" =>$next_item,
+ "sibling_count" => $item->parent()->viewable()->children_count($where),
+ "parents" => $item->parents()->as_array(),
+ "breadcrumbs" => Breadcrumb::array_from_item_parents($item));
+ }
+}
diff --git a/modules/search/controllers/search.php b/modules/search/controllers/search.php
index 5db63ab0..1d5a55bf 100644
--- a/modules/search/controllers/search.php
+++ b/modules/search/controllers/search.php
@@ -21,6 +21,18 @@ class Search_Controller extends Controller {
public function index() {
$page_size = module::get_var("gallery", "page_size", 9);
$q = Input::instance()->get("q");
+ $q_with_more_terms = search::add_query_terms($q);
+ $show = Input::instance()->get("show");
+
+ if ($show) {
+ $child = ORM::factory("item", $show);
+ $index = search::get_position($child, $q_with_more_terms);
+ if ($index) {
+ $page = ceil($index / $page_size);
+ url::redirect( url::abs_site("search?q=" . urlencode($q) . ($page == 1 ? "" : "&page=$page")));
+ }
+ }
+
$page = Input::instance()->get("page", 1);
// Make sure that the page references a valid offset
@@ -30,11 +42,18 @@ class Search_Controller extends Controller {
$offset = ($page - 1) * $page_size;
- $q_with_more_terms = search::add_query_terms($q);
list ($count, $result) = search::search($q_with_more_terms, $page_size, $offset);
+ $title = t("Search: %q", array("q" => $q_with_more_terms));
+
$max_pages = max(ceil($count / $page_size), 1);
+ Display_Context::factory("search")
+ ->set(array("title" => $title,
+ "query_terms" => $q_with_more_terms,
+ "q" => $q))
+ ->save();
+
$template = new Theme_View("page.html", "collection", "search");
$root = item::root();
$template->set_global(
diff --git a/modules/search/helpers/search.php b/modules/search/helpers/search.php
index a3fd795a..a77a2433 100644
--- a/modules/search/helpers/search.php
+++ b/modules/search/helpers/search.php
@@ -36,8 +36,19 @@ class search_Core {
static function search($q, $limit, $offset) {
$db = Database::instance();
- $q = $db->escape($q);
+ $query = self::_build_query_base($q) .
+ "ORDER BY `score` DESC " .
+ "LIMIT $limit OFFSET " . (int)$offset;
+
+ $data = $db->query($query);
+ $count = $db->query("SELECT FOUND_ROWS() as c")->current()->c;
+
+ return array($count, new ORM_Iterator(ORM::factory("item"), $data));
+ }
+
+ private static function _build_query_base($q, $where=array()) {
+ $q = Database::instance()->escape($q);
if (!identity::active_user()->admin) {
foreach (identity::group_ids_for_active_user() as $id) {
$fields[] = "`view_$id` = TRUE"; // access::ALLOW
@@ -47,18 +58,13 @@ class search_Core {
$access_sql = "";
}
- $query =
+ return
"SELECT SQL_CALC_FOUND_ROWS {items}.*, " .
" MATCH({search_records}.`data`) AGAINST ('$q') AS `score` " .
"FROM {items} JOIN {search_records} ON ({items}.`id` = {search_records}.`item_id`) " .
"WHERE MATCH({search_records}.`data`) AGAINST ('$q' IN BOOLEAN MODE) " .
- $access_sql .
- "ORDER BY `score` DESC " .
- "LIMIT $limit OFFSET " . (int)$offset;
- $data = $db->query($query);
- $count = $db->query("SELECT FOUND_ROWS() as c")->current()->c;
-
- return array($count, new ORM_Iterator(ORM::factory("item"), $data));
+ (empty($where) ? "" : " AND " . join(" AND ", $where)) .
+ $access_sql;
}
/**
@@ -103,4 +109,25 @@ class search_Core {
return array($remaining, $total, $percent);
}
+
+ static function get_position($item, $q) {
+ $page_size = module::get_var("gallery", "page_size", 9);
+
+ $query = self::_build_query_base($q, array("{items}.id = " . $item->id));
+
+ $db = Database::instance();
+
+ // Truncate the score by two decimal places as this resolves the issues
+ // that arise due to in exact numeric conversions.
+ $score = $db->query($query)->current()->score;
+ $score = substr($score, 0, strlen($score) - 2);
+
+ $data = $db->query(self::_build_query_base($q) . "having `score` >= " . $score);
+
+ $data->seek($data->count() - 1);
+
+ while ($data->get("id") != $item->id && $data->prev()->valid());
+
+ return $data->key() + 1;
+ }
}
diff --git a/modules/search/libraries/Search_Display_Context.php b/modules/search/libraries/Search_Display_Context.php
new file mode 100644
index 00000000..aed3a125
--- /dev/null
+++ b/modules/search/libraries/Search_Display_Context.php
@@ -0,0 +1,52 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2011 Bharat Mediratta
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+class Search_Display_Context_Core extends Display_Context {
+ protected function __construct() {
+ parent::__construct("search");
+ }
+
+ function display_context($item) {
+ $position = search::get_position($item, $this->get("query_terms"));
+
+ if ($position > 1) {
+ list ($count, $result_data) =
+ search::search($this->get("query_terms"), 3, $position - 2);
+ list ($previous_item, $ignore, $next_item) = $result_data;
+ } else {
+ $previous_item = null;
+ list ($count, $result_data) = search::search($this->get("query_terms"), 1, $position);
+ list ($next_item) = $result_data;
+ }
+
+ $q = $this->get("q");
+ $search_url = url::abs_site("search?q=" . urlencode($q) . "&show={$item->id}");
+ $root = item::root();
+
+ return array("position" =>$position,
+ "previous_item" => $previous_item,
+ "next_item" =>$next_item,
+ "sibling_count" => $count,
+ "breadcrumbs" => array(
+ Breadcrumb::instance($root->title, "/", $root->id),
+ Breadcrumb::instance($q, $search_url),
+ Breadcrumb::instance($item->title, $item->url())));
+ }
+}
diff --git a/modules/tag/controllers/tag.php b/modules/tag/controllers/tag.php
index 7786daa1..1628f0ac 100644
--- a/modules/tag/controllers/tag.php
+++ b/modules/tag/controllers/tag.php
@@ -22,7 +22,22 @@ class Tag_Controller extends Controller {
$tag_id = $function;
$tag = ORM::factory("tag")->where("id", "=", $tag_id)->find();
$page_size = module::get_var("gallery", "page_size", 9);
- $page = (int) Input::instance()->get("page", "1");
+
+ $input = Input::instance();
+ $show = $input->get("show");
+
+ if ($show) {
+ $child = ORM::factory("item", $show);
+ $index = tag::get_position($tag, $child);
+ if ($index) {
+ $page = ceil($index / $page_size);
+ $uri = "tag/$tag_id/" . urlencode($tag->name);
+ url::redirect($uri . ($page == 1 ? "" : "?page=$page"));
+ }
+ } else {
+ $page = (int) $input->get("page", "1");
+ }
+
$children_count = $tag->items_count();
$offset = ($page-1) * $page_size;
$max_pages = max(ceil($children_count / $page_size), 1);
@@ -35,6 +50,10 @@ class Tag_Controller extends Controller {
}
$root = item::root();
+ Display_Context::factory("tag")
+ ->set(array("tag" => $tag))
+ ->save();
+
$template = new Theme_View("page.html", "collection", "tag");
$template->set_global(
array("page" => $page,
diff --git a/modules/tag/helpers/tag.php b/modules/tag/helpers/tag.php
index c21104ee..83a00080 100644
--- a/modules/tag/helpers/tag.php
+++ b/modules/tag/helpers/tag.php
@@ -136,4 +136,23 @@ class tag_Core {
// extremely rare case.
db::build()->delete("tags")->where("count", "=", 0)->execute();
}
+
+ /**
+ * Find the position of the given item in the tag collection. The resulting
+ * value is 1-indexed, so the first child in the album is at position 1.
+ *
+ * @param Tag_Model $tag
+ * @param Item_Model $item
+ * @param array $where an array of arrays, each compatible with ORM::where()
+ */
+ static function get_position($tag, $item, $where=array()) {
+ return ORM::factory("item")
+ ->viewable()
+ ->join("items_tags", "items.id", "items_tags.item_id")
+ ->where("items_tags.tag_id", "=", $tag->id)
+ ->where("items.id", "<=", $item->id)
+ ->merge_where($where)
+ ->order_by("items.id")
+ ->count_all();
+ }
} \ No newline at end of file
diff --git a/modules/tag/libraries/Tag_Display_Context.php b/modules/tag/libraries/Tag_Display_Context.php
new file mode 100644
index 00000000..47c79088
--- /dev/null
+++ b/modules/tag/libraries/Tag_Display_Context.php
@@ -0,0 +1,49 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2011 Bharat Mediratta
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+class Tag_Display_Context_Core extends Display_Context {
+ protected function __construct() {
+ parent::__construct("tag");
+ }
+
+ function display_context($item) {
+ $tag = $this->get("tag");
+
+ $where = array(array("type", "!=", "album"));
+
+ $position = tag::get_position($tag, $item, $where);
+ if ($position > 1) {
+ list ($previous_item, $ignore, $next_item) = $tag->items(3, $position - 2, $where);
+ } else {
+ $previous_item = null;
+ list ($next_item) = $tag->items(1, $position, $where);
+ }
+
+ $root = item::root();
+ return array("position" =>$position,
+ "previous_item" => $previous_item,
+ "next_item" =>$next_item,
+ "sibling_count" => $tag->items_count($where),
+ "breadcrumbs" => array(
+ Breadcrumb::instance($root->title, $root->url())->set_first(),
+ Breadcrumb::instance($tag->name, $tag->url("show={$item->id}")),
+ Breadcrumb::instance($item->title, $item->url())->set_last()));
+ }
+}
diff --git a/modules/tag/models/tag.php b/modules/tag/models/tag.php
index bb79e707..a7150df8 100644
--- a/modules/tag/models/tag.php
+++ b/modules/tag/models/tag.php
@@ -33,35 +33,39 @@ class Tag_Model_Core extends ORM {
* Return all viewable items associated with this tag.
* @param integer $limit number of rows to limit result to
* @param integer $offset offset in result to start returning rows from
- * @param string $type the type of item (album, photo)
+ * @param string $where an array of arrays, each compatible with ORM::where()
* @return ORM_Iterator
*/
- public function items($limit=null, $offset=null, $type=null) {
- $model = ORM::factory("item")
+ public function items($limit=null, $offset=null, $where=array()) {
+ if (is_scalar($where)) {
+ // backwards compatibility
+ $where = array(array("items.type", "=", $where));
+ }
+ return ORM::factory("item")
->viewable()
->join("items_tags", "items.id", "items_tags.item_id")
- ->where("items_tags.tag_id", "=", $this->id);
- if ($type) {
- $model->where("items.type", "=", $type);
- }
- return $model->find_all($limit, $offset);
+ ->where("items_tags.tag_id", "=", $this->id)
+ ->merge_where($where)
+ ->order_by("items.id")
+ ->find_all($limit, $offset);
}
/**
* Return the count of all viewable items associated with this tag.
- * @param string $type the type of item (album, photo)
+ * @param string $where an array of arrays, each compatible with ORM::where()
* @return integer
*/
- public function items_count($type=null) {
- $model = ORM::factory("item")
+ public function items_count($where=array()) {
+ if (is_scalar($where)) {
+ // backwards compatibility
+ $where = array(array("items.type", "=", $where));
+ }
+ return $model = ORM::factory("item")
->viewable()
->join("items_tags", "items.id", "items_tags.item_id")
- ->where("items_tags.tag_id", "=", $this->id);
-
- if ($type) {
- $model->where("items.type", "=", $type);
- }
- return $model->count_all();
+ ->where("items_tags.tag_id", "=", $this->id)
+ ->merge_where($where)
+ ->count_all();
}
/**