回答:
最後に、カスタムORDER SQLを書き込むために、Views Sortハンドラーを備えたカスタムモジュールを作成しました。
function custom_module_views_query_alter(&$view, &$query) {
if($view->name === 'viewname') {
/**
* Order = (rating * 10) – (hours old / 2)
* Note: the rating field is divided by 2 because in the DB the rating is out of 100
*/
$view->query->orderby[0]['field'] = "(if(field_data_field_rating.field_rating_rating, field_data_field_rating.field_rating_rating,0) / 2) - ROUND((UNIX_TIMESTAMP(NOW())-created)/60/60/2)";
$view->query->orderby[0]['direction'] = "DESC";
$view->query->orderby[1]['field'] = "created";
$view->query->orderby[1]['direction'] = "DESC";
}
}
これを機能させるには、このモジュールにSQL JOINSを追加するか、レーティングおよび投稿日フィールドをビューの「ソート」として追加する必要があります。
この件では、Views PHPモジュールを使用します。
このモジュールにより、管理者アカウント(ユーザー1)は、PHPコードを使用するビューにフィールド、フィルター、ソートを追加できます。
return (($rating * 10) - $age);
(折りたたまれた使用可能な変数のセクションも参照してください)。<?php print $value; ?>
if ($row1->php < $row2->php) return -1; else return 1;
Global:PHP
フィールドを使用する場合、現在のページのみをソートできます。ただし、ページャーがあり、その式で並べ替える選択クエリが必要な場合はhook_views_query_alter
、カスタムフィールドを実装して追加する必要があります。
まず、ビューのFIELDSセクションで式にこれらのフィールドを追加し、次に次のようにフックを追加する必要があります。
function MODULE_NAME_views_query_alter(&$view, &$query){
if($view->name == 'name' && $view->current_display == 'page'){
$query->add_field(NULL, 'TABLENAME.rating * 10 - TABLENAME.age', 'sort_field');
$query->orderby = array(
array(
'field' => 'sort_field',
'direction' => 'DESC',
),
);
}
}
ドキュメントのadd_field で詳細を探してくださいviews_plugin_query_default
ソート値((rating * 10)-時間での経過時間)を持つフィールドを使用しても、そのフィールド値を継続的に更新しない限り機能しません(時間の経過とともに変化するため)。
おそらく、独自のViews Sortハンドラーを作成する必要があります。ビューの並べ替えハンドラーを使用すると、SQLで並べ替え順序を設定できます。
SQLでは次のものが必要です。
ソートハンドラを作成したことはありませんが、問題を解決できると思います。
独自のソートハンドラーを使用するcontribモジュールを確認してください。