今週初めに提起した質問 で述べたように、私は 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_relationship
がrequestee_id
である$current_user‑>uid
に行があり、requester_id
が$follower‑>uid
であるとします。ただし、行はありませんが、$current_user‑>uid
はrequester_id
であり、$follower‑>uid
はrequestee_id
です(これは、現在のユーザーがフォローバックして往復したことを示します)。したがって、上記の出力を見ると、ユーザーrid = 200726
の観点から、最初の行(190348
)のみが存在する状況になります。
これは私が急いでノックアップしたベン図で説明するのが少し簡単です:
;ここの私のビューは、C
というラベルの付いた領域です。
現在、私のビュー(現在 最新でないスクリーンショット があります)に、2つのコンテキストフィルターがあります。
ここまでは順調ですね。これを除いてall$current_user
をフォローしているユーザーだけでなく、$current_user
もフォローしていないユーザー— B ∪ C
。 C
のユーザーのみを表示する場合は、逆の行が存在しないことも確認する必要があります。新しいコンテキストフィルターを追加する場合、このようなものを確認するオプションはありません(これは、表示している個々の行のプロパティではないためです)。
どうすればこれを達成できますか?これが事実であり、サイトにカスタムモジュールがすでにある場合にユーザーを表示しないようにするために、いくつかのPHPを作成する必要があると思いますが、Drupalがわかりません私が探しているフックや、表示されている行の処理をどこでインターセプトするかを知るのに十分です。
助けてください? :o)
修正しました。
昨夜 Views PHP Module から、PHPフィルター基準(以前は気付かなかった!)を追加できることに気付きました。 =。これにより、任意のPHPを入力できるようになり、TRUE
を返すものはすべて取得され、結果セットから行を削除する必要があることがわかります。
そこで、SQLクエリ_Select * From user_relationships Where requester_id = :current_uid And requestee_id = :follower_uid
_をチェックするフィルター基準を追加し、そのクエリの結果がゼロを超える行になる場合は_return TRUE;
_を追加しました。
これを行うには、新しいフィールドを追加する必要がありました。どちらも「表示から除外」に設定されています。
$row->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
_という非常に役に立たない変数名を持っていることを意味します。これを回避する方法はまだ見つかりません。)
他のユーザーの利便性のために、私が使用しなかった他の提案には次のものがあります。
Count() < 1
チェックを探します。hook_views_query_alter
フックにアタッチします Better WHERE
s 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)
これがすべて誰かに役立つことを願っています!