Голосование за страницы
Материал из Umicms
В системном файле модуля "Опросы": 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 страницы.
