web-dev-qa-db-ja.com

ユーザー関係を持つ複雑なビューのコンテキストフィルター—これをどのように実現しますか?

今週初めに提起した質問 で述べたように、私は ser Relationships を使用して、サイト上のユーザー間の単一方向の友情を築いています。

友だちのパラダイムはTwitterのようなもので、アリスがボブをフォローする場合があり、ボブもアリスをフォローしているとは限りません。そうは言っても、ボブはその後アリスをフォローすることを選択することができます。

データベーステーブルuser_relationshipsを見ると、この状況の結果、相互関係が2行になることがわかります。

mysql> select * from user_relationships where requester_id in (187767, 190348)
  and requestee_id in (187767, 190348);

+--------+--------------+--------------+------+----------+------------+------------+-------+
| rid    | requester_id | requestee_id | rtid | approved | created    | changed    | flags |
+--------+--------------+--------------+------+----------+------------+------------+-------+
| 200726 |       187767 |       190348 |    1 |        1 | 1331657565 | 1331657565 |     0 |
| 200723 |       190348 |       187767 |    1 |        1 | 1331656437 | 1331656437 |     0 |
+--------+--------------+--------------+------+----------+------------+------------+-------+
2 rows in set (0.00 sec)

ここでの議論を簡単にするために、特定のビュー、つまり「フォローしているがフォローしていないユーザー」のビューについて話しましょう。これらのユーザーの場合、user_relationshiprequestee_idである$current_user‑>uidに行があり、requester_id$follower‑>uidであるとします。ただし、行はありませんが、$current_user‑>uidrequester_idであり、$follower‑>uidrequestee_idです(これは、現在のユーザーがフォローバックして往復したことを示します)。したがって、上記の出力を見ると、ユーザーrid = 200726の観点から、最初の行(190348)のみが存在する状況になります。

これは私が急いでノックアップしたベン図で説明するのが少し簡単です:
Venn diagram
;ここの私のビューは、Cというラベルの付いた領域です。

現在、私のビュー(現在 最新でないスクリーンショット があります)に、2つのコンテキストフィルターがあります。

  • 「ユーザー関係:リクエスターユーザー」、「リクエスター」関係にバインドされ、除外に設定。そして
  • 「ユーザー関係:要求先ユーザー」、「要求先」関係にバインドnot Excludeに設定。

ここまでは順調ですね。これを除いてall$current_userをフォローしているユーザーだけでなく、$current_userもフォローしていないユーザー— B ∪ CCのユーザーのみを表示する場合は、逆の行が存在しないことも確認する必要があります。新しいコンテキストフィルターを追加する場合、このようなものを確認するオプションはありません(これは、表示している個々の行のプロパティではないためです)。

どうすればこれを達成できますか?これが事実であり、サイトにカスタムモジュールがすでにある場合にユーザーを表示しないようにするために、いくつかのPHPを作成する必要があると思いますが、Drupalがわかりません私が探しているフックや、表示されている行の処理をどこでインターセプトするかを知るのに十分です。

助けてください? :o)

3
Owen Blacker

修正しました。

昨夜 Views PHP Module から、PHPフィルター基準(以前は気付かなかった!)を追加できることに気付きました。 =。これにより、任意のPHPを入力できるようになり、TRUEを返すものはすべて取得され、結果セットから行を削除する必要があることがわかります。

そこで、SQLクエリ_Select * From user_relationships Where requester_id = :current_uid And requestee_id = :follower_uid_をチェックするフィルター基準を追加し、そのクエリの結果がゼロを超える行になる場合は_return TRUE;_を追加しました。

これを行うには、新しいフィールドを追加する必要がありました。どちらも「表示から除外」に設定されています。

  • ユーザー:(リクエスターにバインドされた)ユーザーID、「フォロワーUID(表示されない)」の管理タイトル。これは変数_$row->uid_として渡されます
  • ユーザー:ユーザーID(要求先にバインド)、「現在のUID(表示されない)」の管理タイトル。これは変数_$row->uid_1_として渡されます

次に、新しいPHPフィルター基準で、次のようにフィルターを作成しました。

_$filter_result = db_query('Select * From user_relationships '.
  'Where requester_id = :current_uid And requestee_id = :follower_uid',
    array(
        ':current_uid' => $row->uid_1,
        ':follower_uid' => $row->uid,
    ));

$count = $filter_result->rowCount();

return $count > 0;
_

その後、これらの余分な行は出力に表示されなくなります。

何らかの理由で、私はdo$filter_result->rowCount()を変数_$count_に割り当てる必要があります。 return $filter_result->rowCount() > 0;を直接試しても、何らかの理由で動作しませんでした。

しかし、問題は解決しました。ついに:o)


編集:フィールドバインディングを修正しました。2つの場所で異なる方法で実行していて、間違ったものを自分のここで答えてください。 「ユーザー関係」フィールドの「UR:要求者ユーザーID」および「UR:被要求者ユーザーID」はユーザーIDを出力しないため、このクエリでは機能しないことに注意してください。関係の両端にバインドされた2つの異なる「ユーザー:ユーザーID」フィールドを使用する必要があります。 (イライラして、これはPHPフィールドに渡されたときに_$row->uid_および_$row->uid_1_という非常に役に立たない変数名を持っていることを意味します。これを回避する方法はまだ見つかりません。)

4
Owen Blacker

他のユーザーの利便性のために、私が使用しなかった他の提案には次のものがあります。

  1. 「集計の使用」をオンにし、集計設定をいじって同じCount() < 1チェックを探します。
  2. hook_views_query_alterフックにアタッチします Better WHEREs for your Drupal forums with hook_views_query_alter の説明のように、次のようなものを使用して、モジュール内にいくつかの特注のロジックを記述できるようにします。

    function YOURMODULE_views_query_alter(&$view, &$query) {
        if ($view->name == 'YOURVIEW') {
            $view->query->add_where('advf_filter',
               "(node.type='%s' OR node_comment_statistics.comment_count >= %d)",
               'forum', 1);
            $view->query->set_group_operator('AND');
        }
    }
    

    #3686:ビューのクエリを変更して、ユーザーインターフェイスからORを使用するように変更します from enjoylife

Drupal.orgにもいくつかの Working with Viewsに関するドキュメント がありますが、情報が主に探していたものではないため、特に役立つものは見つかりませんでした。

また、modeule Advanced Help は、Views UI内で比較的基本的なコンテキストヘルプを提供しますが、my Drupal admin pages was私にそれを叫んでいる; o)

これがすべて誰かに役立つことを願っています!

3
Owen Blacker