diff --git a/include/functions_rate.inc.php b/include/functions_rate.inc.php
index ad3de1b2f..9bf97cbdb 100644
--- a/include/functions_rate.inc.php
+++ b/include/functions_rate.inc.php
@@ -36,14 +36,14 @@ function rate_picture($image_id, $rate)
or !$conf['rate']
or !in_array($rate, $conf['rate_items']))
{
- return;
+ return false;
}
$user_anonymous = is_autorize_status(ACCESS_CLASSIC) ? false : true;
if ($user_anonymous and !$conf['rate_anonymous'])
{
- return;
+ return false;
}
$ip_components = explode('.', $_SERVER["REMOTE_ADDR"]);
@@ -118,17 +118,20 @@ INSERT
// update of images.average_rate field
$query = '
-SELECT ROUND(AVG(rate),2) AS average_rate
+SELECT COUNT(rate) AS count
+ , ROUND(AVG(rate),2) AS average
+ , ROUND(STD(rate),2) AS stdev
FROM '.RATE_TABLE.'
WHERE element_id = '.$image_id.'
;';
- $row = mysql_fetch_array(pwg_query($query));
+ $row = mysql_fetch_assoc(pwg_query($query));
$query = '
UPDATE '.IMAGES_TABLE.'
- SET average_rate = '.$row['average_rate'].'
+ SET average_rate = '.$row['average'].'
WHERE id = '.$image_id.'
;';
pwg_query($query);
+ return $row;
}
?>
\ No newline at end of file
diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php
index f115d7865..f8d242e2c 100644
--- a/include/ws_functions.inc.php
+++ b/include/ws_functions.inc.php
@@ -775,6 +775,41 @@ SELECT id, date, author, content
return new PwgNamedStruct('image',$ret, null, array('name','comment') );
}
+
+/**
+ * rates the image_id in the parameter
+ */
+function ws_images_Rate($params, &$service)
+{
+ $image_id = (int)$params['image_id'];
+ $query = '
+SELECT DISTINCT id FROM '.IMAGES_TABLE.'
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
+ WHERE id='.$image_id
+ .get_sql_condition_FandF(
+ array(
+ 'forbidden_categories' => 'category_id',
+ 'forbidden_images' => 'id',
+ ),
+ ' AND'
+ ).'
+ LIMIT 1';
+ if ( mysql_num_rows( pwg_query($query) )==0 )
+ {
+ return new PwgError(404, "Invalid image_id or access denied" );
+ }
+ $rate = (int)$params['rate'];
+ include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+ $res = rate_picture( $image_id, $rate );
+ if ($res==false)
+ {
+ global $conf;
+ return new PwgError( 403, "Forbidden or rate not in ". implode(',',$conf['rate_items']));
+ }
+ return $res;
+}
+
+
/**
* returns a list of elements corresponding to a query search
*/
diff --git a/template/yoga/picture.tpl b/template/yoga/picture.tpl
index af22ade18..aec446bd6 100644
--- a/template/yoga/picture.tpl
+++ b/template/yoga/picture.tpl
@@ -162,7 +162,6 @@ y.callService(
{
selectElement.disabled = true;
var y = new PwgWS(rootUrl);
-
y.callService(
"pwg.images.setPrivacyLevel", {image_id: id, level:level} ,
{
@@ -182,7 +181,7 @@ y.callService(
{if isset($rate_summary) }
| {'Average rate'|@translate} |
-
+ |
{if $rate_summary.count}
{assign var='rate_text' value='%.2f (rated %d times, standard deviation = %.2f)'|@translate }
{$pwg->sprintf($rate_text, $rate_summary.average, $rate_summary.count, $rate_summary.std) }
@@ -213,7 +212,7 @@ y.callService(
{if isset($rating)}
{/if}
diff --git a/template/yoga/rating.js b/template/yoga/rating.js
index a4f8f86b8..682ab10d0 100644
--- a/template/yoga/rating.js
+++ b/template/yoga/rating.js
@@ -1,90 +1,100 @@
-makeNiceRatingForm();
+var gRatingOptions, gRatingButtons, gUserRating;
-function makeNiceRatingForm()
+function makeNiceRatingForm(options)
{
- var form = document.getElementById('rateForm');
- if (!form) return; //? template changed
- gRatingButtons = form.getElementsByTagName('input');
+ gRatingOptions = options || {};
+ var form = document.getElementById('rateForm');
+ if (!form) return; //? template changed
- gUserRating = "";
- for (var i=0; i0 && rateButton.previousSibling.nodeType == 3 /*TEXT_NODE*/)
- rateButton.parentNode.removeChild(rateButton.previousSibling);
+ if (i!=gRatingButtons.length-1 && rateButton.nextSibling.nodeType == 3 /*TEXT_NODE*/)
+ rateButton.parentNode.removeChild(rateButton.nextSibling);
+ if (i>0 && rateButton.previousSibling.nodeType == 3 /*TEXT_NODE*/)
+ rateButton.parentNode.removeChild(rateButton.previousSibling);
- if(window.addEventListener){ // Mozilla, Netscape, Firefox
- rateButton.addEventListener("click", updateRating, false );
- rateButton.addEventListener("mouseout", resetRatingStarDisplay, false );
- rateButton.addEventListener("mouseover", updateRatingStarDisplayEvt, false );
- }
- else if(window.attachEvent) { // IE
- rateButton.attachEvent("onclick", updateRating);
- rateButton.attachEvent("onmouseout", resetRatingStarDisplay);
- rateButton.attachEvent("onmouseover", updateRatingStarDisplayEvt);
- }
- }
- resetRatingStarDisplay();
+ if(window.addEventListener){ // Mozilla, Netscape, Firefox
+ rateButton.addEventListener("click", updateRating, false );
+ rateButton.addEventListener("mouseout", resetRatingStarDisplay, false );
+ rateButton.addEventListener("mouseover", updateRatingStarDisplayEvt, false );
+ }
+ else if(window.attachEvent) { // IE
+ rateButton.attachEvent("onclick", updateRating);
+ rateButton.attachEvent("onmouseout", resetRatingStarDisplay);
+ rateButton.attachEvent("onmouseover", updateRatingStarDisplayEvt);
+ }
+ }
+ resetRatingStarDisplay();
}
function resetRatingStarDisplay()
{
- updateRatingStarDisplay( gUserRating );
+ updateRatingStarDisplay( gUserRating );
}
function updateRatingStarDisplay(userRating)
{
- for (i=0; i=rateButton.initialRateValue )
- {
- rateButton.className = "rateButtonStarFull";
- }
- else
- {
- rateButton.className = "rateButtonStarEmpty";
- }
- }
+ for (var i=0; i=gRatingButtons[i].initialRateValue ) ? "rateButtonStarFull" : "rateButtonStarEmpty";
}
function updateRatingStarDisplayEvt(e)
{
- if (e.target)
- updateRatingStarDisplay(e.target.initialRateValue);
- else //IE
- updateRatingStarDisplay(e.srcElement.initialRateValue);
+ updateRatingStarDisplay(
+ e.target ? e.target.initialRateValue : e.srcElement.initialRateValue);
}
function updateRating(e)
{
- if (e.target)
- var rateButton = e.target;
- else //IE
- var rateButton = e.srcElement;
- if (rateButton.initialRateValue == gUserRating)
- return false; //nothing to do
- // some ajax here one day would be nice
- rateButton.value = rateButton.initialRateValue; // put back real value
- return true;
+ var rateButton = e.target || e.srcElement;
+ if (rateButton.initialRateValue == gUserRating)
+ return false; //nothing to do
+
+ for (var i=0; iaddMethod('pwg.getVersion', 'ws_getVersion', null,
'retrieves the PWG version');
- $service->addMethod('pwg.caddie.add', 'ws_caddie_add',
+ $service->addMethod('pwg.caddie.add', 'ws_caddie_add',
array(
'image_id'=> array( 'flags'=>WS_PARAM_FORCE_ARRAY ),
),
@@ -94,13 +94,20 @@ function ws_addDefaultMethods( $arr )
array(
'image_id' => array(),
'comments_page' => array('default'=>0 ),
- 'comments_per_page' => array(
- 'default' => $conf['nb_comment_page'],
+ 'comments_per_page' => array(
+ 'default' => $conf['nb_comment_page'],
'maxValue' => 2*$conf['nb_comment_page'],
),
),
'retrieves information about the given photo' );
+ $service->addMethod('pwg.images.rate', 'ws_images_rate',
+ array(
+ 'image_id' => array(),
+ 'rate' => array(),
+ ),
+ 'rate the image' );
+
$service->addMethod('pwg.images.search', 'ws_images_search',
array(
'query'=>array(),
|