Реализация накрутки голосов для Drupal модуля Fivestar
Есть в Drupal такой модуль, как Fivestar, позволяющий голосовать за ноды. Возникла задача: как быстро накрутить количество голосов Fivestar, чтобы создать видимость действительно рейтингового материала. Как обычно нужно было быстрое решение, так как писать интерфейс с отдельной формой под это дело не хотелось.
Искать решение накрутки Fivestar я начал в попытке перехватить момент голосования для того, чтобы добавлять фейковые голоса. Виджет голосования - это обычная форма, которую можно альтернуть и добавить свою функцию валидации, на которой и будет происходить накрутка. В моем случае использовалась форма с ID "fivestar-custom-widget":
- /**
- * Implements hook_form_FORM_ID_alter().
- */
- function MY_MODULE_form_fivestar_custom_widget_alter(&$form, &$form_state, $form_id) {
- $form['#validate'][] = 'MY_MODULE_fivestar_generate_votes';
- }
Накрутка Fivestar рейтинга
Далее необходимо описать указанную функцию валидации. В переменной
у меня хранится количетсво фейковых голосов, которые будут добавлены при голосовании. Таким образом, в процессе каждого отдельного выставления оценки за ноду будут добавляться такие же фейковые оценки указанное количество раз в теле цикла. Также я добавил дельту $count
для создания небольшого разброса значений во избежания одинаковых круглых чисел голосов для всех материалов на сайте.$delta
- /**
- * Накрутка голосов Fivestar.
- *
- * @param $form
- * @param $form_state
- */
- function MY_MODULE_fivestar_generate_votes($form, &$form_state) {
- // Количество голосов, которое будет отдано за один запуск.
- $count = MY_MODULE_FIVESTAR_VOTE_COUNT;
- $delta = round(0.2 * $count);
- $count += mt_rand(-$delta, $delta);
-
- if (!empty($form_state['settings']['content_id'])) {
- while ($count > 0) {
- _fivestar_update_field_value($form_state['settings']['content_type'], $form_state['settings']['entity'],
- $form_state['settings']['field_name'], $form_state['settings']['langcode'], $form_state['values']['vote']);
- _fivestar_cast_vote($form_state['settings']['content_type'], $form_state['settings']['content_id'],
- $form_state['values']['vote'], $form_state['settings']['tag']);
- $count--;
- }
- }
- }
При желании можно добавить проверку, например, для того, чтобы накручивались только голоса указанной роли. Данный прием работает в рамках 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).
та же фигня!
Добавить комментарий