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

та же фигня!

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

        d8888                 888     888   .d8888b.  
d88888 888 888 d88P Y88b
d88P888 888 888 888 888
d88P 888 88888b.d88b. 888 888 Y88b. d888
d88P 888 888 "888 "88b 888 888 "Y888P888
d88P 888 888 888 888 888 888 888
d8888888888 888 888 888 Y88b. .d88P Y88b d88P
d88P 888 888 888 888 "Y88888P" "Y8888P"


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