Рейтинг статьи в виде звездочек для NetCat

Этот рецепт описывает интеграцию Fyneworks jQuery Star Rating в NetCat. В результате к статье (объекту) будут прикручены звездочки, вот такие: , причем в листинге объектов они будут исключительно информативными (отражать текущий рейтинг статьи), а в полном отображении объекта - динамичными. Авторизованный пользователь получит возможность проголосовать один раз, просто наведя мышь и кликнув на звездочку.

Версия NetCat: любая, рекомендуется с поддержкой шаблонов компонентов, редакция любая
Источники: www.fyneworks.com
Скачать:

Установка и использование

Скачайте архив и закачайте директорию "phph-StarRating" в /images/ инсталляции NetCat на вашем хостинге. Альтернативно, можете скачать актуальную версию плагина с официального сайта.

В заголовок макета дизайна вставьте вызов загруженных скриптов вот таким кодом:

<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js'></script>
<!-- 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='1' disabled='disabled' ".((int)$rating == "1" ? "checked='checked'" :"") ."/>
<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>" :"") ."

Сам компонент:

Префикс списка объектов - динамика с возможностью голосования

".($showUserWeight ? $user_rating :
  ($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'" :"") ."/>
      "
      ).""
    : "")
  )
)."

Объект в списке (только для админки)

".($inside_admin? "
<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".
Руслан — 2011-07-08, 16:52

а как сделать на аяксе? иам вроде заккоментена строка: // To submit the form automatically:

                // this.form.submit();

                // To submit the form via ajax:
                 $(this.form).ajaxSubmit();

переносим слеши вниз, и казаолсь будет работать ajax
, но нет)

Ajax'ом, мы, к сожалению, не занимались. Хотя это, безусловно, желательный функционал.

Finar

Владимир — 2011-07-17, 20:55

Доброго времени суток!
В NetCat я новичок, и много еще не понимаю.
Подскажите пожалуйста, куда вставлять или что за "Шаблон представления компонента, "Только результаты""

Шаблон представления компонента "Только результаты" - это вариант вывода компонента Голосования - Рейтинг объектов, в котором звезды выводятся статично, без возможности голосования:

Finar

Владимир — 2011-07-19, 10:51

Спасибо, с шаблонами теперь все понятно, и звездочки стали выводится. Но теперь возник вопрос, как пользователь может проголосовать. На сайте в полном выводе объекта, появились radiobutton, при выборе нужного голос не фиксируется.

Боюсь, сложно что-то конкретное подсказать. Для начала убедитесь, что просто компонент "Рейтинг объекта" работает, а потом уже поэтапно дорабатывайте его по инструкциям.

Finar

Александр — 2011-10-16, 20:25

Логично сделать среднеарифметическую величену оценки, так по умолчанию это просто сумма рейтингов, т.е. всегда будет 5 звезд. Не могли бы помочь с реализацией?

К сожалению сейчас в связи с катастрофической нехваткой времени, мы занимаемся чем-либо только на коммерческой основе. Вот расширим штат - и снова пустимся во все тяжкие Open Source :)

Finar.

Комментарии (1)

Микола (2020-09-24, 17:17)

А для товаров есть реализация?

Нет, но, вероятно, ее можно реализовать вручную по аналогии. Вообще, если честно, этот код очень старый (9 с лишним лет назад написан пост). Сейчас я бы рекомендовал писать такой функционал с нуля, а не копировать код. В нём можно подсмотреть принцип, разве что.

Finar.

Блог

Что с Мастерхостом? Когда заработает?!

Этот вопрос всё чаще задают в Интернете начиная примерно с 12:00 дня 2 марта. А всё потому, что он накрылся!

далее

Автоматизированная Система Управления Бэкапами

Автоматизированная Система Управления Бэкапами позволяет добиться полного контроля над резервными копиями сайтов внутри инфраструктуры веб-студии. Если вы поддерживаете десятки сайтов на разных хостингах, без подобной системы вы не можете быть на 100% уверены в том, что каждый из них был корректно зарезервирован прошлой ночью.

далее

WebSocket: интеграция с NetCat

Хотите добавить на сайт под управлением CMS NetCat поддержку технологии WebSocket? Обращайтесь к нам! Посетители сайта смогут получать мгновенные уведомления о событиях сайта без обращений к серверу и перезагрузок страниц. Превратите свой сайт в интерактивную площадку, работающую в реальном времени!

далее

NetCat: техническая поддержка и доработка сайтов

Мы работаем с CMS NetCat уже больше 10 лет. У нас большой опыт и ответственный подход к делу.

далее

Весь блог тут