Непонятно (view, voting api)

  • strict warning: Declaration of views_handler_field_user_name::init() should be compatible with views_handler_field_user::init(&$view, $data) in /var/www/shvabrashvabr.ru/sites/all/modules/views/modules/user/views_handler_field_user_name.inc on line 61.
  • strict warning: Declaration of views_handler_argument_many_to_one::init() should be compatible with views_handler_argument::init(&$view, $options) in /var/www/shvabrashvabr.ru/sites/all/modules/views/handlers/views_handler_argument_many_to_one.inc on line 169.


Задача:
Сделать ленту материалов, типа блог (в том числе и коллективные), отсортированную по дате добавления, критерий вхождения рейтинг равный, либо больший 0.

Проблема:
Создал вьюшку, страницу тизеров, фильтр по типу материалов и voting result (sum) больше либо равное 0. Сортировка по дате добавления. Непонятки в том, что в ленте отбражаются лишь материалы за которые уже был отдан голос.

Тоесть если материал новый и рейтинг у него ноль, он туда не попадает, но если за материал были голоса (например 1+ и 1-) он входит с рейтингом ноль в эту вьюшку.

Необходимо же чтоб материалы новые за которые еще не голосовали так же там отображались. Как побороть? Сталкивался кто нибудь с такой проблемой?

Комментарии

Столкнулся с такой же проблемой.
Понравился метод, предложенный Рокмкой:
"Как вариант, можно в настройках Voting API ("/admin/settings/votingapi") выбрать настройку "Tally results at cron-time" и поставить запуск крона раз в минуту."
Сделал запуск крона раз в минуту, но по ходу все равно новые ноды в таблицу вотинг апи не добавляются и view все равно не отображает новые ноды.

Разобрался. Пришлось переписать hook_cron.

Решение нашлось благодаря neochief'у на друпал.орг.

По ссылке следующее: в файле votingapi_views.inc меняем строку:
$query->add_where("%s %s %d", $field, $filter['operator'], $filter['value']);

на

if (( $filter['value'] == "0") || ( $filter['value'] === NULL) ){
$query->add_where("$field is NULL OR %s %s %d", $field, $filter['operator'], $filter['value']);
} else {
$query->add_where("%s %s %d", $field, $filter['operator'], $filter['value']);
}

Теперь выставляя во вьюшке значение greater than or equal to 0 будут отображаться материалы от нуля и выше.

Эта заплатка правда не решает проблемы если нам надо вывести greater than or equal to -1
пока не пробывал но думаю это можно побороть составной вьюшкой . Выставляя в одной значение greater than or equal to -1, а в другой equal to 0 в итоге на страницы должны отобразиться все материалы от -1 и выше, включае те за которые не голосовали.

Поправте, если не правильно мыслю.

Править код модулей — плохое решение. Лучше написать свой модуль, который будет выполнять те же действия по хук_инсерт. А еще лучше сделать простые инсерты в таблицы votingapi_vote и votingapi_cache.

Мде, я сначало подумал мой косяк. Ведь это так логично выставлять новой ноде рейтинг 0.
Спасибо, будем бороть.

Ни разу это не логично. На некоторых сайтах встречаются рейтинги от 1 до 5 с дефолтным значением 3.

К сожалению, с точки зрения модуля VotingAPI — это правильная логика: после того как за пост отдан голос добавляются или обновляются записи с соответствующим ноде нидом в таблице votingapi_cache. До того как за ноду отдан голос записи в этой таблице, связанной с этой нодой нет, по этому фильтры "VotingAPI [...]" её проигнорируют.

Как вариант, можно в настройках Voting API ("/admin/settings/votingapi") выбрать настройку "Tally results at cron-time" и поставить запуск крона раз в минуту. Кстати, если вы не знаете как настроить крон или (омг!) у вашего хостера его настроить нельзя, то можно воспользоваться новым сервисом Веб-крон.

Или все в тех же настройках Voting API можно выбрать "Never tally votes: I am using a custom module to control vote results" и повесить на хук hook_insert соответствующий обработчик.

Хотя, вполне возможно, без своего модуля здесь все равно не обойтись. Вероятно, понадобится еще и на все тот же хук_инсерт повесить добавление записи с соответствующим ноде нидом в таблицу votingapi_vote.

Back to top