Реализация накрутки голосов для Drupal модуля Fivestar

Есть в Drupal такой модуль, как Fivestar, позволяющий голосовать за ноды. Возникла задача: как быстро накрутить количество голосов Fivestar, чтобы создать видимость действительно рейтингового материала. Как обычно нужно было быстрое решение, так как писать интерфейс с отдельной формой под это дело не хотелось.

Искать решение накрутки Fivestar я начал в попытке перехватить момент голосования для того, чтобы добавлять фейковые голоса. Виджет голосования - это обычная форма, которую можно альтернуть и добавить свою функцию валидации, на которой и будет происходить накрутка. В моем случае использовалась форма с ID "fivestar-custom-widget":

  1. /**
  2.  * Implements hook_form_FORM_ID_alter().
  3.  */
  4. function MY_MODULE_form_fivestar_custom_widget_alter(&$form, &$form_state, $form_id) {
  5. $form['#validate'][] = 'MY_MODULE_fivestar_generate_votes';
  6. }

Накрутка Fivestar рейтинга

Далее необходимо описать указанную функцию валидации. В переменной $count у меня хранится количетсво фейковых голосов, которые будут добавлены при голосовании. Таким образом, в процессе каждого отдельного выставления оценки за ноду будут добавляться такие же фейковые оценки указанное количество раз в теле цикла. Также я добавил дельту $delta для создания небольшого разброса значений во избежания одинаковых круглых чисел голосов для всех материалов на сайте.

  1. /**
  2.  * Накрутка голосов Fivestar.
  3.  *
  4.  * @param $form
  5.  * @param $form_state
  6.  */
  7. function MY_MODULE_fivestar_generate_votes($form, &$form_state) {
  8. // Количество голосов, которое будет отдано за один запуск.
  9. $count = MY_MODULE_FIVESTAR_VOTE_COUNT;
  10. $delta = round(0.2 * $count);
  11. $count += mt_rand(-$delta, $delta);
  12.  
  13. if (!empty($form_state['settings']['content_id'])) {
  14. while ($count > 0) {
  15. _fivestar_update_field_value($form_state['settings']['content_type'], $form_state['settings']['entity'],
  16. $form_state['settings']['field_name'], $form_state['settings']['langcode'], $form_state['values']['vote']);
  17. _fivestar_cast_vote($form_state['settings']['content_type'], $form_state['settings']['content_id'],
  18. $form_state['values']['vote'], $form_state['settings']['tag']);
  19. $count--;
  20. }
  21. }
  22. }

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

Комментарии

Аватар пользователя Дмитрий
Дмитрий

Привет Семен.
Fivestar 7.x-2.1, Voting API 7.x-2.12
Изменил только на $count = 10;
Промежуток времени для анонимных голосов и Registered user vote rollover установлены "Никогда". Подсчет результатов: Подсчитывать результаты после каждой оценки.

После того как отдаешь голос, Пишет:
Возникла AJAX HTTP ошибка.
Полученный код HTTP: 500
Следует отладочная информация.
Путь: /system/ajax
СтатусТекст: error
ResponseText: EntityMalformedException: Отсутствует связующее свойство у сущности типа node. в функции entity_extract_ids() (строка 7844 в файле includes\common.inc).

Аватар пользователя Pes
Pes

та же фигня!

Добавить комментарий

 888       888     888  888    d8P    .d88888b.  
888 888 888 888 d8P d88P" "Y88b
888 888 888 888 d8P 888 888
88888b. 888 888 888d88K 888 888
888 "88b 888 888 8888888b 888 888
888 888 888 888 888 Y88b 888 Y8b 888
888 d88P Y88b. .d88P 888 Y88b Y88b.Y8b88P
88888P" "Y88888P" 888 Y88b "Y888888"
Y8b

Зарегистрируйтесь для добавления материалов без проверки.