たとえば、ユーザーが5日間続けてログインしたかどうかを知る必要があります。その理由は ユーザーポイント を与えたいからです。
例えば:
Rules でこれを実行しようとしていますが、無残に失敗しました。何か案は?
注:ルール条件を使用して、my_last_loginの値を-1日のオフセットで今日の日付と比較しようとしていますが、常にFalseを返します。
実際、これは私が今構築しようとしているものです。 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()
のようになります。あるいは、モジュールを作成したくない場合は、上記のコードをルールに追加できると思います。ただし、どちらの場合も、ユーザーがブラウザにログインしたままにすると、コードは実行されません。
この場合、コアの統計モジュールが機能します。
Rules モジュールを使用してこの課題を解決することは、確かにソリューションの一部です。しかし、課題の重要な部分は、次のようなルールイベント(=ユーザーがログインを実行する)に対してルールアクションをトリガーすることです。
ルール は素晴らしい(実際には驚くべき)ですが、上記の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 を使用するためのより高度な方法のいくつかを使用します。つまり、この特定のタスクにこれらのオプションの構成オプションを使用します。
このタスクを完了するために1人のユーザーが行った進行状況を追跡するには、 Rules モジュールを使用して適切なルールを記述し、完了に関連するサイトで発生する関連イベントを記録するだけですtaskの目標。
上記の目標/タスクの場合、次のような1つの(非常に基本的な)ルールのみが必要です。
注:ユーザーがブラウザをログインしたままにした場合、このルールイベントの使用は最適なイベントではない可能性があります。そのイベントを「Drupal is Initializing」(「System」内)に置き換えると、ユーザーがアクセスするすべてのパスに対してそのようなルールがトリガーされます。必要に応じて、そのルールイベントを追加のルール条件「ユーザーにはロールがあり、ロール=認証済み」と組み合わせると、ログインしたユーザーに対してのみルールアクションが実行されます。
ユーザーが目標に固有のすべてのタスクを完了すると、目標は自動的に完了とマークされます。 しかし、それは本当に興味深い場所です:ユーザーが目標を達成したときにトリガーされる追加のルール(ルールイベント)を作成することもできます。これで、質問への答えは非常に簡単です。「...にルールアクションを実行して、目標を達成したユーザーにユーザーポイントを付与します "...これはあなたの質問が正確に何であるかです、いいえ?
Goals モジュールの詳細については、「 a Drupalサイトと賞のインセンティブにゲーミフィケーションを実装する方法 」への私の回答を参照してください。
注: Goals の使用には、一般的な管理タスク(構成)のみが必要ですが、カスタムモジュール開発(必要な場合)にもさまざまなフックが付属しています。
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();