カスタムソートを表示します


8

ビューでアイテムのカスタムソートを作成するにはどうすればよいですか?たとえば、次の方法でコンテンツを注文します(rating * 10) - age in hours。(評価は5つ星のモジュールのパーセンテージです。)

私は計算フィールドモジュールとビューAPI を見てきましたが、必要なものが見つかりません。

回答:


8

最後に、カスタム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を追加するか、レーティングおよび投稿日フィールドをビューの「ソート」として追加する必要があります。


3

この件では、Views PHPモジュールを使用します。

このモジュールにより、管理者アカウント(ユーザー1)は、PHPコードを使用するビューにフィールド、フィルター、ソートを追加できます。

  • モジュールをインストールして有効にします(ビューと一緒に)
  • ビューに必要なフィールドをすべて追加し、表示から除外します
  • 目的の結果を計算するために必要なコードを指定する新しいGlobal:PHPフィールドを追加します。
  • 値コードに次を追加しますreturn (($rating * 10) - $age);(折りたたまれた使用可能な変数のセクションも参照してください)。
  • 出力コードに次を追加します。 <?php print $value; ?>
  • 新しいGlobal:PHPソートフィールドを追加します。if ($row1->php < $row2->php) return -1; else return 1;

評価はfivestarモジュールによって提供されていますが、$ row-> ratingを使用して評価にアクセスするには、ノードの評価ではなくノードIDのみを返しますか?
オーウェン

ファイブスターのモジュールがわかりません。評価がエンティティ(ノードなど)に関連付けられている適切なフィールドである場合は、ビューに評価を追加できます。
Wtower 2014年

7
ビューPHPを使用しないでください!保守性のために実際のカスタムビューコードを使用します。
digitgopher '27年

0

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


0

ソート値((rating * 10)-時間での経過時間)を持つフィールドを使用しても、そのフィールド値を継続的に更新しない限り機能しません(時間の経過とともに変化するため)。

おそらく、独自のViews Sortハンドラーを作成する必要があります。ビューの並べ替えハンドラーを使用すると、SQLで並べ替え順序を設定できます。

SQLでは次のものが必要です。

  • ソート値を含む計算列:(評価* 10)-時間での経過時間
  • その列を使用したORDER BY文。

ソートハンドラを作成したことはありませんが、問題を解決できると思います。

独自のソートハンドラーを使用するcontribモジュールを確認してください。


返事をありがとう、ビューごとのソートハンドラーを調べてみます。各クエリでComputed_Fieldがリアルタイムで更新されていないように見え、サーバーの負荷が少し高くなる可能性があるためです。
オーウェン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.