Голосование за страницы
Есть в продукте версии 2.9
В системном файле модуля "Опросы": classes/modules/vote/__rate.php, присутсвуют методы для подключения голосования за страницы, при использовании технологии ajax и xslt-шаблонов. Используются методы:
- json_rate
- getElementRating
В данной статье будет описан механизм подключения голосования за страницы, при использовании TPL-шаблонов.
В файл classes/modules/vote/__сustom.php, добавим два метода, rate_do будет отвечать за сохранение данных, gettRating - за вывод результатов голосования:
public function rate_do($template = "default") {
$ini = cmsController::getInstance()->getModule('vote');
if(!$template) $template = "default";
$block_arr = array();
$element_id = (int) getRequest('param0');
$element = umiHierarchy::getInstance()->getElement($element_id);
if(regedit::getInstance()->getVal("//modules/vote/is_graded")) {
$bid = (int) getRequest('param1');
if($bid > 5) $bid = 5;
if($bid < 0) $bid = 0;
} else {
$bid = ((bool) getRequest('param1')) ? 1 : -1;
}
xslTemplater::getInstance()->setIsInited(false);
list($template_ok, $template_not_found, $template_rated, $template_permitted) = def_module::loadTemplates("tpls/vote/rate/{$template}.tpl", "rate_ok", "rate_not_found", "rate_rated", "rate_permitted");
$block_arr = Array();
$block_arr['request_id'] = getRequest('requestId');
if($element) {
$block_arr['element_id'] = $element_id;
if($ini->getIsRated($element_id)) {
$rate_voters = $element->getValue("rate_voters");
$rate_sum = $element->getValue("rate_sum");
$res = $template_rated;
} else {
$rate_voters = (int) $element->getValue("rate_voters");
$rate_sum = (int) $element->getValue("rate_sum") + (int) $bid;
$element->setValue("rate_voters", ++$rate_voters);
$element->setValue("rate_sum", $rate_sum);
$element->setValue("rate", round($rate_sum / $rate_voters, 2));
$element->commit();
umiHierarchy::getInstance()->unloadElement($element_id);
$res = $template_ok;
$ini->setIsRated($element_id);
}
$block_arr['current_rating'] = $rate_sum / $rate_voters;
} else {
$res = $template_not_found;
}
$res = def_module::parseTemplate($res, $block_arr, $element_id);
$referer_url = getServer('HTTP_REFERER');
def_module::redirect($referer_url);
}
public function getRating($element_id, $template = 'default') {
$ini = cmsController::getInstance()->getModule('vote');
$element = umiHierarchy::getInstance()->getElement($element_id);
if (!$element) return '';
list($template_block, $template_block_is_rated) = def_module::loadTemplates("tpls/vote/rate/{$template}.tpl", "rate_block", "is_rated");
$block_arr = array();
$block_arr['rate_sum'] = (int) $element->getValue("rate_sum");
$block_arr['rate_voters'] = (int) $element->getValue("rate_voters");
$block_arr['is_rated'] = $ini->getIsRated($element_id);
if ($block_arr['rate_voters'] > 0) {
$block_arr['rate'] = round($block_arr['rate_sum'] / $block_arr['rate_voters'], 2);
$block_arr['ceil_rate'] = round($block_arr['rate']);
}
$template = ($block_arr['is_rated']) ? $template_block_is_rated : $template_block;
return def_module::parseTemplate($template, $block_arr, $element_id);
}
Также, в папке classes/modules/vote/ необходимо добавить файл permissions.custom.php с таким содержанием:
<?php
$permissions = Array('post' => Array('rate_do', 'getRating'));
?>
В шаблон: tpls/vote/rate/default.tpl
добавим следующие блоки:
$FORMS['rate_block'] = <<<END Оцените фотографию: <a title="Голосовать" href="/vote/rate_do/%id%/5/" >Голосовать</a> <br/ >Рейтинг фотографии: %rate_sum% баллов END; $FORMS['is_rated'] = <<<END Рейтинг фотографии: %rate_sum% баллов END;
Для добавления к какой-либо страницы возможность проголосовать за нее, необходимо в шаблоне прописать макрос:
%vote getRating(%id%)%
где %id% - id страницы.