ノードタイトルとロゴ(cckフィールド)を表示するビューを作成しました。引数では、分類用語名を渡しました。
結果では、ノードは2回または3回表示されています。クエリ設定で個別のチェックボックスを既にチェックしましたが、それも機能しません。ランダムソートを使用しましたが、これにより重複が発生しているようです。ランダムソートを削除すると、正常に機能します。
ランダムソートを無効にせずに重複を回避するにはどうすればよいですか?
ノードタイトルとロゴ(cckフィールド)を表示するビューを作成しました。引数では、分類用語名を渡しました。
結果では、ノードは2回または3回表示されています。クエリ設定で個別のチェックボックスを既にチェックしましたが、それも機能しません。ランダムソートを使用しましたが、これにより重複が発生しているようです。ランダムソートを削除すると、正常に機能します。
ランダムソートを無効にせずに重複を回避するにはどうすればよいですか?
回答:
この質問には既に回答されていることは知っていますが、使用するためにこれらのソリューションが機能しない場合があります。しかし、いくつかの調査を行った後、自分のニーズに合ったソリューションを見つけました。
これを修正できる本当に便利な回避策を見つけました。コードスニペットをDropBucketに投稿しました。基本的に、groupby句とフィールドを指定するクエリコメントのすべてのビュークエリをチェックするDrupal 7クエリ変更フックを実装します。次に、そのgroupbyをSQLクエリに追加します。
/**
* Found this trick on theoleschool.com.
*
* Description: Allows the view developer to specify the query
* group by action in the query comments. Great way to force the
* removal of duplicates.
*
* Just go into your query comments and type in "groupby:" with
* that colon followed by the field you want to group by.
*
* Examples...
* groupby:node.nid
* groupby:file_managed_file_usage.fid
*
* Ref-Comment: http://theoleschool.com/comment/496#comment-496
* Ref-Article: http://theoleschool.com/blog/using-hookviewsalter-add-group-statement
*/
function mymodule_query_alter(QueryAlterableInterface $query) {
if ($query->hasTag('views')) {
static $count;
$view =& $query->getMetaData('view');
if (strstr($groupby = $view->query->options['query_comment'], 'groupby')) {
list($action, $field) = explode(':', $groupby);
if (strlen($field) > 0) {
$query->groupBy($field);
}
}
}
}
http://dropbucket.org/node/153
ソース参照はページのコメントにあります。
同じ問題がありました。最終的に、Views Distinctモジュールをインストールすることで解決しました。
ビューでのリレーションシップまたはその他の結合は、多くの場合「重複」結果を作成します。たとえば、複数の値を持つフィールドを持つノードは、複数値フィールドの値ごとに1回ビューに表示される場合があります。イライラさせられ、結果の行が技術的に異なるため、Views UIの "DISTINCT" SQLクエリオプションは実際に問題を解決しません。Views Distinctは、これらの「重複」行を削除または集約する簡単なGUIメソッドを提供することを目的としています。
複数値の日付フィールドに問題がありました。項目は、日付が入力されるたびに表示されました。ここで言及した他のソリューションはどれも私にとってはうまくいきませんでした。しかし、その後、私はまだそこにD7 で動作するD6ソリューションを見つけました。
hook_views_pre_render(&$view)
魔法の言葉です。例では、1つの特定のビューの1つの特定の表示のみに制限されています。それが役に立てば幸い。
function MYMODULE_views_pre_render(&$view) {
$used_nids = array();
if ($view->name == 'events') {
if ($view->current_display == 'page_2') {
foreach ($view->result as $row) {
if (!in_array($row->nid, $used_nids)) {
$new_view_result[] = $row;
$used_nids[] = $row->nid;
}
}
$view->result = $new_view_result;
}
}
}
編集:残念ながら、これは制限が設定されている場合、ビューから重複するアイテムの数を減算します。誰かがこの解決策を見つけたら、コメントしてください!
これらの他の方法はどれも役に立たなかったが、Views Random Seedモジュールが実際にそのトリックを行った。とはいえ、私の問題はポケットベルの使用に関連していました。そのモジュールのプロジェクトページからの引用は次のとおりです。
シード付きのランダムオーダーハンドラーを追加します。定数整数引数Nがsql RAND()関数で指定されている場合、それはシード値として使用され、列値の反復可能なシーケンスが生成されます。これにより、ページングが可能になり、アイテムが2回表示されなくなります。PHPを使用してカスタムシードを計算することもできます。これにより、日付などの変数に基づいて擬似乱数を作成できます。