Голосование за страницы — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 2 промежуточные версии 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/__сcustom.php''', добавим два метода, '''rate_do''' будет отвечать за сохранение данных, '''gettRating''' - за вывод результатов голосования:
+
В файл '''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") {
Строка 120: Строка 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 страницы.