it-swarm.com.de

Tablesort mit EntityQuery

In einem Block-Plugin erstelle ich eine Tabelle (in Drupal8). Wie so

            $header = [
                t('Name'),
                t('Number'),
                t('Rank'),
            ];
            $nids = \Drupal::entityQuery('node')
                ->extend('Drupal\Core\Database\Query\TableSortExtender')
                ->orderByHeader($header)
                ->condition('type', 'my_content_type')
                ->condition('status', 1)
                ->pager(5)
                ->execute();
            foreach ($nids as $nid) {
                $node            = \Drupal\node\Entity\NODE::load($nid);
                $row = [
                    'data' => [
                        $node->title->value,
                        $node->field_number->value,
                        $node->field_rank->value,
                    ],
                ];
                $rows[] = $row;
              }
            $render = [
                'table'           => [
                    '#prefix'        => '<h1>Entries</h1>',
                    '#theme'         => 'table',
                    '#attributes'    => [
                        'data-striping' => 0
                    ],
                    '#header' => $header,
                    '#rows'   => $rows,
                ],
            ];
            return $render;

Ohne den folgenden Code

 ->extend('Drupal\Core\Database\Query\TableSortExtender')
 ->orderByHeader($header)

die Tabelle wird gut gerendert, aber wenn ich sie einbinde, erhalte ich den Fehler

Aufruf der undefinierten Methode Drupal\Core\Entity\Query\Sql\Query :: extens ()

Ich vermute, dass es -> verlängern nicht für EntityQueries funktioniert, aber wenn dies der Fall ist, wie kann ich meiner Tabelle eine Tabellensortierung hinzufügen?

UPDATE: Ich habe mein $ header-Array so geändert, dass es 'field' enthält

            $header = [
                [
                    'data'  => t('Title'),
                    'field' => 'title'
                ],
                [
                    'data'  => t('Race'),
                    'field' => 'field_number'
                ],
                [
                    'data'  => t('Time'),
                    'field' => 'field_rank',
                ],
            ];

und versuchte hinzuzufügen

 ->tableSort($header)

auf die Abfrage und entfernen verlängern und orderByHeader aus der Abfrage, aber dann erhalte ich den folgenden Fehler

Drupal\Core\Entity\Query\QueryException: '' nicht in Drupal\Core\Entity\Query\Sql\Tables-> sureEntityTable () gefunden

UPDATE 2: Ich habe versucht, das $ header-Array so zu ändern, dass ein Bezeichner und eine Typ-Eigenschaft wie diese verwendet werden.

                    'data'      => t('Name'),
                    'type'      => 'field',
                    'specifier' => [
                        'field'    => 'title',
                        'column'   => 'value',
                    ],

Aber am Ende habe ich den gleichen Fehler und erhalte einen zusätzlichen Fehler

Undefinierter Index: Bezeichner in Drupal\Core\Entity\Query\QueryBase-> tableSort ()

7
Matt

Nach einigen Informationen in Berdirs Antwort und Kommentaren konnte ich eine Lösung finden.

Ich habe meinen Header so formatiert:

            $header = [
                'title'      => [
                    'data'      => t('title'),
                    'field'     => 'title',
                    'specifier' => 'title',
                ],
                'number'       => [
                    'data'      => t('Number'),
                    'field'     => 'field_number',
                    'specifier' => 'field_number',
                ],
                'time'       => [
                    'data'      => t('Time'),
                    'field'     => 'field_rank',
                    'specifier' => 'field_rank',
                ],
            ],

Ich habe dann die EntityQuery so ausgeführt

            $nids = \Drupal::entityQuery('node')
                ->tableSort($header)
                ->condition('type', 'my_content_type')
                ->condition('status', 1)
                ->pager($items_per_page)
                ->execute();

Ich habe meine Zeilen so formatiert

                $row = [
                    'data' => [
                        $node->title->value,
                        $node->field_number->value,
                        $node->field_rank->value,
                ];

Danach war das Generieren der Tabelle einfach

            $render = [
                'table'           => [
                    '#prefix'        => '<h1>Entries</h1>',
                    '#theme'         => 'table',
                    '#attributes'    => [
                        'data-striping' => 0
                    ],
                    '#header' => $header,
                    '#rows'   => $rows,
                ],
            ];

Die wichtigen Teile, die mir fehlten, sind das richtige Format für $ header. Und verwenden Sie -> tableSort ($ header) anstelle von -> expand ('Drupal\Core\Database\Query\TableSortExtender') -> orderByHeader ($ header) in meiner entityQuery

5
Matt

Die Entitätsabfrage unterstützt nicht expand (), wie Sie vermutet haben, und es gibt auch keine integrierte Unterstützung für etwas wie Tablesort.

Sie sollten weiterhin in der Lage sein, den $ -Header zu definieren (Ihr Beispiel ist nicht korrekt, es muss mindestens einen Schlüssel für das Feld und optional die Standardsortierreihenfolge enthalten) und dann tablesort_get_order () und tablesort_get_sort () verwenden, um das Feld zum Sortieren zu bringen auf sowie die Sortierrichtung.

Bearbeiten: Es stellt sich heraus, dass die Entitätsabfrage dies mit tableSort () unterstützt, aber wie gesagt, Ihre Header-Definition ist nicht korrekt, siehe Kommentare.

5
Berdir