Голосование за страницы — различия между версиями
VITL' (обсуждение | вклад) (Новая страница: «В системном файле модуля "Опросы": '''classes/modules/vote/__rate.php''', присутсвуют методы для подключени…») |
Whoa (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
+ | '''Есть в продукте версии 2.9''' | ||
+ | |||
В системном файле модуля "Опросы": | В системном файле модуля "Опросы": | ||
'''classes/modules/vote/__rate.php''', присутсвуют методы для подключения голосования за страницы, при использовании технологии ajax и xslt-шаблонов. Используются методы: | '''classes/modules/vote/__rate.php''', присутсвуют методы для подключения голосования за страницы, при использовании технологии ajax и xslt-шаблонов. Используются методы: | ||
Строка 6: | Строка 8: | ||
В данной статье будет описан механизм подключения голосования за страницы, при использовании TPL-шаблонов. | В данной статье будет описан механизм подключения голосования за страницы, при использовании TPL-шаблонов. | ||
− | В файл '''classes/modules/vote/ | + | В файл '''classes/modules/vote/__сustom.php''', добавим два метода, '''rate_do''' будет отвечать за сохранение данных, '''gettRating''' - за вывод результатов голосования: |
<source lang="php"> | <source lang="php"> | ||
public function rate_do($template = "default") { | public function rate_do($template = "default") { | ||
+ | $ini = cmsController::getInstance()->getModule('vote'); | ||
if(!$template) $template = "default"; | if(!$template) $template = "default"; | ||
Строка 33: | Строка 36: | ||
if($element) { | if($element) { | ||
$block_arr['element_id'] = $element_id; | $block_arr['element_id'] = $element_id; | ||
− | if( | + | if($ini->getIsRated($element_id)) { |
$rate_voters = $element->getValue("rate_voters"); | $rate_voters = $element->getValue("rate_voters"); | ||
$rate_sum = $element->getValue("rate_sum"); | $rate_sum = $element->getValue("rate_sum"); | ||
Строка 52: | Строка 55: | ||
$res = $template_ok; | $res = $template_ok; | ||
− | + | $ini->setIsRated($element_id); | |
} | } | ||
Строка 64: | Строка 67: | ||
$referer_url = getServer('HTTP_REFERER'); | $referer_url = getServer('HTTP_REFERER'); | ||
+ | def_module::redirect($referer_url); | ||
} | } | ||
Строка 71: | Строка 75: | ||
<source lang="php"> | <source lang="php"> | ||
public function getRating($element_id, $template = 'default') { | public function getRating($element_id, $template = 'default') { | ||
− | + | $ini = cmsController::getInstance()->getModule('vote'); | |
$element = umiHierarchy::getInstance()->getElement($element_id); | $element = umiHierarchy::getInstance()->getElement($element_id); | ||
if (!$element) return ''; | if (!$element) return ''; | ||
Строка 80: | Строка 84: | ||
$block_arr['rate_sum'] = (int) $element->getValue("rate_sum"); | $block_arr['rate_sum'] = (int) $element->getValue("rate_sum"); | ||
$block_arr['rate_voters'] = (int) $element->getValue("rate_voters"); | $block_arr['rate_voters'] = (int) $element->getValue("rate_voters"); | ||
− | $block_arr['is_rated'] = | + | $block_arr['is_rated'] = $ini->getIsRated($element_id); |
if ($block_arr['rate_voters'] > 0) { | if ($block_arr['rate_voters'] > 0) { | ||
$block_arr['rate'] = round($block_arr['rate_sum'] / $block_arr['rate_voters'], 2); | $block_arr['rate'] = round($block_arr['rate_sum'] / $block_arr['rate_voters'], 2); | ||
Строка 118: | Строка 122: | ||
</pre> | </pre> | ||
где %id% - id страницы. | где %id% - id страницы. | ||
+ | |||
+ | [[Категория:Написание кастомных макросов]] |
Текущая версия на 13:49, 21 ноября 2018
Есть в продукте версии 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 страницы.