web-dev-qa-db-ja.com

5日間連続でログインするユーザーにユーザーポイントを付与するにはどうすればよいですか?

たとえば、ユーザーが5日間続けてログインしたかどうかを知る必要があります。その理由は ユーザーポイント を与えたいからです。

例えば:

  • ユーザーAは、月曜日、火曜日、水曜日、木曜日、金曜日にログインを実行します。 (10点付与)
  • ユーザーBは、月曜日、火曜日、木曜日、金曜日、土曜日にログインを実行します。 (ポイントなし)

Rules でこれを実行しようとしていますが、無残に失敗しました。何か案は?

:ルール条件を使用して、my_last_loginの値を-1日のオフセットで今日の日付と比較しようとしていますが、常にFalseを返します。

5
haryadimas

実際、これは私が今構築しようとしているものです。 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
Mike

この場合、コアの統計モジュールが機能します。

3
SUP-DUD

Rules モジュールを使用してこの課題を解決することは、確かにソリューションの一部です。しかし、課題の重要な部分は、次のようなルールイベント(=ユーザーがログインを実行する)に対してルールアクションをトリガーすることです。

  1. 繰り返す必要があります
  2. 指定された時間枠内
  3. すべてが同じ瞬間に起こるわけではありません。

ルール は素晴らしい(実際には驚くべき)ですが、上記の3つの箇条書きのいずれもサポートしていません。これまでのところ悪いニュース...

しかし、あなたの質問は Goals モジュールを使用するのに最適なケースのようです(開示:私はその管理者です)。以下は Goals を使用して可能な構成です。

目標を設定する

相対パスadmin/config/goals/manageに移動し、[ゴールを追加]リンクを使用して、説明(たとえば)とともに1goalのみを定義します。

Perform a login, 5 days consecutively

タスクを構成する

上記の目標を達成するには、完了する(Task(s))を定義します。 1つの目標に対して複数のタスクを完了する必要がある場合でも、必要なのは1つだけです。これは、単にPerform a login

明らかに、それはあなたの質問の5 days consecutively-部分を考慮していません。そのためには、(configure) Goals を使用するためのより高度な方法のいくつかを使用します。つまり、この特定のタスクにこれらのオプションの構成オプションを使用します。

  • このタスクは複数回繰り返す必要があります。あなたのケースでは5回です。
  • このタスクは、2つの類似したタスクの間に期限切れになるまでにある程度の時間を必要とします。あなたのケースでは、ユーザーが1日に複数回ログイン/ログアウトを実行する場合、毎日の最初の1つだけがカウントされます
  • このタスクは、特定の時間枠(時間、日、または週で表される回数)内に完了する必要があります。あなたのケースでは5日

タスクの実行中に進捗状況を追跡する

このタスクを完了するために1人のユーザーが行った進行状況を追跡するには、 Rules モジュールを使用して適切なルールを記述し、完了に関連するサイトで発生する関連イベントを記録するだけですtask目標

上記の目標/タスクの場合、次のような1つの(非常に基本的な)ルールのみが必要です。

  • ルールイベント=ユーザーがログインを実行した後。
  • ルールアクション=目標のタスクを記録します(明らかに、記録されるタスクは「ログインの実行」です)。これは Goals マジックの一部が発生する場所です。たとえば、タスクのオプションのタスク構成オプション(1日に1回のみ)の要件を確認するなどです。

注:ユーザーがブラウザをログインしたままにした場合、このルールイベントの使用は最適なイベントではない可能性があります。そのイベントを「Drupal is Initializing」(「System」内)に置き換えると、ユーザーがアクセスするすべてのパスに対してそのようなルールがトリガーされます。必要に応じて、そのルールイベントを追加のルール条件「ユーザーにはロールがあり、ロール=認証済み」と組み合わせると、ログインしたユーザーに対してのみルールアクションが実行されます。

ルールを使用して完了した目標を処理する

ユーザーが目標に固有のすべてのタスクを完了すると、目標は自動的に完了とマークされます。 しかし、それは本当に興味深い場所です:ユーザーが目標を達成したときにトリガーされる追加のルール(ルールイベント)を作成することもできます。これで、質問への答えは非常に簡単です。「...にルールアクションを実行して、目標を達成したユーザーにユーザーポイントを付与します "...これはあなたの質問が正確に何であるかです、いいえ?

より詳しい情報

Goals モジュールの詳細については、「 a Drupalサイトと賞のインセンティブにゲーミフィケーションを実装する方法 」への私の回答を参照してください。

注: Goals の使用には、一般的な管理タスク(構成)のみが必要ですが、カスタムモジュール開発(必要な場合)にもさまざまなフックが付属しています。

1
Pierre.Vriens

PHP Filterモジュールを有効にします。

2つのフィールドをユーザープロファイルに追加します(admin/config/people/accounts/fields):ログインカウント用(名前:cons_login_counts、タイプ:整数、デフォルト値:0、権限:カスタム(のみadmin))および最終ログイン日(名前: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
aroo