add rating feature

git-svn-id: http://piwigo.org/svn/trunk@507 68402e56-0260-453c-a942-63ccdbb3a9ee
This commit is contained in:
z0rglub 2004-08-30 22:00:46 +00:00
parent 0c482df04e
commit 0e2436f50a
11 changed files with 276 additions and 64 deletions

View file

@ -125,7 +125,7 @@ $template->assign_vars(array(
'NB_PICTURE' => count_user_total_images(),
'TITLE' => $template_title,
'USERNAME' => $user['username'],
'TOP_VISITED'=>$conf['top_number'],
'TOP_NUMBER'=>$conf['top_number'],
'MENU_CATEGORIES_CONTENT'=>$page['menu'],
'L_CATEGORIES' => $lang['categories'],
@ -138,6 +138,8 @@ $template->assign_vars(array(
'L_SPECIAL_CATEGORIES' => $lang['special_categories'],
'L_MOST_VISITED_HINT' => $lang['most_visited_cat_hint'],
'L_MOST_VISITED' => $lang['most_visited_cat'],
'L_BEST_RATED_HINT' => $lang['best_rated_cat_hint'],
'L_BEST_RATED' => $lang['best_rated_cat'],
'L_RECENT_PICS_HINT' => $lang['recent_pics_cat_hint'],
'L_RECENT_PICS' => $lang['recent_pics_cat'],
'L_RECENT_CATS_HINT' => $lang['recent_cats_cat_hint'],
@ -166,6 +168,7 @@ $template->assign_vars(array(
'U_HOME' => add_session_id( PHPWG_ROOT_PATH.'category.php' ),
'U_FAVORITE' => add_session_id( PHPWG_ROOT_PATH.'category.php?cat=fav' ),
'U_MOST_VISITED'=>add_session_id( PHPWG_ROOT_PATH.'category.php?cat=most_visited' ),
'U_BEST_RATED'=>add_session_id(PHPWG_ROOT_PATH.'category.php?cat=best_rated'),
'U_RECENT_PICS'=>add_session_id( PHPWG_ROOT_PATH.'category.php?cat=recent_pics' ),
'U_RECENT_CATS'=>add_session_id( PHPWG_ROOT_PATH.'category.php?cat=recent_cats' ),
'U_CALENDAR'=>add_session_id( PHPWG_ROOT_PATH.'category.php?cat=calendar' ),
@ -228,7 +231,8 @@ if (isset($page['cat'])
and ((is_numeric($page['cat']) and $page['cat_nb_images'] != 0)
or $page['cat'] == 'search'
or $page['cat'] == 'most_visited'
or $page['cat'] == 'recent_pics'))
or $page['cat'] == 'recent_pics'
or $page['cat'] == 'best_rated'))
{
include(PHPWG_ROOT_PATH.'include/category_default.inc.php');
}

View file

@ -54,7 +54,7 @@ $conf['file_ext'] = array('jpg','JPG','png','PNG','gif','GIF'
,'mpg','zip','avi','mp3','ogg');
// $conf['picture_ext'] must bea subset of $conf['file_ext']
$conf['picture_ext'] = array('jpg','JPG','png','PNG','gif','GIF');
$conf['top_number'] = 10;
$conf['top_number'] = 10; // used for "best rated" and "most visited"
$conf['anti-flood_time'] = 60; // seconds between 2 comments : 0 to disable
$conf['max_LOV_categories'] = 50;
@ -90,4 +90,5 @@ $conf['show_exif_fields'] = array('Make',
// $conf['show_exif_fields'] = array('CameraMake','CameraModel','DateTime');
$conf['calendar_datefield'] = 'date_creation';
$conf['rate'] = true;
?>

View file

@ -58,4 +58,5 @@ define('USER_GROUP_TABLE', $table_prefix.'user_group');
define('USERS_TABLE', $table_prefix.'users');
define('WAITING_TABLE', $table_prefix.'waiting');
define('IMAGE_METADATA_TABLE', $table_prefix.'image_metadata');
define('RATE_TABLE', $table_prefix.'rate');
?>

View file

@ -505,4 +505,38 @@ function redirect( $url )
exit();
}
/**
* returns $_SERVER['QUERY_STRING'] whitout keys given in parameters
*
* @param array $rejects
* @returns string
*/
function get_query_string_diff($rejects = array())
{
$query_string = '';
$str = $_SERVER['QUERY_STRING'];
parse_str($str, $vars);
$is_first = true;
foreach ($vars as $key => $value)
{
if (!in_array($key, $rejects))
{
if ($is_first)
{
$query_string.= '?';
$is_first = false;
}
else
{
$query_string.= '&';
}
$query_string.= $key.'='.$value;
}
}
return $query_string;
}
?>

View file

@ -724,6 +724,44 @@ SELECT COUNT(DISTINCT(id)) AS nb_total_images
$page['where'].= ' AND '.$forbidden;
}
}
else if ($page['cat'] == 'best_rated')
{
$page['title'] = $conf['top_number'].' '.$lang['best_rated_cat'];
$page['where'] = ' WHERE average_rate IS NOT NULL';
if (isset($forbidden))
{
$page['where'] = ' AND '.$forbidden;
}
$conf['order_by'] = ' ORDER BY average_rate DESC, id ASC';
// $page['cat_nb_images'] equals $conf['top_number'] unless there
// are less rated items
$query ='
SELECT COUNT(1) AS count
FROM '.IMAGES_TABLE.'
'.$page['where'].'
;';
$row = mysql_fetch_array(mysql_query($query));
if ($row['count'] < $conf['top_number'])
{
$page['cat_nb_images'] = $row['count'];
}
else
{
$page['cat_nb_images'] = $conf['top_number'];
}
unset($query);
if (isset($page['start'])
and ($page['start']+$user['nb_image_page']>=$conf['top_number']))
{
$page['nb_image_page'] = $conf['top_number'] - $page['start'];
}
}
if (isset($query))
{

View file

@ -8,6 +8,7 @@ table:groups
table:history
table:image_category
table:images
table:rate
table:sessions
table:sites
table:user_access
@ -68,6 +69,10 @@ column:keywords table:images type:varchar
column:storage_category_id table:images type:smallint nullable:N length:5 signed:N
column:representative_ext table:images type:varchar nullable:N length:4 binary:N
column:date_metadata_update table:images type:date nullable:N
column:average_rate table:images type:float nullable:N length:5,2 signed:N
column:user_id table:rate type:smallint nullable:Y length:5 signed:N
column:element_id table:rate type:mediumint nullable:Y length:8 signed:N
column:rate table:rate type:tinyint nullable:Y length:2 signed:N
column:id table:sessions type:varchar nullable:Y length:255 binary:Y
column:user_id table:sessions type:smallint nullable:Y length:5 signed:N
column:expiration table:sessions type:int nullable:Y length:10 signed:N
@ -114,6 +119,8 @@ PK:groups_pk table:groups column:id
PK:image_category_pk table:image_category column:image_id
PK:image_category_pk table:image_category column:category_id
PK:images_pk table:images column:id
PK:rate_pk table:rate column:user_id
PK:rate_pk table:rate column:element_id
PK:sessions_pk table:sessions column:id
PK:sites_pk table:sites column:id
PK:user_access_pk table:user_access column:user_id

View file

@ -137,11 +137,24 @@ CREATE TABLE phpwebgallery_images (
storage_category_id smallint(5) unsigned default NULL,
representative_ext varchar(4) default NULL,
date_metadata_update date default NULL,
average_rate float(5,2) unsigned default NULL,
PRIMARY KEY (id),
KEY images_i2 (date_available),
KEY images_i1 (storage_category_id)
) TYPE=MyISAM;
--
-- Table structure for table 'phpwebgallery_rate'
--
DROP TABLE IF EXISTS phpwebgallery_rate;
CREATE TABLE phpwebgallery_rate (
user_id smallint(5) unsigned NOT NULL default '0',
element_id mediumint(8) unsigned NOT NULL default '0',
rate tinyint(2) unsigned NOT NULL default '0',
PRIMARY KEY (user_id,element_id)
) TYPE=MyISAM;
--
-- Table structure for table 'phpwebgallery_sessions'
--

View file

@ -231,8 +231,8 @@ $lang['category_representative'] = 'representative';
$lang['special_categories'] = 'specials';
$lang['most_visited_cat_hint'] = 'displays most visited pictures';
$lang['most_visited_cat'] = 'most visited';
$lang['best_rated_cat_hint'] = 'displays pictures best rated';
$lang['best_rated_cat'] = 'best rated';
$lang['best_rated_cat_hint'] = 'displays best rated items';
$lang['recent_pics_cat_hint'] = 'Displays most recent pictures';
$lang['recent_pics_cat'] = 'Last pictures';
$lang['recent_cats_cat_hint'] = 'Displays recently updated categories';
@ -279,4 +279,12 @@ $lang['hello'] = 'Hello';
$lang['picture_show_metadata'] = 'Show file metadata ?';
$lang['picture_hide_metadata'] = 'Hide file metadata';
$lang['to_rate'] = 'Rate';
$lang['update_rate'] = 'Update your rating';
$lang['element_rate'] = 'rate';
$lang['already_rated'] = 'You\'ve already rated this item';
$lang['never_rated'] = 'You\'ve never rated this item';
$lang['no_rate'] = 'no rate';
$lang['rates'] = 'rates';
$lang['standard_deviation'] = 'STD';
?>

View file

@ -25,7 +25,8 @@
// | USA. |
// +-----------------------------------------------------------------------+
//----------------------------------------------------------- include
$rate_items = array(0,1,2,3,4,5);
//--------------------------------------------------------------------- include
define('PHPWG_ROOT_PATH','./');
include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
//-------------------------------------------------- access authorization check
@ -191,16 +192,9 @@ foreach (array('prev', 'current', 'next') as $i)
$picture[$i]['name'] = str_replace('_', ' ', $file_wo_ext);
}
$picture[$i]['url'] = PHPWG_ROOT_PATH.'picture.php?image_id='.$row['id'];
$picture[$i]['url'].= '&amp;cat='.$page['cat'];
if ( $page['cat'] == 'search' )
{
$picture[$i]['url'].= '&amp;search='.$_GET['search'];
}
if (isset($_GET['show_metadata']))
{
$picture[$i]['url'].= '&amp;show_metadata=1';
}
$picture[$i]['url'] = PHPWG_ROOT_PATH.'picture.php';
$picture[$i]['url'].= get_query_string_diff(array('image_id','add_fav'));
$picture[$i]['url'].= '&amp;image_id='.$row['id'];
}
$url_home = PHPWG_ROOT_PATH.'category.php?cat='.$page['cat'].'&amp;';
@ -213,7 +207,41 @@ if ( $page['cat'] == 'search' )
$url_admin = PHPWG_ROOT_PATH.'admin.php?page=picture_modify';
$url_admin.= '&amp;cat_id='.$page['cat'];
$url_admin.= '&amp;image_id='.$_GET['image_id'];
//----------------------------------------------------------- rate registration
if (isset($_GET['rate'])
and $conf['rate']
and !$user['is_the_guest']
and in_array($_GET['rate'], $rate_items))
{
$query = '
DELETE
FROM '.RATE_TABLE.'
WHERE user_id = '.$user['id'].'
AND element_id = '.$_GET['image_id'].'
;';
mysql_query($query);
$query = '
INSERT INTO '.RATE_TABLE.'
(user_id,element_id,rate)
VALUES
('.$user['id'].','.$_GET['image_id'].','.$_GET['rate'].')
;';
mysql_query($query);
// update of images.average_rate field
$query = '
SELECT ROUND(AVG(rate),2) AS average_rate
FROM '.RATE_TABLE.'
WHERE element_id = '.$_GET['image_id'].'
;';
$row = mysql_fetch_array(mysql_query($query));
$query = '
UPDATE '.IMAGES_TABLE.'
SET average_rate = '.$row['average_rate'].'
WHERE id = '.$_GET['image_id'].'
;';
mysql_query($query);
}
//--------------------------------------------------------- favorite management
if ( isset( $_GET['add_fav'] ) )
{
@ -536,7 +564,7 @@ $template->assign_block_vars('info_line', array(
// filesize
if (empty($picture['current']['filesize']))
{
if (!$picture[$i]['is_picture'])
if (!$picture['current']['is_picture'])
{
$filesize = floor(filesize($picture['current']['download'])/1024);
}
@ -572,10 +600,43 @@ if ( !empty($picture['current']['keywords']))
));
}
// number of visits
$template->assign_block_vars('info_line', array(
$template->assign_block_vars(
'info_line',
array(
'INFO'=>$lang['visited'],
'VALUE'=>$picture['current']['hit'].' '.$lang['times']
));
// rate results
if ($conf['rate'])
{
$query = '
SELECT COUNT(rate) AS count
, ROUND(AVG(rate),2) AS average
, ROUND(STD(rate),2) AS STD
FROM '.RATE_TABLE.'
WHERE element_id = '.$picture['current']['id'].'
;';
$row = mysql_fetch_array(mysql_query($query));
if ($row['count'] == 0)
{
$value = $lang['no_rate'];
}
else
{
$value = $row['average'];
$value.= ' (';
$value.= $row['count'].' '.$lang['rates'];
$value.= ', '.$lang['standard_deviation'].' : '.$row['STD'];
$value.= ')';
}
$template->assign_block_vars(
'info_line',
array(
'INFO' => $lang['element_rate'],
'VALUE' => $value
));
}
//-------------------------------------------------------------------- metadata
if ($conf['show_exif'] or $conf['show_iptc'])
{
@ -596,26 +657,7 @@ if ($metadata_showable and !isset($_GET['show_metadata']))
if ($metadata_showable and isset($_GET['show_metadata']))
{
$url = PHPWG_ROOT_PATH.'picture.php';
$str = $_SERVER['QUERY_STRING'];
parse_str($str, $get_vars);
$is_first = true;
foreach ($get_vars as $key => $value)
{
if ($key != 'show_metadata')
{
if ($is_first)
{
$url.= '?';
$is_first = false;
}
else
{
$url.= '&amp;';
}
$url.= $key.'='.$value;
}
}
$url.= get_query_string_diff(array('show_metadata','add_fav'));
$template->assign_block_vars('hide_metadata', array('URL' => $url));
@ -708,6 +750,57 @@ if ($metadata_showable and isset($_GET['show_metadata']))
}
}
}
//------------------------------------------------------------------- rate form
if ($conf['rate'])
{
$query = '
SELECT rate
FROM '.RATE_TABLE.'
WHERE user_id = '.$user['id'].'
AND element_id = '.$_GET['image_id'].'
;';
$result = mysql_query($query);
if (mysql_num_rows($result) > 0)
{
$row = mysql_fetch_array($result);
$sentence = $lang['already_rated'];
$sentence.= ' ('.$row['rate'].'). ';
$sentence.= $lang['update_rate'];
}
else
{
$sentence = $lang['never_rated'].'. '.$lang['to_rate'];
}
$template->assign_block_vars(
'rate',
array('SENTENCE' => $sentence)
);
foreach ($rate_items as $num => $mark)
{
if ($num > 0)
{
$separator = '|';
}
else
{
$separator = '';
}
$url = PHPWG_ROOT_PATH.'picture.php';
$url.= get_query_string_diff(array('rate','add_fav'));
$url.= '&amp;rate='.$mark;
$template->assign_block_vars(
'rate.rate_option',
array(
'OPTION' => $mark,
'URL' => $url,
'SEPARATOR' => $separator
));
}
}
//------------------------------------------------------- favorite manipulation
if ( !$user['is_the_guest'] )
{
@ -719,29 +812,33 @@ if ( !$user['is_the_guest'] )
$row = mysql_fetch_array( $result );
if (!$row['nb_fav'])
{
$url = PHPWG_ROOT_PATH.'picture.php?cat='.$page['cat'].'&amp;image_id='.$_GET['image_id'];
$url.='&amp;add_fav=1';
if ( $page['cat'] == 'search' )
{
$url.= '&amp;search='.$_GET['search'];
}
$template->assign_block_vars('favorite', array(
'FAVORITE_IMG' => PHPWG_ROOT_PATH.'template/'.$user['template'].'/theme/favorite.gif',
'FAVORITE_HINT' =>$lang['add_favorites_hint'],
'FAVORITE_ALT' =>'[ '.$lang['add_favorites_alt'].' ]',
'U_FAVORITE'=> add_session_id( $url )
));
$url = PHPWG_ROOT_PATH.'picture.php';
$url.= get_query_string_diff(array('rate','add_fav'));
$url.= '&amp;add_fav=1';
$template->assign_block_vars(
'favorite',
array(
'FAVORITE_IMG' => PHPWG_ROOT_PATH.'template/'.$user['template'].'/theme/favorite.gif',
'FAVORITE_HINT' =>$lang['add_favorites_hint'],
'FAVORITE_ALT' =>'[ '.$lang['add_favorites_alt'].' ]',
'U_FAVORITE' => $url
));
}
else
{
$url = PHPWG_ROOT_PATH.'picture.php?cat='.$page['cat'].'&amp;image_id='.$_GET['image_id'];
$url = PHPWG_ROOT_PATH.'picture.php';
$url.= get_query_string_diff(array('rate','add_fav'));
$url.= '&amp;add_fav=0';
$template->assign_block_vars('favorite', array(
'FAVORITE_IMG' => PHPWG_ROOT_PATH.'template/'.$user['template'].'/theme/del_favorite.gif',
'FAVORITE_HINT' =>$lang['del_favorites_hint'],
'FAVORITE_ALT' =>'[ '.$lang['del_favorites_alt'].' ]',
'U_FAVORITE'=> add_session_id( $url )
));
$template->assign_block_vars(
'favorite',
array(
'FAVORITE_IMG' => PHPWG_ROOT_PATH.'template/'.$user['template'].'/theme/del_favorite.gif',
'FAVORITE_HINT' =>$lang['del_favorites_hint'],
'FAVORITE_ALT' =>'[ '.$lang['del_favorites_alt'].' ]',
'U_FAVORITE'=> $url
));
}
}
//------------------------------------ admin link for information modifications
@ -761,12 +858,10 @@ if ( $conf['show_comments'] )
$row = mysql_fetch_array( mysql_query( $query ) );
// navigation bar creation
$url = PHPWG_ROOT_PATH.'picture.php?cat='.$page['cat'].'&amp;image_id='.$_GET['image_id'];
if ( $page['cat'] == 'search' )
{
$url.= '&amp;search='.$_GET['search'];
}
if( !isset( $_GET['start'] )
$url = PHPWG_ROOT_PATH.'picture.php';
$url.= get_query_string_diff(array('rate','add_fav'));
if (!isset( $_GET['start'] )
or !is_numeric( $_GET['start'] )
or ( is_numeric( $_GET['start'] ) and $_GET['start'] < 0 ) )
{

View file

@ -18,7 +18,8 @@
<!-- END favorites -->
<li><span style="font-weight:bold;">{L_SPECIAL_CATEGORIES}</span></li>
<ul class="menu">
<li><a href="{U_MOST_VISITED}"><span title="{L_MOST_VISITED_HINT}">{TOP_VISITED}&nbsp;{L_MOST_VISITED}</span></a></li>
<li><a href="{U_MOST_VISITED}"><span title="{L_MOST_VISITED_HINT}">{TOP_NUMBER}&nbsp;{L_MOST_VISITED}</span></a></li>
<li><a href="{U_BEST_RATED}"><span title="{L_BEST_RATED_HINT}">{TOP_NUMBER}&nbsp;{L_BEST_RATED}</span></a></li>
<li><a href="{U_RECENT_PICS}"><span title="{L_RECENT_PICS_HINT}">{L_RECENT_PICS}</span></a> {T_SHORT}</li>
<li><a href="{U_RECENT_CATS}"><span title="{L_RECENT_CATS_HINT}">{L_RECENT_CATS}</span></a></li>
<li><a href="{U_CALENDAR}"><span title="{L_CALENDAR_HINT}">{L_CALENDAR}</span></a></li>

View file

@ -93,6 +93,16 @@
<!-- END line -->
</table>
<!-- END metadata -->
<!-- BEGIN rate -->
<div>
{rate.SENTENCE} :
<!-- BEGIN rate_option -->
{rate.rate_option.SEPARATOR} <a href="{rate.rate_option.URL}">{rate.rate_option.OPTION}</a>
<!-- END rate_option -->
</div>
<!-- END rate -->
<!-- BEGIN modification -->
<div class="menu" style="text-align:center;margin:5px;">
[ <a href="{U_ADMIN}">{L_ADMIN}</a> ]