Fivestar - проверка на наличие голосов

Аватар пользователя Sevix Sevix 5 июня 2014 в 21:01

Для вывода значений модуля Fivestar нашел следующий код, который можно вставить в node.tpl.php:

<?php
$votes 
fivestar_get_votes('node',$node->nid);  // получаем количество оценок
$stars variable_get('fivestar_stars_'$node->type5);
$average_stars round(($votes['average']['value'] * $stars) / 1001);  //вычисляет суммарную оценку

print $average_stars;  // выводим оценку
print $votes['count']['value'];  // выводим количество оценок?>

Все хорошо, выводит среднюю оценку и общее кол-во.
Но, только если есть хотя бы один голос. Пока оценки нет, выдает ошибку:

Notice: Undefined index: value в функции include() (строка ... в файле ...\node.tpl.php).
Notice: Undefined index: value в функции include() (строка ... в файле ...\node.tpl.php).

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

Комментарии

Аватар пользователя kolotunbobo kolotunbobo 4 сентября 2018 в 8:26

Написано в теме [Решено]. А ведь с ошибками проблему товарищ не решил.

Дело в том, что при нулевых рейтингах $votes['average']['value'] и $votes['count']['value'] возвращают значание NULL, а это как известно не совсем 0.

Можно конечно запариться и править модуль, на drupal.org даже где-то были патчи. Но можно сделать и проще, например, таким макаром:

<?php
        $votes 
fivestar_get_votes('node',$node->nid);
        
$stars variable_get('fivestar_stars_'$node->type5);
        
define('average''average');
        
define('value''value');
        
$count_votes $votes['count']['value'];
      
$average_stars round(($votes['average']['value'] * $stars) / 1001);

      if (

$average_stars == NULL) {
        
$average_stars 0// NULL is not 0
      
}
      if (
$count_votes == NULL){
        
$count_votes 0// NULL is not 0
      
}
?>

А выводить уже переменные $average_stars и $count_votes.

Аватар пользователя fairrandir fairrandir 4 сентября 2018 в 9:08

kolotunbobo wrote:
Написано в теме [Решено]. А ведь с ошибками проблему товарищ не решил.

Приведенный вами фрагмент кода тоже не решает проблемы с ошибками. Зачем там два define?
kolotunbobo wrote:
Дело в том, что при нулевых рейтингах $votes['average']['value'] и $votes['count']['value'] возвращают значание NULL, а это как известно не совсем 0.

Дело в том, что при нулевых рейтингах $votes['average']['value'] и $votes['count']['value'] скорее всего вообще не существуют.

Достаточно isset.

Аватар пользователя fairrandir fairrandir 4 сентября 2018 в 10:17
<?php
$votes 
fivestar_get_votes('node',$node->nid);
$stars variable_get('fivestar_stars_'$node->type5);

$average_stars 0;
if (isset(
$votes['average']['value'])) {
  
$average_stars round(($votes['average']['value'] * $stars) / 1001);
}

$count_votes 0;
if (isset(
$votes['count']['value'])){
  
$count_votes $votes['count']['value'];
}
?>
Аватар пользователя kolotunbobo kolotunbobo 6 сентября 2018 в 16:37

Добрый день, спасибо!
Я так и сделал, только не успел опубликовать. Соррян, не знаток PHP.
Только я еще добавил проверку $stars на всякий случай (паранойя):

<?php
if (isset($votes['average']['value']) and isset($stars))
?>

Вот теперь можно писать [РЕШЕНО].

Аватар пользователя fairrandir fairrandir 6 сентября 2018 в 16:48

Проверка isset($stars) бессмысленна, ибо значение вы получаете через variable_get, у variable_get второй аргумент - значение по умолчанию, в вашем случае - 5. То есть $stars всегда будет или значением variable, или 5.