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

та же фигня!

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

                     8888888888P  888      
d88P 888
d88P 888
.d8888b 88888888 d88P 88888b.
88K d88P d88P 888 "88b
"Y8888b. d88P d88P 888 888
X88 d88P d88P 888 d88P
88888P' 88888888 d8888888888 88888P"


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