web-dev-qa-db-ja.com

ルールのユーザーフラグを更新するにはどうすればよいですか?

ユーザーフラグVisitsを使用して、他のユーザーのプロファイルへの各ユーザーのアクセスを追跡しています。

ユーザーが別のユーザーのプロファイルにアクセスすると、訪問したユーザーに代わって、訪問したユーザーに自動的にフラグを立てるルールがトリガーされます。

最初の訪問時にユーザーにフラグを立てることは問題ありません。しかし2回目以降の訪問では、1回目の訪問でフラグが付けられたフラグを更新します。これを行うために、次のルールを作成しました。

  • イベント:ユーザーアカウントページが表示されます
  • 条件1:NOT [account] is [site:current-user]
  • 条件2:ユーザーにフラグが付けられている([account]の代わりに[site:current-user]
  • アクション-> フラグを取得して更新するにはどうすればよいですか?

このルールは正しくトリガーされます。ただし、更新するために以前のフラグ(ユーザーが初めてプロファイルにアクセスしたときに適用されるフラグ)を取得する方法がわかりません。

私の質問:タイムスタンプを更新して再保存できるように、ルールで以前に適用されたフラグをフェッチするにはどうすればよいですか?

私が試したもの

フラグはルールアクションを提供しますユーザーによってフラグが付けられたユーザーの取得ですが、これはユーザーの配列を返し、フラグを付けるのではなく、ユーザーの配列を返すため、これは私が更新したいものです。

ノードのフラグを解除するアクションを追加してからノードのフラグを設定するアクションを追加できますが、これにより以前のフラグが破棄され、新しいフラグに置き換えられます。時間をかけてリファラー情報を追跡したいので、これは良い解決策ではありません。

フラグがエンティティであるFlag 3.xを使用しているため、ルールでFetch entity by propertyアクションを使用してflaggingですが、この場合、私が選択できる唯一のプロパティはRefererフィールドの値です。これは役に立ちません。エンドポイントでフラグをフェッチする方法がないようです。

なぜ私はこれをしているのですか

このフラグには計算フィールドRefererがあり、フラグを設定すると$_SERVER['HTTP_REFERER']の値が格納されます。

ユーザーが2回目にユーザーのプロファイルにアクセスしたときに、フラグのタイムスタンプを更新し、新しいリファラー情報をフラグに追加して、このフラグを更新します。

4
Patrick Kenny

私の質問:タイムスタンプを更新して再保存できるように、ルールで以前に適用されたフラグをフェッチするにはどうすればよいですか?

良いニュースもあるが、ほとんどは悪い。

フラグにテキストフィールドを追加し、フラグの作成時にデータ値を[flagged_uid]-[flagger_uid]に設定するルールを追加すると、フラグが作成されますようです次に、そのフィールドをプロパティとして使用し、[account_uid]-[current-user_uid]としてフラグを取得できます。

私はseemsと言います。なぜなら、ルールはエラーなしで実行され、ロジックが正しいことはわかっているのですが、フェッチされたフラグに対して、私が証明するために何もできないためです。実際にそれをフェッチしました。 「ルールにはフラグの削除に関する情報がない」ため削除してもエラーが発生し、保存してもタイムスタンプは変更されません。

完全に統合されていないように感じます。日付フィールドを追加した場合でも、ユーザービューでルールがそのフィールドにアクセスできるかどうかはわかりません。


私はカスタムルールアクションを作成してルールを完了するか、本格的な Field Collections ソリューションを使用すると思います。

2
Niall Murphy

フラグエンティティ(数値フィールド)にカウントフィールドを追加できます。ユーザーがプロファイルにアクセスするたびにフラグを取得し、カウントフィールドに+1します。

残念ながら、ルールUIを介してこのフラグを取得する方法に答えることはできません。

カスタムルール(コード内)またはユーザービューフック(hook_user_view)を作成できます。このフック内で、フラグをロードしてカウント値を更新します。

以下のコードはアイデアの例です。私自身は試していません。機能しない場合は、別のフラグの読み込みと保存の方法を試してください。 (他に良い方法が見つからない場合は、データベースクエリを使用してフラグを読み込み、更新することもできます)。

HOOK_user_view($account, $view_mode, $langcode){
  if ($view_mode == 'profile') {

    // Get user id's
    global $user;
    $viewing_uid = $user->uid;
    $viewed_uid = $account->uid;

    // If we are not viewing our own profile
    if ($viewing_uid != $viewed_uid) {

      // Load the flag contents // Remember to check entity name, and field names
      $flag_entity = entity_load('user_flag', FALSE, array('uid' => $viewing_uid, 'content_id' => $viewed_uid));

      // Update the count
      $flag_entity->count = $flag_entity->count + 1;

      // re-save the entity
      $return = entity_save('user_flag', $flag_entity);
    }
  }
}

補足として:ページ/プロファイルビューでフラグの内容を表示する際に問題が発生した場合は、ロード/ビューフックを使用して、表示内容を上書きすることもできます。ただし、エンティティとして、フィールドはエンティティビューモードまたはビューを介して使用できる必要があります。

これがお役に立てば幸いです。

1
Seb