Рейтинг пользователя — различия между версиями
| Velross (обсуждение | вклад)  (Новая страница: «Актуально для версии 2.9.6  ---- '''Задача:''' Подсчитывать рейтинг пользователя при голосовании…») | Velross (обсуждение | вклад)  | ||
| (не показана 1 промежуточная версия этого же участника) | |||
| Строка 6: | Строка 6: | ||
| '''Решение:''' | '''Решение:''' | ||
| − | 1. В типе данных "Пользователь" создадим новое поле "Рейтинг пользователя" с идентификатором rate_user | + | 1. В типе данных "Пользователь" создадим новое поле "Рейтинг пользователя" с идентификатором rate_user<br/> | 
| 2. Напишем кастомный макрос. Макрос можно написать как в общем кастоме /classes/modules/custom.php, так и в кастоме для модуля голосования. | 2. Напишем кастомный макрос. Макрос можно написать как в общем кастоме /classes/modules/custom.php, так и в кастоме для модуля голосования. | ||
| Строка 26: | Строка 26: | ||
| 	$userObject->setValue("rate_user", $sumRateUser); | 	$userObject->setValue("rate_user", $sumRateUser); | ||
| 	$userObject->commit(); | 	$userObject->commit(); | ||
| + |         return true; | ||
| } | } | ||
| </source> | </source> | ||
| − | 3. Добавим дополнительный ajax-вызов в функцию jQuery('.votes div a').click(function(){} находящуюся в файле /templates/demodizzy/js/__common.js | + | 3. Добавим дополнительный ajax-вызов в функцию jQuery('.votes div a').click(function(){} находящуюся в файле /templates/demodizzy/js/__common.js<br/> | 
| + | Если вы писали в кастом модуля vote, то вызов будет udata://vote/userKarma/ | ||
| <source lang="javascript"> | <source lang="javascript"> | ||
| Строка 38: | Строка 40: | ||
| }); | }); | ||
| </source> | </source> | ||
| + | |||
| + | 4. Выведем значение в нужном месте сайта. В личном кабинете, при редактировании профиля данное поле появиться автоматически. Чтобы рейтинг нельзя было отредактировать, добавим в файл шаблона, по которому выводится форма templates/demodizzy/xslt/modules/data/common-edit-form.xsl дополнительное условие: | ||
| + | <source lang="xml"> | ||
| + | <xsl:template match="field[@name = 'rate_user']" mode="form"> | ||
| + | 	<div> | ||
| + | 		<label title="{@tip}"> | ||
| + | 			<xsl:apply-templates select="@required" mode="form" /> | ||
| + | 			<span> | ||
| + | 				<xsl:value-of select="concat(@title, ':')" /> | ||
| + | 			</span> | ||
| + | 			<xsl:value-of select="text()"  /> | ||
| + | 		</label> | ||
| + | 	</div> | ||
| + | </xsl:template>	  | ||
| + | </source> | ||
| + | |||
| + | [[Категория:Модуль Опросы]][[Категория:Написание кастомных макросов]][[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]] | ||
Текущая версия на 21:44, 24 мая 2014
Актуально для версии 2.9.6
Задача: Подсчитывать рейтинг пользователя при голосовании за его материалы и комментарии на сайте другими пользователями.
Решение:
1. В типе данных "Пользователь" создадим новое поле "Рейтинг пользователя" с идентификатором rate_user
2. Напишем кастомный макрос. Макрос можно написать как в общем кастоме /classes/modules/custom.php, так и в кастоме для модуля голосования.
    //TODO: Write your own macroses here
    public function userKarma ($pageId, $rate) {
	//Получим экземпляр страницы через ее id
	$pageElement = umiHierarchy::getInstance()->getElement($pageId);
	//Получим объект оцениваемой страницы
	$pageObjectId = $pageElement->objectId;
	$pageObject = umiObjectsCollection::getInstance()->getObject($pageObjectId);
	//Узнаем Id владельца объекта
	$userId = $pageObject->getOwnerId();		
	//Получим объект пользователя
	$userObject = umiObjectsCollection::getInstance()->getObject($userId);
	// Получим текущий рейтинг, увеличим его на переданное значение и сохраним изменения
	$currentRateUser = $userObject->getValue("rate_user");
	$sumRateUser = $currentRateUser + (int) $rate;
	$userObject->setValue("rate_user", $sumRateUser);
	$userObject->commit();
        return true;
}
3. Добавим дополнительный ajax-вызов в функцию jQuery('.votes div a').click(function(){} находящуюся в файле /templates/demodizzy/js/__common.js
Если вы писали в кастом модуля vote, то вызов будет udata://vote/userKarma/
jQuery.ajax({
	url: "/udata://custom/userKarma/" + element_id + "/" + params[0].split('_').pop() + ".json",
	type: "GET",
	dataType : 'json',
});
4. Выведем значение в нужном месте сайта. В личном кабинете, при редактировании профиля данное поле появиться автоматически. Чтобы рейтинг нельзя было отредактировать, добавим в файл шаблона, по которому выводится форма templates/demodizzy/xslt/modules/data/common-edit-form.xsl дополнительное условие:
<xsl:template match="field[@name = 'rate_user']" mode="form">
	<div>
		<label title="{@tip}">
			<xsl:apply-templates select="@required" mode="form" />
			<span>
				<xsl:value-of select="concat(@title, ':')" />
			</span>
			<xsl:value-of select="text()"  />
		</label>
	</div>
</xsl:template>
