Рейтинг статьи в виде звездочек для NetCat
Этот рецепт описывает интеграцию Fyneworks jQuery Star Rating в NetCat. В результате к статье (объекту) будут прикручены звездочки, вот такие: , причем в листинге объектов они будут исключительно информативными (отражать текущий рейтинг статьи), а в полном отображении объекта - динамичными. Авторизованный пользователь получит возможность проголосовать один раз, просто наведя мышь и кликнув на звездочку.
Версия NetCat: любая, рекомендуется с поддержкой шаблонов компонентов, редакция любая
Источники: www.fyneworks.com
Скачать:
- Attach:NetCat-StarRating_2011-02-09.zip - первая версия от студии Ph&Ph. Официальная, на ней основан рецепт
- Attach:AlterFall-jqueryRating_2012-01-07.rar - версия Александра Панасина отличается подсчетом среднего арифметического значения и работой в актуальных версиях NetCat. Инструкции по установке внутри архива.
Установка и использование
Скачайте архив и закачайте директорию "phph-StarRating" в /images/ инсталляции NetCat на вашем хостинге. Альтернативно, можете скачать актуальную версию плагина с официального сайта.
В заголовок макета дизайна вставьте вызов загруженных скриптов вот таким кодом:
<!-- phph-star-rating -->
<script src='/images/phph-StarRating/jquery.rating.js' type='text/javascript' language='javascript'></script>
<link href='/images/phph-StarRating/jquery.rating.css' type='text/css' rel='stylesheet'/>
<!-- /phph-star-rating -->
Теперь импортируйте компонент, создайте на сайте скрытый раздел "Рейтинг объектов", прикрепите к нему компонент.
Теперь рейтинг можно вызывать из "объекта в списке" или "полного отображения объекта" компонента с комментируемым контентом примерно следующим кодом:
".s_list_class(102, 164, "&nc_ctpl=117&scID=$f_Sub_Class_ID&objID=$f_RowID&userID=$f_UserID&backlink=".urlencode(htmlspecialchars($GLOBALS[client_url]))."", true)."
Здесь 102 - номер скрытого раздела сайта с компонентом Голосование; 164 - номер его компонента, 117 - номер шаблона представления компонента "Только результаты".
".( $AUTH_USER_ID && listQuery("SELECT Message_ID FROM Message111 WHERE Object_ID=$f_RowID AND Object_Sub_Class_ID=$cc AND User_ID=".$current_user['User_ID']."","\$data[Message_ID]")==0 ?
"
".s_list_class(102, 164, "&scID=$cc&objID=$f_RowID&userID=$f_UserID&backlink=".urlencode(htmlspecialchars($GLOBALS[client_url]))."", true)." "
:
"
".s_list_class(102, 164, "&nc_ctpl=117&scID=$cc&objID=$f_RowID&userID=$f_UserID&backlink=".urlencode(htmlspecialchars($GLOBALS[client_url]))."", true)."
"
)."
Теоретически, все должно заработать. Обратите внимание, что это довольно сложный компонент, поэтому мы рекомендуем не импортировать готовый компонент, а собрать его заново вручную, воспользовавшись дальнейшими инструкциями.
Полезные куски кода (раскладка компонента):
Создайте новый компонент, взяв за основу компонент «Рейтинг объектов». Подключение рейтинга осуществляется примерно следующими модификациями:
Шаблон представления компонента, "Только результаты":
Префикс списка объектов - статичный вывод текущего рейтинга
<input class='star' type='radio' name='Rating-$scID-$objID' value='2' disabled='disabled' ".((int)$rating == "2" ? "checked='checked'" :"") ."/>
<input class='star' type='radio' name='Rating-$scID-$objID' value='3' disabled='disabled' ".((int)$rating == "3" ? "checked='checked'" :"") ."/>
<input class='star' type='radio' name='Rating-$scID-$objID' value='4' disabled='disabled' ".((int)$rating == "4" ? "checked='checked'" :"") ."/>
<input class='star' type='radio' name='Rating-$scID-$objID' value='5' disabled='disabled' ".((int)$rating == "5" ? "checked='checked'" :"") ."/>
".((int)$rating == "0" ? "<span class='small gray'>нет оценок</span>" :"") ."
Сам компонент:
Префикс списка объектов - динамика с возможностью голосования
($showWeight ? $rating :
($cc_settings['Rating']=="on" ? "
<form name='adminForm' enctype='multipart/form-data' method='post' action='".$SUB_FOLDER.$HTTP_ROOT_PATH."add.php'>
<script>
$(function(){
$('.auto-submit-star').rating({
callback: function(value, link){
// 'this' is the hidden form element holding the current value
// 'value' is the value selected
// 'element' points to the link element that received the click.
// alert(\"The value selected was\");
// To submit the form automatically:
this.form.submit();
// To submit the form via ajax:
// $(this.form).ajaxSubmit();
}
});
});
</script>
<input name='cc' value='$cc' type='hidden'>
<input name='sub' value='$sub' type='hidden'>
<input name='catalogue' value='$catalogue' type='hidden'>
<input name='posting' value='1' type='hidden'>
<input name='f_BackLink' value='$backlink' type='hidden'>
<input name='f_Object_Sub_Class_ID' value='$scID' type='hidden'>
<input name='f_Object_ID' value='$objID' type='hidden'>
<input name='f_Object_Author_ID' value='$userID' type='hidden'>
<input name='f_Object_voter_ID' value='".$current_user['User_ID']."' type='hidden'>
".($current_user['User_ID'] ? "
<input class='auto-submit-star' type='radio' name='Rating1' value='1' ".((int)$rating == "1" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='2' ".((int)$rating == "2" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='3' ".((int)$rating == "3" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='4' ".((int)$rating == "4" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='5' ".((int)$rating == "5" ? "checked='checked'" :"") ."/>
".((int)$rating == "0" ? "<span class='small gray'>нет оценок</span>" :"") ."
</form>"
: "
<input class='auto-submit-star' type='radio' name='Rating1' value='1' disabled='disabled' ".((int)$rating == "1" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='2' disabled='disabled' ".((int)$rating == "2" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='3' disabled='disabled' ".((int)$rating == "3" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='4' disabled='disabled' ".((int)$rating == "4" ? "checked='checked'" :"") ."/>
<input class='auto-submit-star' type='radio' name='Rating1' value='5' disabled='disabled' ".((int)$rating == "5" ? "checked='checked'" :"") ."/>
"
).""
: "")
)
)."
Объект в списке (только для админки)
<br><br>
$f_AdminButtons
Рейтинг: $f_Rating<br>
Номер компонента: $f_Object_Sub_Class_ID<br>
ID объекта за который голосовали: $f_Object_ID<br>
Идентификатор автора сообщений за которое голосовали: $f_Object_Author_ID<br><br>
<hr>
" : "")."
Условия добавления объекта
# $current_user['User_ID']!=$f_Object_Author_ID
if($current_user['User_ID']) {
# зависимость рейтинга от типа пользователя по классу $perm
#if($perm->isDirector() || $perm->isSupervisor) $kRating = 3;
# if($perm->isManager()) $kRating = 2;
# if(!$kRating) $kRating = 1;
# зависимость рейтинга от типа пользователя по группам
$kRating = 1;
# проверим чтобы не голосовал до этого
$voted = $db->get_var("SELECT Message_ID FROM Message$classID WHERE Object_ID=".(int)$f_Object_ID." AND Object_Sub_Class_ID=".(int)$f_Object_Sub_Class_ID." AND User_ID=".$current_user['User_ID']."");
if(!$voted) {
if($Rating1 == "1") $f_Rating = $kRating * 1;
if($Rating1 == "2") $f_Rating = $kRating * 2;
if($Rating1 == "3") $f_Rating = $kRating * 3;
if($Rating1 == "4") $f_Rating = $kRating * 4;
if($Rating1 == "5") $f_Rating = $kRating * 5;
}
else {
ob_end_clean();
if($_POST[f_BackLink]) $goBackLink = $f_BackLink;
else $goBackLink = "/";
header("Location: $goBackLink");
die();
}
}
else {
ob_end_clean();
if($_POST[f_BackLink]) $goBackLink = $f_BackLink;
else $goBackLink = "/";
header("Location: $goBackLink");
die();
}
if($Rating1)
-> if($Rating1 == "1")
Компонент готов.
Заметки
- если вы хотите, как мы, избавиться от совершенно не нужного минуса перед звездочками, скачивайте наш архив, а не релиз с официального сайта. Там это как-то немного коряво, но действенно вырезано;
- если вы хотите вернуть совершенно не нужный минус перед звездочками, скачивайте релиз с официального сайта, или поправьте файл jquery.rating.js из нашего архива поиском по "Finar".
Ajax'ом, мы, к сожалению, не занимались. Хотя это, безусловно, желательный функционал.
Шаблон представления компонента "Только результаты" - это вариант вывода компонента Голосования - Рейтинг объектов, в котором звезды выводятся статично, без возможности голосования:
Боюсь, сложно что-то конкретное подсказать. Для начала убедитесь, что просто компонент "Рейтинг объекта" работает, а потом уже поэтапно дорабатывайте его по инструкциям.
К сожалению сейчас в связи с катастрофической нехваткой времени, мы занимаемся чем-либо только на коммерческой основе. Вот расширим штат - и снова пустимся во все тяжкие Open Source :)
Finar.
Комментарии (1)
Микола (2020-09-24, 17:17)
А для товаров есть реализация?
Нет, но, вероятно, ее можно реализовать вручную по аналогии. Вообще, если честно, этот код очень старый (9 с лишним лет назад написан пост). Сейчас я бы рекомендовал писать такой функционал с нуля, а не копировать код. В нём можно подсмотреть принцип, разве что.
Finar.