From 68cb8b0b2d4bf695a29ffdc4050f13031c05e60b Mon Sep 17 00:00:00 2001 From: Shish Date: Tue, 28 Jul 2009 11:20:50 +0100 Subject: [PATCH] initial import of favorites extension --- contrib/favorites/main.php | 163 ++++++++++++++++++++++++++++++++++++ contrib/favorites/theme.php | 71 ++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 contrib/favorites/main.php create mode 100644 contrib/favorites/theme.php diff --git a/contrib/favorites/main.php b/contrib/favorites/main.php new file mode 100644 index 00000000..55f4fc2e --- /dev/null +++ b/contrib/favorites/main.php @@ -0,0 +1,163 @@ + + * License: GPLv2 + * Description: Allow users to favorite images + */ + +class FavoriteSetEvent extends Event { + var $image_id, $user, $do_set; + + public function FavoriteSetEvent($image_id, $user, $do_set) { + $this->image_id = $image_id; + $this->user = $user; + $this->do_set = $do_set; + } +} + +class Favorites extends Extension { + var $theme; + + public function receive_event($event) { + if(is_null($this->theme)) $this->theme = get_theme_object("favorites", "FavoritesTheme"); + + if(is_a($event, 'InitExtEvent')) { + global $config; + if($config->get_int("ext_favorites_version", 0) < 1) { + $this->install(); + } + } + + if(is_a($event, 'DisplayingImageEvent')) { + global $user; + if(!$user->is_anonymous()) { + + $user_id = $user->id; + $image_id = $event->image->id; + + global $database; + + $is_favorited = false; + $sqlresult = $database->execute("SELECT COUNT(*) AS ct FROM user_favorites WHERE user_id = ? AND image_id = ?", array($user_id, $image_id)); + if(!$sqlresult->EOF) + { + $is_favorited = $sqlresult->fields['ct'] > 0; + } + + $html = $this->theme->get_voter_html($event->image, $is_favorited); + } else { + $html = $this->theme->show_anonymous_html($event->image); + } + $event->page->add_block(new Block("Favorites", $html, "left", 20)); + + $html = $this->theme->show_favorite_marks($this->list_persons_who_have_favorited($event->image)); + + $event->page->add_block(new Block("Favorited by", $html, "left", 25)); + } + + if(is_a($event, 'PageRequestEvent') && ($event->page_name == "change_favorite")) { + if(!$event->user->is_anonymous()) { + $image_id = int_escape($_POST['image_id']); + if (($_POST['favorite_action'] == "set") || ($_POST['favorite_action'] == "unset")) { + send_event(new FavoriteSetEvent($image_id, $event->user, ($_POST['favorite_action'] == "set"))); + } + $event->page->set_mode("redirect"); + $event->page->set_redirect(make_link("post/view/$image_id")); + } + } + + if(is_a($event, 'ImageInfoSetEvent')) { + global $user; + if (($_POST['favorite_action'] == "set") || ($_POST['favorite_action'] == "unset")) { + send_event(new FavoriteSetEvent($event->image_id, $user, ($_POST['favorite_action'] == "set"))); + } + } + + if(is_a($event, 'FavoriteSetEvent')) { + $this->add_vote($event->image_id, $event->user->id, $event->do_set); + } + + if(is_a($event, 'ImageDeletionEvent')) { + global $database; + $database->execute("DELETE FROM user_favorites WHERE image_id=?", array($event->image->id)); + } + + if(is_a($event, 'ParseLinkTemplateEvent')) { + $event->replace('$favorites', $event->image->favorites); + } + + if(is_a($event, 'SearchTermParseEvent')) { + $matches = array(); + if(preg_match("/favorites(<|>|<=|>=|=)(\d+)/", $event->term, $matches)) { + $cmp = $matches[1]; + $favorites = $matches[2]; + $event->set_querylet(new Querylet("favorites $cmp $favorites")); + } + else if(preg_match("/favorited_by=(.*)/i", $event->term, $matches)) { + global $database; + $user = $database->get_user_by_name($matches[1]); + if(!is_null($user)) { + $user_id = $user->id; + } + else { + $user_id = -1; + } + + $event->set_querylet(new Querylet("images.id IN (SELECT image_id FROM user_favorites WHERE user_id = $user_id)")); + } + else if(preg_match("/favorited_by_userno=([0-9]+)/i", $event->term, $matches)) { + $user_id = int_escape($matches[1]); + $event->set_querylet(new Querylet("images.id IN (SELECT image_id FROM user_favorites WHERE user_id = $user_id)")); + } + } + } + + private function install() { + global $database; + global $config; + + if($config->get_int("ext_favorites_version") < 1) { + $database->Execute("ALTER TABLE images ADD COLUMN favorites INTEGER NOT NULL DEFAULT 0"); + $database->Execute("CREATE INDEX images__favorites ON images(favorites)"); + $database->Execute(" + CREATE TABLE user_favorites ( + image_id INTEGER NOT NULL, + user_id INTEGER NOT NULL, + created_at DATETIME NOT NULL,, + UNIQUE(image_id, user_id), + INDEX(image_id) + ) + "); + $config->set_int("ext_favorites_version", 1); + } + } + + private function add_vote($image_id, $user_id, $do_set) { + global $database; + if ($do_set) { + $database->Execute( + "INSERT INTO user_favorites(image_id, user_id, created_at) VALUES(?, ?, NOW())", + array($image_id, $user_id)); + } else { + $database->Execute( + "DELETE FROM user_favorites WHERE image_id = ? AND user_id = ?", + array($image_id, $user_id)); + } + $database->Execute( + "UPDATE images SET favorites=(SELECT COUNT(*) FROM user_favorites WHERE image_id=?) WHERE id=?", + array($image_id, $image_id)); + } + + private function list_persons_who_have_favorited($image) { + global $database; + + $result = $database->execute( + "SELECT name FROM users WHERE id IN (SELECT user_id FROM user_favorites WHERE image_id = ?) ORDER BY name", + array($image->id)); + + return $result->GetArray(); + } +} +add_event_listener(new Favorites()); +?> diff --git a/contrib/favorites/theme.php b/contrib/favorites/theme.php new file mode 100644 index 00000000..6324a268 --- /dev/null +++ b/contrib/favorites/theme.php @@ -0,0 +1,71 @@ +id); + $i_favorites = int_escape($image->favorites); + + global $user; + $username = $user->name; + + $html = " + Favorites: $i_favorites +
+
"; + + if (!$is_favorited) + { + $html .= "

+ + + +

"; + } + else + { + $html .= "

+ + + +

"; + } + + $pos = strpos($username, ' '); + if ($pos === false) { + $html .= "
Show my favorites

"; + } else { + $userid = $user->id; + $html .= "
Show my favorites

"; + } + return $html; + } + + public function show_anonymous_html($image) { + $i_image_id = int_escape($image->id); + $i_favorites = int_escape($image->favorites); + + $html = " + Favorites: $i_favorites +

"; + return $html; + } + + public function show_favorite_marks($username_array) { + $html = ''; + + foreach ($username_array as $row) { + $username = $row['name']; + $html .= "$username
"; + } + + if ($html == '') { + $html = 'Not favorited yet'; + } + + return $html; + + } + +} + +?>