it-swarm-eu.dev

Tříditelná tabulka: sekundární řazení

Mám pohled (Drupal 6/Views 2, ale myslím, že se to může vztahovat i na jiné verze) zobrazený jako tabulka bez tabulky. Mohu přidat pevná kritéria třídění, jak je to možné u všech pohledů, ale jakmile je tabulka seřazena návštěvníkem v určité tabulce, jsou tato kritéria řazení ignorována.

Ve volbách stylu je pole s názvem „Přepsat normální třídění, pokud se používá třídění kliknutí“, což pro mě nedává smysl. Zdá se, že efektivně deaktivuje třídění kliknutí, takže koncový uživatel nechává záhlaví tabulek, na které lze kliknout, ale nefunguje.

Existuje způsob, jak zachovat pevná kritéria třídění a použít je jako sekundární kritéria?

7
marcvangend

Jak již uvedli ostatní

ve vestavěném kódu řazení tabulky není podporována možnost řazení více sloupců ani schopnost definovat výchozí nastavení sestupu namísto vzestupného sloupce

Ale měli byste se podívat na následující přístup s Tablesorterem.

Pro D7:

1.Stáhněte si a povolte Tablesorter Module

2. Stáhněte a rozbalte Tablesorter jQuery Plugin do sites/all/libraries/tablesorter

3.Přidejte třídu CSS tablesorter a jedinečné ID do tabulek Pohledů v 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. Několikrát vyčistěte mezipaměť. Tablesorter by nyní měl začít fungovat. Uvidíte to, když se změní styl.

5.Pro sekundární řazení musíte přidat malý vlastní JavaScript. V 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.V tomto skriptu napište následující a řekněte Tablesorterovi, aby seřadil prvních šest sloupců určitých tabulek ve vzestupném abecedním pořadí. Chcete-li sdělit Tablesorterovi, aby třídil pouze druhý a třetí sloupec ve vzestupném pořadí, napište místo toho 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);

Pokud chcete nechat Tablesorter sekundárně třídit všechny tabulky, nemusíte při předzpracování definovat ID CSS a jednoduše Tablesorteru řekněte: $("table").tablesorter({ sortList: [[0,0],[1,0],[2,0],[3,0],[4,0],[5,0]] });

Po malém testování bych řekl, že necháte nějakou vlastní možnost tabulky (ukončete krokem 4) a jednoduše vysvětlete svým uživatelům, že zatímco držíte shift Když kliknete na více záhlaví, sekundární řazení funguje v každém požadovaném sloupci.

3
leymannx

Počáteční řazení, které jste zadali v zobrazeních, se použije pouze v zobrazení první stránky. Když kliknete na záhlaví a změníte řazení, dotaz se změní tak, aby místo toho používal rutiny třídění drupal tabulka tříd. Bohužel v zabudovaném kódu řazení tabulky neexistuje podpora, která by umožňovala vícenásobné řazení sloupců, ani schopnost definovat výchozí klesání namísto vzestupného sloupce. Alternativou, pokud vaše tabulka zobrazuje všechny výsledky, je přidat nějaký Javascript, který provádí třídění tabulek v HTML a neposkytuje třídění ve sloupcích v zobrazeních. pro "třídění tabulek javascript" dá mnoho výsledků, vypadá to docela robustně: http://tablesorter.com/docs/

3
codexmas

Odeberte "Výchozí řazení" z nastavení tabulky a použijte "Kritéria řazení" pro první a druhé pořadí

2
Freeman

Z otázky, co dostanu, je to, že chcete funkci třídění tabulek v Zobrazení; pokud tomu tak je, můžete postupovat podle následujících kroků:

  1. Upravte pohled, do kterého chcete přidat třídění sloupců.
  2. V části „Základní nastavení“ vyhledejte „Styl: Tabulka“ a klikněte na obrázek ozubeného kola vedle ní.
  3. Chcete-li zobrazit nastavení tabulky, přejděte dolů.
  4. K dispozici je seznam polí a zaškrtávací políčko u každého označeného „hotely“; Zaškrtněte políčka u všech sloupců, ve kterých chcete, aby uživatelé mohli změnit pořadí řazení.
1

(D8)

Po spoustě ladění jsem skončil s podobným D7 přístupem D7 hook_views_query_alter

To se scvrkává na použití spouštění stylu tabulky pluginy clickSort .

  • Vytvořte podadresář s názvem vícesměrný v modulech.
  • Zabezpečte níže uvedený kód jako multisort.module do výše vytvořené složky.

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

  }
}

  • Uložte text níže do multisort.info.yml

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

1
Clemens Tolboom

Toto je moje řešení v D7/Views 3. Přidá poslední klauzuli order_by do dotazu, pokud již není přítomen. Věřím, že byste se mohli podívat na parametr $ view a odtud přidat pořadí podle sloupců, pokud to nechcete dělat staticky jako já.

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',
      ];
    }
  }
}
0
Johan

Upravte pohledy a přejděte do Nastavení tabulky, kde uvidíte zaškrtávací políčko třídění ... můžete zaškrtnout a použít.