Sortierbare Tabelle: sekundäre Sortierung


7

Ich habe eine Ansicht (Drupal 6 / Ansichten 2, aber ich denke, dies kann auch für andere Versionen gelten) als sortierbare Tabelle angezeigt. Ich kann wie bei allen Ansichten feste Sortierkriterien hinzufügen, aber sobald die Tabelle vom Besucher in einer bestimmten Tabelle sortiert ist, werden diese Sortierkriterien ignoriert.

In den Stiloptionen befindet sich ein Feld mit dem Namen "Normale Sortierung überschreiben, wenn Klicksortierung verwendet wird", was für mich keinen Sinn ergibt. Es scheint die Klicksortierung effektiv zu deaktivieren und dem Endbenutzer einen anklickbaren, aber nicht funktionierenden Tabellenkopf zu hinterlassen.

Gibt es eine Möglichkeit, die festen Sortierkriterien beizubehalten und als sekundäre Kriterien zu verwenden?

Antworten:


3

Die anfängliche Sortierung, die Sie in Ansichten angegeben haben, wird nur in der ersten Seitenansicht verwendet. Wenn Sie auf die Kopfzeile klicken, um die Sortierung zu ändern, wird die Abfrage geändert, um stattdessen die Sortierroutinen für Drupal-Tabellen zu verwenden. Leider gibt es im integrierten Tabellensortiercode keine Unterstützung für das Sortieren mehrerer Spalten und auch nicht die Möglichkeit, einen Standardwert für absteigende statt aufsteigende Spalten zu definieren. Eine Alternative, wenn in Ihrer Tabelle alle Ergebnisse angezeigt werden, besteht darin, Javascript hinzuzufügen, das Tabellensortierungen im HTML-Code ausführt und keine Sortierung in den Spalten in Ansichten bereitstellt. Eine google.com-Suche nach "Javascript-Tabellensortierung" liefert viele Ergebnisse. Diese scheint ziemlich robust zu sein: http://tablesorter.com/docs/


Vielen Dank, ich hatte noch keine Javascript-basierte Lösung in Betracht gezogen. Ich würde das lieber mit PHP / SQL machen, aber ich werde einen Blick darauf werfen.
Marcvangend

Die einzige andere einfache Lösung besteht darin, Sortierkriterien in Ansichten zu erstellen und dann diejenigen bereitzustellen, nach denen die Benutzer sortieren können sollen. Das Problem mit der Sortierung der Tabellenkopfzeilen besteht weiterhin, aber zumindest bei den exponierten Sortierungen können mehrere Sortieroptionen ausgewählt werden. In diesem Fall sollten Ansichten den exponierten Sortierungen in der Reihenfolge folgen, in der sie definiert sind.
Codexmas

1
und es gibt eine Views-Integration mit Tablesorter: drupal.org/project/views_tablesorter
keva


3

Wie andere schon sagten

Der integrierte Tabellensortiercode unterstützt weder das Sortieren mehrerer Spalten noch die Möglichkeit, einen Standardwert für absteigende statt aufsteigende Spalten zu definieren

Sie sollten sich jedoch den folgenden Ansatz mit Tablesorter ansehen.

Für D7:

1.Download und aktivieren Sie das Tablesorter-Modul

2.Downloaden und extrahieren Sie das Tablesorter jQuery Plugin insites/all/libraries/tablesorter

3. Fügen Sie tablesorterIhren Views-Tabellen in template.php eine CSS-Klasse und eine eindeutige ID hinzu

/**
 * 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. Löschen Sie den Cache einige Male. Jetzt sollte Tablesorter bereits anfangen zu arbeiten. Sie werden es sehen, wenn sich das Styling geändert hat.

5.Für die sekundäre Sortierung müssen Sie ein kleines benutzerdefiniertes JavaScript hinzufügen. In 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. Schreiben Sie in dieses Skript Folgendes, um Tablesorter anzuweisen, die ersten sechs Spalten bestimmter Tabellen in aufsteigender alphabetischer Reihenfolge zu sortieren. Um Tablesorter anzuweisen, nur die zweite und dritte Spalte in aufsteigender Reihenfolge zu sortieren, schreiben Sie sortList: [[1,0], [2,0]]stattdessen.

(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);

Wenn Sie Tablesorter alle Ihre Tabellen sekundär sortieren lassen möchten, müssen Sie bei der Vorverarbeitung keine CSS-ID definieren und Tablesorter einfach mitteilen: $("table").tablesorter({ sortList: [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0]] });

Nach ein wenig Test würde ich sagen, dass Sie jede benutzerdefinierte Tablesorter-Option weglassen (beenden Sie mit Schritt 4) und Ihren Benutzern einfach erklären, dass die shiftsekundäre Sortierung für jede gewünschte Spalte funktioniert , während Sie beim Klicken auf mehrere Überschriften gedrückt halten .


1
Danke, ich werde es auf jeden Fall versuchen, wenn ich es jemals wieder brauche.
Marcvangend

2

Entfernen Sie die "Standardsortierung" aus den Tabelleneinstellungen und verwenden Sie die "Sortierkriterien" für die erste und zweite Reihenfolge


1

Aus der Frage, die ich bekomme, geht hervor, dass Sie eine Tabellensortierfunktion in Ansichten wünschen. In diesem Fall können Sie die folgenden Schritte ausführen:

  1. Bearbeiten Sie die Ansicht, zu der Sie die Spaltensortierung hinzufügen möchten.
  2. Suchen Sie unter "Grundeinstellungen" nach "Stil: Tabelle" und klicken Sie auf das Bild eines Zahnrads daneben.
  3. Scrollen Sie nach unten, um die Tabelleneinstellungen anzuzeigen.
  4. Es gibt eine Liste der Felder und ein Kontrollkästchen für jedes Feld mit der Bezeichnung "sortierbar". Aktivieren Sie die Kontrollkästchen für alle Spalten, in denen Benutzer die Sortierreihenfolge ändern können.

Danke, aber das ist nicht das, wonach ich suche. Ich weiß, wie die Standardtabellensortierung funktioniert. Was ich möchte, ist eine Standardsortieroption, die zur sekundären Sortierreihenfolge wird, wenn der Benutzer auf eine Tabellenüberschrift klickt. Beispielsweise ist eine Tabelle standardmäßig alphabetisch sortiert. Wenn ein Benutzer jedoch auf die Autorenspalte klickt, wird die Tabelle zuerst nach Autor sortiert, während Zeilen mit demselben Autor weiterhin alphabetisch sortiert werden.
Marcvangend

1

(D8)

Nach vielem Debuggen kam ich zu einem ähnlichen D7-Ansatz D7 hook_views_query_alter

Es läuft darauf hinaus , die ClickSort- Methode der Plugins für Tabellenstile auszulösen .

  • Erstellen Sie in Modulen einen Unterordner mit dem Namen multisort .
  • Sichern Sie den folgenden Code als multisort.module in dem oben erstellten Ordner.

<?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');

  }
}
  • Speichern Sie den folgenden Text in multisort.info.yml

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

0

Bearbeiten Sie die Ansichten und gehen Sie zu den Tabelleneinstellungen. Dort sehen Sie das Kontrollkästchen Sortieren. Sie können es aktivieren und anwenden.


0

Dies ist meine Lösung in D7 / Views 3. Sie fügt der Abfrage eine letzte order_by-Klausel hinzu, falls diese noch nicht vorhanden ist. Ich glaube, Sie könnten sich den Parameter $ view ansehen und die Reihenfolge nach Spalten von dort aus hinzufügen, wenn Sie dies nicht statisch wie ich tun möchten.

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',
      ];
    }
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.