aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/functions_rate.inc.php13
-rw-r--r--include/ws_functions.inc.php35
-rw-r--r--template/yoga/picture.tpl10
-rw-r--r--template/yoga/rating.js142
-rw-r--r--ws.php13
5 files changed, 136 insertions, 77 deletions
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) }
<tr>
<td class="label">{'Average rate'|@translate}</td>
- <td class="value">
+ <td class="value" id="ratingSummary">
{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)}
<form action="{$rating.F_ACTION}" method="post" id="rateForm">
<div>
-{if isset($rating.USER_RATE)}{'update_rate'|@translate}{else}{'new_rate'|@translate}{/if}
+<span id="updateRate">{if isset($rating.USER_RATE)}{'update_rate'|@translate}{else}{'new_rate'|@translate}{/if}</span>
:
{foreach from=$rating.marks item=mark name=rate_loop}
{if !$smarty.foreach.rate_loop.first} | {/if}
@@ -224,6 +223,11 @@ y.callService(
{/if}
{/foreach}
<script type="text/javascript" src="{$ROOT_URL}{$themeconf.template_dir}/rating.js"></script>
+<script type="text/javascript">
+makeNiceRatingForm( {ldelim}rootUrl: '{$ROOT_URL|@escape:"javascript"}', image_id: {$current.id},
+updateRateText: "{'update_rate'|@translate|@escape:'javascript'}", updateRateElement: document.getElementById("updateRate"),
+ratingSummaryText: "{'%.2f (rated %d times, standard deviation = %.2f)'|@translate|@escape:'javascript'}", ratingSummaryElement: document.getElementById("ratingSummary") {rdelim} );
+</script>
</div>
</form>
{/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; i<gRatingButtons.length; i++)
- {
- if ( gRatingButtons[i].type=="button" )
- {
- gUserRating = gRatingButtons[i].value;
- break;
- }
- }
+ gRatingButtons = form.getElementsByTagName('input');
+ gUserRating = "";
+ for (var i=0; i<gRatingButtons.length; i++)
+ {
+ if ( gRatingButtons[i].type=="button" )
+ {
+ gUserRating = gRatingButtons[i].value;
+ break;
+ }
+ }
- for (var i=0; i<gRatingButtons.length; i++)
- {
- var rateButton = gRatingButtons[i];
- rateButton.initialRateValue = rateButton.value; // save it as a property
+ for (var i=0; i<gRatingButtons.length; i++)
+ {
+ var rateButton = gRatingButtons[i];
+ rateButton.initialRateValue = rateButton.value; // save it as a property
+ try { rateButton.type = "button"; } catch (e){}// avoid normal submit (use ajax); not working in IE6
- rateButton.value = ""; //hide the text IE/Opera
- with (rateButton.style)
- {
- textIndent = "-50px"; //hide the text FF
- marginLeft = marginRight = 0;
- }
+ if (navigator.userAgent.indexOf('AppleWebKit/') == -1 ) rateButton.value = ""; //hide the text IE/Opera - breaks safari
+ with (rateButton.style)
+ {
+ textIndent = "-50px"; //hide the text FF
+ marginLeft = marginRight = 0;
+ }
- 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 (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<gRatingButtons.length; i++)
- {
- var rateButton = gRatingButtons[i];
- if (userRating!=="" && userRating>=rateButton.initialRateValue )
- {
- rateButton.className = "rateButtonStarFull";
- }
- else
- {
- rateButton.className = "rateButtonStarEmpty";
- }
- }
+ for (var i=0; i<gRatingButtons.length; i++)
+ gRatingButtons[i].className = (userRating!=="" && userRating>=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; i<gRatingButtons.length; i++) gRatingButtons[i].disabled=true;
+ var y = new PwgWS(gRatingOptions.rootUrl);
+ y.callService(
+ "pwg.images.rate", {image_id: gRatingOptions.image_id, rate: rateButton.initialRateValue } ,
+ {
+ onFailure: function(num, text) {
+ alert(num + " " + text);
+ document.location = rateButton.form.action + "&rate="+rateButton.initialRateValue;
+ },
+ onSuccess: function(result) {
+ gUserRating = rateButton.initialRateValue;
+ for (var i=0; i<gRatingButtons.length; i++) gRatingButtons[i].disabled=false;
+ if (gRatingOptions.updateRateElement) gRatingOptions.updateRateElement.innerHTML = gRatingOptions.updateRateText;
+ if (gRatingOptions.ratingSummaryElement)
+ {
+ var t = gRatingOptions.ratingSummaryText;
+ var args =[result.average, result.count, result.stdev], idx = 0, rexp = new RegExp( /%\.?\d*[sdf]/ );
+ _xxx = t.match( rexp );
+ while (idx<args.length) t=t.replace(rexp, args[idx++]);
+ gRatingOptions.ratingSummaryElement.innerHTML = t;
+ }
+ }
+ }
+ );
+ return false;
} \ No newline at end of file
diff --git a/ws.php b/ws.php
index 003e1df54..4c37eeb6d 100644
--- a/ws.php
+++ b/ws.php
@@ -43,7 +43,7 @@ function ws_addDefaultMethods( $arr )
$service->addMethod('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(),