Drupal具有Drupal\Core\Utility\TableSort类,可用于创建具有可排序列的表。然而,core中的所有示例都是基于提供程序表对来自数据库查询的数据进行排序的Drupal\Core\Database\Query\TableSortExtender。
我希望显示由自定义代码生成的数据,这些数据不是来自查询。如何在控制器中直接使用TableSort代码?
这是Drupal同样的问题7的Drupal 8版本。请参阅答案,以获得更多的见解。
发布于 2021-03-02 18:16:37
TableSort具有检索排序顺序的方法,以及直接从查询参数中排序的字段。您可以使用::getSort()和::getOrder()返回的值对数据进行自定义排序。
在呈现数组中,可以使用#header声明中的一些(无文档)选项来控制表最初排序的方式:
field:在查询参数中使用的名称,用于指示表应按此列排序。sort:可以为其中一列(也只有一列)提供此选项(值为asc或desc)。这将是默认排序的列。initial_click_sort:如果数据应该按降序排序,如果最初单击列标题,则可以将其设置为desc。这默认为asc,但对于某些数据,默认情况下您希望在顶部显示更大的数字。下面是一个使用来自自定义数组的数据的控制器的示例:
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,
],
];
}
}https://drupal.stackexchange.com/questions/300620
复制相似问题