diff options
Diffstat (limited to 'lib/class/rating.class.php')
-rw-r--r-- | lib/class/rating.class.php | 420 |
1 files changed, 210 insertions, 210 deletions
diff --git a/lib/class/rating.class.php b/lib/class/rating.class.php index 0943de2f..76b8c85e 100644 --- a/lib/class/rating.class.php +++ b/lib/class/rating.class.php @@ -1,5 +1,5 @@ <?php -/* vim:set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab: */ +/* vim:set softtabstop=4 shiftwidth=4 expandtab: */ /** * * LICENSE: GNU General Public License, version 2 (GPLv2) @@ -28,215 +28,215 @@ */ class Rating extends database_object { - // Public variables - public $id; // The ID of the object rated - public $type; // The type of object we want - - /** - * Constructor - * This is run every time a new object is created, and requires - * the id and type of object that we need to pull the rating for - */ - public function __construct($id, $type) { - $id = intval($id); - $type = Dba::escape($type); - - $this->id = $id; - $this->type = $type; - - return true; - - } // Constructor - - /** - * gc - * - * Remove ratings for items that no longer exist. - */ - public static function gc() { - foreach(array('song', 'album', 'artist', 'video') as $object_type) { - Dba::write("DELETE FROM `rating` USING `rating` LEFT JOIN `$object_type` ON `$object_type`.`id` = `rating`.`object_type` WHERE `object_type` = '$object_type` AND `$object_type`.`id` IS NULL"); - } - } - - /** - * build_cache - * This attempts to get everything we'll need for this page load in a - * single query, saving on connection overhead - */ - public static function build_cache($type, $ids) { - - if (!is_array($ids) OR !count($ids)) { return false; } - - $user_id = intval($GLOBALS['user']->id); - $ratings = array(); - $user_ratings = array(); - - $idlist = '(' . implode(',', $ids) . ')'; - $sql = "SELECT `rating`, `object_id` FROM `rating` " . - "WHERE `user`='$user_id' AND `object_id` IN $idlist " . - "AND `object_type`='$type'"; - $db_results = Dba::read($sql); - - while ($row = Dba::fetch_assoc($db_results)) { - $user_ratings[$row['object_id']] = $row['rating']; - } - - $sql = "SELECT AVG(`rating`) as `rating`, `object_id` FROM " . - "`rating` WHERE `object_id` IN $idlist AND " . - "`object_type`='$type' GROUP BY `object_id`"; - $db_results = Dba::read($sql); - - while ($row = Dba::fetch_assoc($db_results)) { - $ratings[$row['object_id']] = $row['rating']; - } - - foreach ($ids as $id) { - // First store the user-specific rating - if (!isset($user_ratings[$id])) { - $rating = 0; - } - else { - $rating = intval($user_ratings[$id]); - } - parent::add_to_cache('rating_' . $type . '_user' . $user_id, $id, $rating); - - // Then store the average - if (!isset($ratings[$id])) { - $rating = 0; - } - else { - $rating = round($ratings[$id]['rating'], 1); - } - parent::add_to_cache('rating_' . $type . '_all', $id, $rating); - } - - return true; - - } // build_cache - - /** - * get_user_rating - * Get a user's rating. If no userid is passed in, we use the currently - * logged in user. - */ - public function get_user_rating($user_id = null) { - - $id = intval($this->id); - $type = Dba::escape($this->type); - if (is_null($user_id)) { - $user_id = $GLOBALS['user']->id; - } - $user_id = intval($user_id); - - $key = 'rating_' . $type . '_user' . $user_id; - if (parent::is_cached($key, $id)) { - return parent::get_from_cache($key, $id); - } - - $sql = "SELECT `rating` FROM `rating` WHERE `user`='$user_id' ". - "AND `object_id`='$id' AND `object_type`='$type'"; - $db_results = Dba::read($sql); - - $rating = 0; - - if ($results = Dba::fetch_assoc($db_results)) { - $rating = $results['rating']; - } - - parent::add_to_cache($key, $id, $rating); - return $rating; - - } // get_user_rating - - /** - * get_average_rating - * Get the floored average rating of what everyone has rated this object - * as. This is shown if there is no personal rating. - */ - public function get_average_rating() { - - $id = intval($this->id); - $type = Dba::escape($this->type); - - if (parent::is_cached('rating_' . $type . '_all', $id)) { - return parent::get_from_cache('rating_' . $type . '_user', $id); - } - - $sql = "SELECT AVG(`rating`) as `rating` FROM `rating` WHERE " . - "`object_id`='$id' AND `object_type`='$type'"; - $db_results = Dba::read($sql); - - $results = Dba::fetch_assoc($db_results); - - parent::add_to_cache('rating_' . $type . '_all', $id, $results['rating']); - return $results['rating']; - - } // get_average_rating - - /** - * set_rating - * This function sets the rating for the current object. - * If no userid is passed in, we use the currently logged in user. - */ - public function set_rating($rating, $user_id = null) { - $id = intval($this->id); - $type = Dba::escape($this->type); - $rating = intval($rating); - if (is_null($user_id)) { - $user_id = $GLOBALS['user']->id; - } - $user_id = intval($user_id); - - debug_event('Rating', "Setting rating for $type $id to $rating", 5); - - // If score is -1, then remove rating - if ($rating == '-1') { - $sql = "DELETE FROM `rating` WHERE " . - "`object_id`='$this->id' AND " . - "`object_type`='$this->type' AND " . - "`user`='$user_id'"; - } - else { - $sql = "REPLACE INTO `rating` " . - "(`object_id`, `object_type`, `rating`, `user`) " . - "VALUES ('$id', '$type', '$rating', '$user_id')"; - } - $db_results = Dba::write($sql); - - parent::add_to_cache('rating_' . $type . '_user' . $user_id, $id, $rating); - - foreach (Plugin::get_plugins('save_rating') as $plugin_name) { - $plugin = new Plugin($plugin_name); - if ($plugin->load()) { - $plugin->_plugin->save_rating($this, $rating); - } - } - - return true; - - } // set_rating - - /** - * show - * This takes an id and a type and displays the rating if ratings are - * enabled. If $static is true, the rating won't be editable. - */ - public static function show($object_id, $type, $static=false) { - - // If ratings aren't enabled don't do anything - if (!Config::get('ratings')) { return false; } - - $rating = new Rating($object_id, $type); - - if ($static) { - require Config::get('prefix') . '/templates/show_static_object_rating.inc.php'; - } - else { - require Config::get('prefix') . '/templates/show_object_rating.inc.php'; - } - - } // show + // Public variables + public $id; // The ID of the object rated + public $type; // The type of object we want + + /** + * Constructor + * This is run every time a new object is created, and requires + * the id and type of object that we need to pull the rating for + */ + public function __construct($id, $type) { + $id = intval($id); + $type = Dba::escape($type); + + $this->id = $id; + $this->type = $type; + + return true; + + } // Constructor + + /** + * gc + * + * Remove ratings for items that no longer exist. + */ + public static function gc() { + foreach(array('song', 'album', 'artist', 'video') as $object_type) { + Dba::write("DELETE FROM `rating` USING `rating` LEFT JOIN `$object_type` ON `$object_type`.`id` = `rating`.`object_type` WHERE `object_type` = '$object_type` AND `$object_type`.`id` IS NULL"); + } + } + + /** + * build_cache + * This attempts to get everything we'll need for this page load in a + * single query, saving on connection overhead + */ + public static function build_cache($type, $ids) { + + if (!is_array($ids) OR !count($ids)) { return false; } + + $user_id = intval($GLOBALS['user']->id); + $ratings = array(); + $user_ratings = array(); + + $idlist = '(' . implode(',', $ids) . ')'; + $sql = "SELECT `rating`, `object_id` FROM `rating` " . + "WHERE `user`='$user_id' AND `object_id` IN $idlist " . + "AND `object_type`='$type'"; + $db_results = Dba::read($sql); + + while ($row = Dba::fetch_assoc($db_results)) { + $user_ratings[$row['object_id']] = $row['rating']; + } + + $sql = "SELECT AVG(`rating`) as `rating`, `object_id` FROM " . + "`rating` WHERE `object_id` IN $idlist AND " . + "`object_type`='$type' GROUP BY `object_id`"; + $db_results = Dba::read($sql); + + while ($row = Dba::fetch_assoc($db_results)) { + $ratings[$row['object_id']] = $row['rating']; + } + + foreach ($ids as $id) { + // First store the user-specific rating + if (!isset($user_ratings[$id])) { + $rating = 0; + } + else { + $rating = intval($user_ratings[$id]); + } + parent::add_to_cache('rating_' . $type . '_user' . $user_id, $id, $rating); + + // Then store the average + if (!isset($ratings[$id])) { + $rating = 0; + } + else { + $rating = round($ratings[$id]['rating'], 1); + } + parent::add_to_cache('rating_' . $type . '_all', $id, $rating); + } + + return true; + + } // build_cache + + /** + * get_user_rating + * Get a user's rating. If no userid is passed in, we use the currently + * logged in user. + */ + public function get_user_rating($user_id = null) { + + $id = intval($this->id); + $type = Dba::escape($this->type); + if (is_null($user_id)) { + $user_id = $GLOBALS['user']->id; + } + $user_id = intval($user_id); + + $key = 'rating_' . $type . '_user' . $user_id; + if (parent::is_cached($key, $id)) { + return parent::get_from_cache($key, $id); + } + + $sql = "SELECT `rating` FROM `rating` WHERE `user`='$user_id' ". + "AND `object_id`='$id' AND `object_type`='$type'"; + $db_results = Dba::read($sql); + + $rating = 0; + + if ($results = Dba::fetch_assoc($db_results)) { + $rating = $results['rating']; + } + + parent::add_to_cache($key, $id, $rating); + return $rating; + + } // get_user_rating + + /** + * get_average_rating + * Get the floored average rating of what everyone has rated this object + * as. This is shown if there is no personal rating. + */ + public function get_average_rating() { + + $id = intval($this->id); + $type = Dba::escape($this->type); + + if (parent::is_cached('rating_' . $type . '_all', $id)) { + return parent::get_from_cache('rating_' . $type . '_user', $id); + } + + $sql = "SELECT AVG(`rating`) as `rating` FROM `rating` WHERE " . + "`object_id`='$id' AND `object_type`='$type'"; + $db_results = Dba::read($sql); + + $results = Dba::fetch_assoc($db_results); + + parent::add_to_cache('rating_' . $type . '_all', $id, $results['rating']); + return $results['rating']; + + } // get_average_rating + + /** + * set_rating + * This function sets the rating for the current object. + * If no userid is passed in, we use the currently logged in user. + */ + public function set_rating($rating, $user_id = null) { + $id = intval($this->id); + $type = Dba::escape($this->type); + $rating = intval($rating); + if (is_null($user_id)) { + $user_id = $GLOBALS['user']->id; + } + $user_id = intval($user_id); + + debug_event('Rating', "Setting rating for $type $id to $rating", 5); + + // If score is -1, then remove rating + if ($rating == '-1') { + $sql = "DELETE FROM `rating` WHERE " . + "`object_id`='$this->id' AND " . + "`object_type`='$this->type' AND " . + "`user`='$user_id'"; + } + else { + $sql = "REPLACE INTO `rating` " . + "(`object_id`, `object_type`, `rating`, `user`) " . + "VALUES ('$id', '$type', '$rating', '$user_id')"; + } + $db_results = Dba::write($sql); + + parent::add_to_cache('rating_' . $type . '_user' . $user_id, $id, $rating); + + foreach (Plugin::get_plugins('save_rating') as $plugin_name) { + $plugin = new Plugin($plugin_name); + if ($plugin->load()) { + $plugin->_plugin->save_rating($this, $rating); + } + } + + return true; + + } // set_rating + + /** + * show + * This takes an id and a type and displays the rating if ratings are + * enabled. If $static is true, the rating won't be editable. + */ + public static function show($object_id, $type, $static=false) { + + // If ratings aren't enabled don't do anything + if (!Config::get('ratings')) { return false; } + + $rating = new Rating($object_id, $type); + + if ($static) { + require Config::get('prefix') . '/templates/show_static_object_rating.inc.php'; + } + else { + require Config::get('prefix') . '/templates/show_object_rating.inc.php'; + } + + } // show } //end rating class ?> |