Как предоставить баллы пользователям, которые выполняют вход в систему 5 дней подряд?


Мне нужно знать, выполнял ли пользователь вход в систему, например, 5 дней подряд. Причина этого в том, что я хочу присудить им Пользовательские баллы.

Например:

  • Пользователь A выполняет вход в систему в понедельник, вторник, среду, четверг и пятницу. (присвоено 10 баллов)
  • Пользователь B выполняет вход в систему в понедельник, вторник, четверг, пятницу и субботу. (без очков)

Я пытаюсь сделать это с помощью правил , но не получилось несчастно. Есть какие-нибудь идеи?

Примечание: Я пытаюсь использовать условие правил для сравнения значений my_last_login с сегодняшней датой со смещением в 1 день, но оно всегда возвращает False.

Author: Pierre.Vriens, 2012-06-29

5 answers

На самом деле, это то, что я пытаюсь построить прямо сейчас. Используйте hook_user_login() со следующим кодом:

global $user;
$last_access = $user->access;
// if last_access is today, do nothing
$yesterday_start    = mktime(0, 0, 0,date('m'), date('d')) - (60*60*24);
$yesterday_end  = $yesterday_start + (60*60*24)-1;  


// if last access is yesterday, increment counter
if ($last_access > $yesterday_start && $last_access < $yesterday_end) {
  //increment counter
} 
// if last access is before yesterday, set counter = 1
else if ($last_access < $yesterday_start) {
  $counter = 1;
}

if ($counter == 5) {
  // put you magic code here
  // set the counter to 1 
}

$counter может быть чем-то вроде variable_get(). В качестве альтернативы, я полагаю, что вы можете включить приведенный выше код в свои правила, если вы не хотите писать модуль. Однако в обоих случаях код не будет выполнен, если пользователь покинет свой браузер, войдя в систему.

 2
Author: Mike, 2016-12-19 20:53:53

Модуль статистики в ядре будет работать в этом случае.

 3
Author: SUP-DUD, 2012-09-07 10:15:52

Использование модуля Правил для решения этой задачи действительно является частью решения. Но ключевой частью вашей задачи является то, что вы хотите, чтобы действие Правил было запущено для события Правил (= пользователь выполняет вход в систему), которое:

  1. необходимо повторить
  2. в течение определенного периода времени
  3. которые не все происходят в один и тот же момент.

Правила великолепны (на самом деле удивительны), но они не поддерживают ни один из 3 пуль выше. Пока что плохие новости...

Однако ваш вопрос кажется идеальным вариантом для использования модуля Цели (раскрытие информации: я его сопровождающий). Ниже приведена возможная конфигурация для этого, используя цели .

Настройка цели

Перейдите к относительному пути admin/config/goals/manage и используйте ссылку "Добавить цель", чтобы определить только 1 цель с описанием (скажем):

Perform a login, 5 days consecutively.

Настройка задачи

Для достижения вышеупомянутая цель определяет Задачи(задачи), которые необходимо выполнить. Несмотря на то, что для достижения одной цели может быть выполнено несколько задач, в вашем случае вам просто нужно 1. Это просто Perform a login.

Очевидно, что это не учитывает 5 days consecutively- часть твоего вопроса. Для этого вы могли бы использовать некоторые из более продвинутых способов использования (настройки) Целей , т. Е. Используя эти дополнительные параметры конфигурации для этого конкретного задача:

  • эту задачу необходимо повторить несколько раз: в вашем случае 5 раз.
  • для выполнения этой задачи требуется некоторое время, чтобы истечь между любыми 2 аналогичными задачами: в вашем случае, если пользователь выполняет вход/выход несколько раз в день, учитывается только первый из каждого дня.
  • эта задача должна быть выполнена в течение определенного периода времени (количество раз, выраженное в часах, днях или неделях): в вашем случае 5 дней.

Отслеживать прогресс при выполнении задач

