ソート可能なテーブル:2次ソート


7

ソート可能なテーブルとして表示されているビュー(Drupal 6 /ビュー2ですが、他のバージョンにも当てはまると思います)があります。すべてのビューと同じように固定の並べ替え条件を追加できますが、訪問者が特定のテーブルでテーブルを並べ替えると、それらの並べ替え条件は無視されます。

スタイルオプションには、「クリックソートが使用されている場合は通常のソートを上書きする」というボックスがありますが、これは私には意味がありません。クリックソートを効果的に無効にし、エンドユーザーにクリック可能なテーブルヘッダーを残しているようです。

固定されたソート基準を維持し、それらを二次基準として使用する方法はありますか?

回答:


3

ビューで指定した最初の並べ替えは、最初のページビューでのみ使用されます。ヘッダーをクリックしてソートを変更すると、代わりにdrupalテーブルのソートルーチンを使用するようにクエリが変更されます。残念ながら、組み込みのテーブルソートコードでは、複数列のソートを許可するサポートはなく、列の昇順ではなく降順のデフォルトを定義する機能もありません。テーブルがすべての結果を表示している場合の代替策は、HTMLでテーブルのソートを実行し、ビューの列でソートを提供しないJavaScriptを追加することです。"javascript table sort"をgoogle.comで検索すると多くの結果が得られますが、これは非常に堅牢であるように見えます:http : //tablesorter.com/docs/


おかげで、まだJavaScriptベースのソリューションを検討していませんでした。私はこれをphp / sqlで行うのが望ましいのですが、見てみましょう。
marcvangend 2011年

他の唯一の簡単な解決策は、ビューでソート基準を作成し、ユーザーがソートできるようにする基準を公開することです。テーブルヘッダーの並べ替えの問題は引き続き存在しますが、少なくとも公開された並べ替えでは、複数の並べ替えオプションを選択できます。この場合、ビューは定義された順序で公開されたソートに従う必要があります。
codexmas

1
そしてTablesorter付きビューの統合があります:drupal.org/project/views_tablesorter
keva


3

他の人が以前言ったように

組み込みのテーブルソートコードでは、複数列のソートをサポートしておらず、列の昇順ではなく降順のデフォルトを定義することもできません。

ただし、Tablesorterを使用した次のアプローチを確認する必要があります。

D7の場合:

1.Tablesorter モジュールをダウンロードして有効にします

2.Tablesorter jQuery Pluginをダウンロードして解凍しますsites/all/libraries/tablesorter

3. CSSクラスtablesorterと一意のIDをtemplate.phpのビューテーブルに追加します。

/**
 * Preprocess variables for Views tables.
 */
function YOUR_THEME_preprocess_views_view_table(&$vars) {
  $view = $vars['view'];
  $vars['classes_array'][] = 'tablesorter';
  $vars['attributes_array']['id'] = $view->name . '-' . $view->current_display;
}

4.キャッシュを数回クリアします。これで、Tablesorterはすでに機能し始めているはずです。スタイルが変更されたときに表示されます。

5. 2次ソートの場合、小さなカスタムJavaScriptを追加する必要があります。template.php:

/**
 * Override or insert variables for the page templates.
 */
function YOUR_THEME_preprocess_page(&$vars) {
    // you might define some conditions around here
    drupal_add_js(drupal_get_path('theme', 'YOUR_THEME') . '/scripts/custom_tablesort.js');
}

そのスクリプトで、次のように記述して、特定のテーブルの最初の6つの列をアルファベットの昇順でソートするようにTablesorterに指示します。Tablesorterに2番目と3番目の列のみを昇順でソートするようsortList: [[1,0], [2,0]]に指示するには、代わりに書き込みます。

(function ($) {
  Drupal.behaviors.tableSorting = {
    attach: function (context, settings) {

      $("#your_view_name-display_name").tablesorter({
        sortList: [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0]]
      });

    }
  }
}) (jQuery);

