首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TableSort而不执行查询

使用TableSort而不执行查询
EN

Drupal用户
提问于 2021-03-02 18:16:37
回答 1查看 614关注 0票数 5

Drupal具有Drupal\Core\Utility\TableSort类,可用于创建具有可排序列的表。然而,core中的所有示例都是基于提供程序表对来自数据库查询的数据进行排序的Drupal\Core\Database\Query\TableSortExtender

我希望显示由自定义代码生成的数据,这些数据不是来自查询。如何在控制器中直接使用TableSort代码?

这是Drupal同样的问题7的Drupal 8版本。请参阅答案,以获得更多的见解。

EN

回答 1

Drupal用户

发布于 2021-03-02 18:16:37

TableSort具有检索排序顺序的方法,以及直接从查询参数中排序的字段。您可以使用::getSort()::getOrder()返回的值对数据进行自定义排序。

在呈现数组中,可以使用#header声明中的一些(无文档)选项来控制表最初排序的方式:

  • field:在查询参数中使用的名称,用于指示表应按此列排序。
  • sort:可以为其中一列(也只有一列)提供此选项(值为ascdesc)。这将是默认排序的列。
  • initial_click_sort:如果数据应该按降序排序,如果最初单击列标题,则可以将其设置为desc。这默认为asc,但对于某些数据,默认情况下您希望在顶部显示更大的数字。

下面是一个使用来自自定义数组的数据的控制器的示例:

代码语言:javascript
复制
requestStack = $requestStack;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container): self {
    return new static(
      $container->get('request_stack')
    );
  }

  /**
   * Returns a render array containing data about Linux distributions.
   *
   * @return array
   *   The render array.
   */
  public function linuxDistributionsTable(): array {
    $headers = [
      // The distribution label has the 'sort' option, making it the default.
      [
        'data' => $this->t('Distribution'),
        'field' => 'label',
        'sort' => 'asc',
      ],
      [
        'data' => $this->t('Initial release'),
        'field' => 'year',
      ],
      // Sorted from highest to lowest on initial click.
      [
        'data' => $this->t('Packages'),
        'field' => 'packages',
        'initial_click_sort' => 'desc',
      ],
    ];

    $data = [
      ['label' => 'Arch Linux', 'year' => 2002, 'packages' => 77264],
      ['label' => 'Debian', 'year' => 1993, 'packages' => 118326],
      ['label' => 'Red Hat', 'year' => 2002, 'packages' => 12155],
      ['label' => 'Gentoo Linux', 'year' => 2002, 'packages' => 29092],
      ['label' => 'OpenSUSE', 'year' => 2006, 'packages' => 76236],
      ['label' => 'Ubuntu', 'year' => 2004, 'packages' => 89403],
    ];

    // Sort the table according to the options passed in the query arguments.
    $request = $this->requestStack->getCurrentRequest();
    $sort = TableSort::getSort($headers, $request);
    $order_by = TableSort::getOrder($headers, $request)['sql'];

    usort($data, function (array $a, array $b) use ($sort, $order_by): int {
      $result = $a[$order_by] <=> $b[$order_by];
      return $sort === 'asc' ? $result : -$result;
    });

    return [
      'table' => [
        '#type' => 'table',
        '#header' => $headers,
        '#rows' => $data,
      ],
    ];
  }

}
票数 5
EN
页面原文内容由Drupal提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://drupal.stackexchange.com/questions/300620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档