make favorites work with 2.3

This commit is contained in:
Shish 2009-07-28 11:21:41 +01:00
parent 68cb8b0b2d
commit 77368cb03b
2 changed files with 133 additions and 159 deletions

View File

@ -16,78 +16,81 @@ class FavoriteSetEvent extends Event {
} }
} }
class Favorites extends Extension { class Favorites extends SimpleExtension {
var $theme; public function onInitExt($event) {
public function receive_event($event) {
if(is_null($this->theme)) $this->theme = get_theme_object("favorites", "FavoritesTheme");
if(is_a($event, 'InitExtEvent')) {
global $config; global $config;
if($config->get_int("ext_favorites_version", 0) < 1) { if($config->get_int("ext_favorites_version", 0) < 1) {
$this->install(); $this->install();
} }
} }
if(is_a($event, 'DisplayingImageEvent')) { public function onImageAdminBlockBuilding($event) {
global $user; global $database, $page, $user;
if(!$user->is_anonymous()) { if(!$user->is_anonymous()) {
$user_id = $user->id; $user_id = $user->id;
$image_id = $event->image->id; $image_id = $event->image->id;
global $database; $is_favorited = $database->db->GetOne(
"SELECT COUNT(*) AS ct FROM user_favorites WHERE user_id = ? AND image_id = ?",
array($user_id, $image_id)) > 0;
$is_favorited = false; $event->add_part($this->theme->get_voter_html($event->image, $is_favorited));
$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); public function onDisplayingImage($event) {
} else { $people = $this->list_persons_who_have_favorited($event->image);
$html = $this->theme->show_anonymous_html($event->image); if(count($people) > 0) {
$html = $this->theme->display_people($people);
} }
$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")) { public function onPageRequest($event) {
if(!$event->user->is_anonymous()) { global $page, $user;
if($event->page_matches("change_favorite") && !$user->is_anonymous()) {
$image_id = int_escape($_POST['image_id']); $image_id = int_escape($_POST['image_id']);
if (($_POST['favorite_action'] == "set") || ($_POST['favorite_action'] == "unset")) { if (($_POST['favorite_action'] == "set") || ($_POST['favorite_action'] == "unset")) {
send_event(new FavoriteSetEvent($image_id, $event->user, ($_POST['favorite_action'] == "set"))); send_event(new FavoriteSetEvent($image_id, $user, ($_POST['favorite_action'] == "set")));
} }
$event->page->set_mode("redirect"); $page->set_mode("redirect");
$event->page->set_redirect(make_link("post/view/$image_id")); $page->set_redirect(make_link("post/view/$image_id"));
} }
} }
if(is_a($event, 'ImageInfoSetEvent')) { public function onImageInfoSet($event) {
global $user; global $user;
if(($_POST['favorite_action'] == "set") || ($_POST['favorite_action'] == "unset")) { if(($_POST['favorite_action'] == "set") || ($_POST['favorite_action'] == "unset")) {
send_event(new FavoriteSetEvent($event->image_id, $user, ($_POST['favorite_action'] == "set"))); send_event(new FavoriteSetEvent($event->image_id, $user, ($_POST['favorite_action'] == "set")));
} }
} }
if(is_a($event, 'FavoriteSetEvent')) { public function onFavoriteSet($event) {
$this->add_vote($event->image_id, $event->user->id, $event->do_set); global $user;
$this->add_vote($event->image_id, $user->id, $event->do_set);
} }
if(is_a($event, 'ImageDeletionEvent')) { public function onImageDeletion($event) {
global $database; global $database;
$database->execute("DELETE FROM user_favorites WHERE image_id=?", array($event->image->id)); $database->execute("DELETE FROM user_favorites WHERE image_id=?", array($event->image->id));
} }
if(is_a($event, 'ParseLinkTemplateEvent')) { public function onParseLinkTemplate($event) {
$event->replace('$favorites', $event->image->favorites); $event->replace('$favorites', $event->image->favorites);
} }
if(is_a($event, 'SearchTermParseEvent')) { public function onUserBlockBuilding($event) {
global $user;
if(strpos($user->name, ' ') === false) {
$username = url_escape($user->name);
$link = make_link("post/list/favorited_by=$username/1");
} else {
$userid = $user->id;
$link = make_link("post/list/favorited_by_userno=$userid/1");
}
$event->add_link("My Favorites", $link);
}
public function onSearchTermParse($event) {
$matches = array(); $matches = array();
if(preg_match("/favorites(<|>|<=|>=|=)(\d+)/", $event->term, $matches)) { if(preg_match("/favorites(<|>|<=|>=|=)(\d+)/", $event->term, $matches)) {
$cmp = $matches[1]; $cmp = $matches[1];
@ -96,7 +99,7 @@ class Favorites extends Extension {
} }
else if(preg_match("/favorited_by=(.*)/i", $event->term, $matches)) { else if(preg_match("/favorited_by=(.*)/i", $event->term, $matches)) {
global $database; global $database;
$user = $database->get_user_by_name($matches[1]); $user = User::by_name($matches[1]);
if(!is_null($user)) { if(!is_null($user)) {
$user_id = $user->id; $user_id = $user->id;
} }
@ -104,15 +107,15 @@ class Favorites extends Extension {
$user_id = -1; $user_id = -1;
} }
$event->set_querylet(new Querylet("images.id IN (SELECT image_id FROM user_favorites WHERE user_id = $user_id)")); $event->add_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)) { else if(preg_match("/favorited_by_userno=([0-9]+)/i", $event->term, $matches)) {
$user_id = int_escape($matches[1]); $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)")); $event->add_querylet(new Querylet("images.id IN (SELECT image_id FROM user_favorites WHERE user_id = $user_id)"));
}
} }
} }
private function install() { private function install() {
global $database; global $database;
global $config; global $config;
@ -124,7 +127,7 @@ class Favorites extends Extension {
CREATE TABLE user_favorites ( CREATE TABLE user_favorites (
image_id INTEGER NOT NULL, image_id INTEGER NOT NULL,
user_id INTEGER NOT NULL, user_id INTEGER NOT NULL,
created_at DATETIME NOT NULL,, created_at DATETIME NOT NULL,
UNIQUE(image_id, user_id), UNIQUE(image_id, user_id),
INDEX(image_id) INDEX(image_id)
) )
@ -159,5 +162,4 @@ class Favorites extends Extension {
return $result->GetArray(); return $result->GetArray();
} }
} }
add_event_listener(new Favorites());
?> ?>

View File

@ -1,71 +1,43 @@
<?php <?php
class FavoritesTheme extends Themelet { class FavoritesTheme extends Themelet {
public function get_voter_html($image, $is_favorited) { public function get_voter_html(Image $image, $is_favorited) {
global $page, $user;
$i_image_id = int_escape($image->id); $i_image_id = int_escape($image->id);
$i_favorites = int_escape($image->favorites); if(!$is_favorited) {
$html = "<form action='".make_link("change_favorite")."' method='POST'>
global $user;
$username = $user->name;
$html = "
Favorites: $i_favorites
<br>
<br>";
if (!$is_favorited)
{
$html .= "<p><form action='".make_link("change_favorite")."' method='POST'>
<input type='hidden' name='image_id' value='$i_image_id'> <input type='hidden' name='image_id' value='$i_image_id'>
<input type='hidden' name='favorite_action' value='set'> <input type='hidden' name='favorite_action' value='set'>
<input type='submit' value='Favorite'> <input type='submit' value='Favorite'>
</form></p>"; </form>
";
} }
else else {
{ $html = "<form action='".make_link("change_favorite")."' method='POST'>
$html .= "<p><form action='".make_link("change_favorite")."' method='POST'>
<input type='hidden' name='image_id' value='$i_image_id'> <input type='hidden' name='image_id' value='$i_image_id'>
<input type='hidden' name='favorite_action' value='unset'> <input type='hidden' name='favorite_action' value='unset'>
<input type='submit' value='Un-Favorite'> <input type='submit' value='Un-Favorite'>
</form></p>"; </form>
";
} }
$pos = strpos($username, ' ');
if ($pos === false) {
$html .= "<br><a href='".make_link("post/list/favorited_by=$username/1")."'>Show my favorites</a><br><br>";
} else {
$userid = $user->id;
$html .= "<br><a href='".make_link("post/list/favorited_by_userno=$userid/1")."'>Show my favorites</a><br><br>";
}
return $html; return $html;
} }
public function show_anonymous_html($image) { public function display_people($username_array) {
$i_image_id = int_escape($image->id); global $page;
$i_favorites = int_escape($image->favorites);
$html = " $i_favorites = count($username_array);
Favorites: $i_favorites $html = "$i_favorites people:";
<br><br>";
return $html;
}
public function show_favorite_marks($username_array) {
$html = '';
foreach($username_array as $row) { foreach($username_array as $row) {
$username = $row['name']; $username = html_escape($row['name']);
$html .= "<a href='".make_link("user/$username")."'>$username</a><br>"; $html .= "<br><a href='".make_link("user/$username")."'>$username</a>";
} }
if ($html == '') { $page->add_block(new Block("Favorited by", $html, "left", 25));
$html = 'Not favorited yet';
} }
return $html;
}
} }
?> ?>