Tablesorterにすべてのテーブルを2次ソートさせたい場合は、前処理時にCSS IDを定義する必要はなく、単にTablesorterに伝えます。 $("table").tablesorter({ sortList: [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0]] });

少しテストした後、カスタムのTablesorterオプションをすべて残して(ステップ4で終了)、shift複数のヘッダーをクリックしたまま、希望するすべての列で二次ソートが機能することをユーザーに説明します。


1
おかげで、私はこれが再び必要になった場合は必ずこれを試します。
marcvangend 2014

2

テーブル設定から「デフォルトの並べ替え」を削除し、最初と2番目の順序に「並べ替え基準」を使用します


1

私が得た質問から、ビューにテーブルソーター関数が必要だということです。その場合は、次の手順に従ってください。

  1. 列の並べ替えを追加するビューを編集します。
  2. [基本設定]で[スタイル:テーブル]を探し、その横にある歯車の画像をクリックします。
  3. 下にスクロールして、テーブル設定を確認します。
  4. フィールドのリストと、ラベル付けされた「ソート可能」ごとのチェックボックスがあります。ユーザーが並べ替え順序を変更できるようにする列のボックスにチェックマークを付けます。

ありがとう、でもそれは私が探しているものではありません。デフォルトのテーブルソートの仕組みを知っています。必要なのは、ユーザーがテーブルヘッダーをクリックしたときに2番目の並べ替え順序になるデフォルトの並べ替えオプションです。たとえば、テーブルはデフォルトでアルファベット順にソートされますが、ユーザーが著者の列をクリックすると、テーブルは最初に著者別にソートされますが、同じ著者の行はアルファベット順にソートされます。
marcvangend

1

(D8)

たくさんのデバッグの後、私は同様のD7アプローチD7 hook_views_query_alterに終わりました

つまり、テーブルスタイルプラグインのclickSortメソッドのトリガーを使用することになります。

  • モジュールにmultisortという名前のサブフォルダーを作成します。
  • 上記で作成したフォルダーにmultisort.moduleとして以下のコードを保護します。

<?php

use Drupal\views\Plugin\views\query\QueryPluginBase;
use Drupal\views\ViewExecutable;

/**
 * Implements hook_views_query_alter().
 */
function multisort_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {

  $views_to_alter = [
    // view name
    'sort_test' => [
      [
        'table' => 'node__field_col_a',
        'field' => 'field_col_a',
        'column' => 'field_col_a_value',
        'order' => 'desc',
      ],
    ]
  ];

  if (isset($views_to_alter[$view->id()])) {
    //dpm($query->orderby, 'by config or url');

    $fields_used = [];
    foreach($query->orderby as $field) {
      $fields_used[$field['field']] = 1;
    }

    $fields = $views_to_alter[$view->id()];

    foreach($fields as $field) {
      // Skip fields already clicked
      if (isset($fields_used[$field])) {
        continue;
      }

      $alias = $field['table'] . '.' . $field['column'];
      if (isset($fields_used[$alias])) {
        continue;
      }

      // @see \Drupal\views\Plugin\views\style\Table::buildSortPost
      $view->field[$field['field']]->clickSort($field['order']);
    }

    //dpm($query->orderby, 'altered');

  }
}
  • 以下のテキストをmultisort.info.ymlに保存します

name: Multisort
type: module
description: Sort on more then one field
core: 8.x
package: Views


0

これは、D7 / Views 3での私のソリューションです。まだ存在しない場合は、クエリに最後のorder_by句を追加します。私のように静的に実行したくない場合は、$ viewパラメーターを見て、そこから列ごとの順序を追加できると思います。

function MODULENAME_views_query_alter(&$view, &$query) {
  if ($view->name == 'the_name_of_the_view_to_alter') {
    //First check that we don't already sort by the "the_field_alias" column
    if(array_search('the_field_alias', array_column($query->orderby, 'field')) === FALSE) {
      //Add the "the_field_alias" column last in the orderby array
      $query->orderby[] = [
        'field' => 'the_field_alias',
        'direction' => 'ASC',
      ];
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.