Реализация накрутки голосов для 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

та же фигня!

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

   888888    888888  888b     d888  888       888 
"88b "88b 8888b d8888 888 o 888
888 888 88888b.d88888 888 d8b 888
888 888 888Y88888P888 888 d888b 888
888 888 888 Y888P 888 888d88888b888
888 888 888 Y8P 888 88888P Y88888
88P 88P 888 " 888 8888P Y8888
888 888 888 888 888P Y888
.d88P .d88P
.d88P" .d88P"
888P" 888P"
Зарегистрируйтесь для добавления материалов без проверки.