Рейтинг пользователя
Актуально для версии 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>