initial import of favorites extension
This commit is contained in:
parent
ce8915ba07
commit
68cb8b0b2d
163
contrib/favorites/main.php
Normal file
163
contrib/favorites/main.php
Normal file
@ -0,0 +1,163 @@
|
||||
<?php
|
||||
/**
|
||||
* Name: Favorites
|
||||
* Author: Daniel Marschall <info@daniel-marschall.de>
|
||||
* 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());
|
||||
?>
|
71
contrib/favorites/theme.php
Normal file
71
contrib/favorites/theme.php
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
class FavoritesTheme extends Themelet {
|
||||
public function get_voter_html($image, $is_favorited) {
|
||||
$i_image_id = int_escape($image->id);
|
||||
$i_favorites = int_escape($image->favorites);
|
||||
|
||||
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='favorite_action' value='set'>
|
||||
<input type='submit' value='Favorite'>
|
||||
</form></p>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= "<p><form action='".make_link("change_favorite")."' method='POST'>
|
||||
<input type='hidden' name='image_id' value='$i_image_id'>
|
||||
<input type='hidden' name='favorite_action' value='unset'>
|
||||
<input type='submit' value='Un-Favorite'>
|
||||
</form></p>";
|
||||
}
|
||||
|
||||
$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;
|
||||
}
|
||||
|
||||
public function show_anonymous_html($image) {
|
||||
$i_image_id = int_escape($image->id);
|
||||
$i_favorites = int_escape($image->favorites);
|
||||
|
||||
$html = "
|
||||
Favorites: $i_favorites
|
||||
<br><br>";
|
||||
return $html;
|
||||
}
|
||||
|
||||
public function show_favorite_marks($username_array) {
|
||||
$html = '';
|
||||
|
||||
foreach ($username_array as $row) {
|
||||
$username = $row['name'];
|
||||
$html .= "<a href='".make_link("user/$username")."'>$username</a><br>";
|
||||
}
|
||||
|
||||
if ($html == '') {
|
||||
$html = 'Not favorited yet';
|
||||
}
|
||||
|
||||
return $html;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
Loading…
x
Reference in New Issue
Block a user