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

Блог

Как расставить запятые между тегами на CSS?

Иногда проще что-то сделать на чистом CSS, чем на серверной стороне. Например, расставить запятые между тегами. Попробуем разделить подчеркнутые теги-ссылки на чистом CSS.

далее

Как отресайзить картинки батчем?

Все фотографии, которые вы собираетесь отресайзить, должны быть в одной директории, скажем «uploads». Внутри нее можно сохранить любую структуру директорий. Мы научимся создавать копию этой директории, внутри которой все картинки будут отресайзены, причем только в сторону уменьшения разрешения.

далее

Tilda Module: интеграция NetCat с Tilda.cc

Представляем нашу новую разработку, модуль интеграции CMS NetCat с платформой Tilda.cc. Модуль дает возможностью полуавтоматически размещать классные лендинги прямо в структуре вашего сайта!

далее

Как оптимально заархивировать файлы, чтобы распаковать их средствами ISPmanager?

В определенных случаях файлы выгоднее заливать на веб-сервер в виде архива. Во-первых, если данные хорошо сжимаются, или же просто файлов очень много, это сократит время заливки. Во-вторых, в любом случае это обезопасит данные от случайного повреждения, так как при распаковке архива происходит проверка его целостности с помощью контрольной суммы (CRC). Однако, не вполне понятно, какой формат архива и тип сжатия выбирать? Мы провели небольшое экспериментальное исследование на эту тему.

далее

Весь блог тут