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 isset($rating.USER_RATE)}{'update_rate'|@translate}{else}{'new_rate'|@translate}{/if} +{if isset($rating.USER_RATE)}{'update_rate'|@translate}{else}{'new_rate'|@translate}{/if} : {foreach from=$rating.marks item=mark name=rate_loop} {if !$smarty.foreach.rate_loop.first} | {/if} @@ -224,6 +223,11 @@ y.callService( {/if} {/foreach} +
{/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; i