Чтобы отслеживать прогресс, достигнутый одним пользователем для выполнения этой задачи, вам нужно только написать соответствующее правило, используя модуль Правила, для записи соответствующих событий, происходящих на вашем сайте, которые связаны с завершением задача чтобы достичь цель.

Для цели/задачи, описанной выше, вам понадобится только 1 (чрезвычайно простое) правило, которое будет выглядеть вот так:

  • Событие правил = После того, как пользователь выполняет вход в систему.
  • Действие правил = Запишите задачу для целей (очевидно, что задача, которую нужно записать, - "Выполнить вход в систему"). Именно здесь происходит часть волшебства Целей , например, проверка требований в дополнительных параметрах конфигурации задачи для задачи (только один раз в день и т. Д.).

Примечание: если пользователь оставляет свой браузер авторизованным, то использование этого события Правил может быть не самым подходящим событием. Если вы бы заменили это событие на "Drupal инициализируется" (в "Системе"), тогда такое правило будет срабатывать для любого пути, который посещает пользователь. При желании вы можете объединить это событие Правил с дополнительным условием правил "У пользователя есть роль, с ролью = аутентифицированный", чтобы Действия Правил выполнялись только для вошедших в систему пользователей.

Используйте правила для обработки завершенных целей

После выполнения пользователем всех задач, относящихся к определенной цели, цель автоматически помечается как завершенный. Но, вот где становится действительно интересно: вы также можете создать дополнительные правила, которые будут срабатывать (событие правил), когда цель будет достигнута пользователем. При этом ответ на ваш вопрос чрезвычайно прост: выполните действие Правил, чтобы "... предоставьте баллы пользователя пользователю, выполнившему цель" ... именно об этом и идет ваш вопрос, не так ли?

Дополнительная информация

Обратитесь к моему ответу на " Как реализовать геймификацию в Сайт Drupal и поощрительные премии?" для получения дополнительной информации о модуле Цели.

Примечание: Использование Целей требует только типичных задач администрирования (настройки), хотя оно поставляется с различными крючками также для разработки пользовательских модулей (если вы хотите).

 1
Author: Pierre.Vriens, 2017-05-31 14:14:02

Включите модуль фильтра PHP.

Добавьте два поля в профиль пользователя ( администратор/конфигурация/люди/учетные записи/поля ): для количества входов (имя: cons_login_counts, тип: целое число, значение по умолчанию: 0, разрешения: пользовательские (только для администратора)) и для даты последнего входа (имя: cons_last_login_day, тип: текст, разрешения: пользовательские).

Создайте новое правило с реакцией на событие "Пользователь вошел в систему". Добавьте действие "Выполнить пользовательский PHP-код" и поместите этот код:

$user = entity_metadata_wrapper('user', $account);
$login_counts = $user->field_cons_login_counts->value();
$last_login_day = $user->field_cons_last_login_day->value();

$today = date('Y-m-d');
$yesterday = date("Y-m-d", time() - 60 * 60 * 24);

if ($last_login_day == $today)
  return;

if ($last_login_day == $yesterday) {
  $login_counts++;
} else {
  $login_counts = 1;
}

$last_login_day = $today;

if ($login_counts == 5/* and not gived a points to user*/) {
  // give them point
}

$user->field_cons_login_counts = $login_counts;
$user->field_cons_last_login_day = $last_login_day;

$user->save();
 0
Author: aroo, 2012-06-29 13:20:57

Правило должно срабатывать, когда пользователь входит в систему, и вам нужно написать пользовательский PHP-код в части "Действие" правила. Как

if(check_user_logins($uid)){
  db_query("UPDATE <table> set points = points + 5 WHERE uid = %d", $uid);
}

function check_user_logins($uid){
  // Code to check consecutive user logins goes here
  if($logins >= 5){
    return TRUE;
  }else{
    return FALSE;
  }
}
 -1
Author: GoodSp33d, 2012-06-29 09:51:56