Реализация накрутки голосов для 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   .d8888b.            
888 888 o 888 d88P Y88b
888 888 d8b 888 Y88b.
888 888 d888b 888 "Y888b. 888 888
888 888d88888b888 "Y88b. 888 888
888 88888P Y88888 "888 888 888
888 8888P Y8888 Y88b d88P Y88b 888
888 888P Y888 "Y8888P" "Y88888
888
Y8b d88P
"Y88P"
Зарегистрируйтесь для добавления материалов без проверки.