<?php namespace PHPFUI; class SortableTable extends \PHPFUI\Table { private string $columnParameter = 'c'; private array $parameters = []; private array $sortableColumns = []; private string $sortedColumn = ''; private string $sortedOrder = ''; private string $sortParameter = 's'; private string $url; public function __construct() { parent::__construct(); $this->url = $url = $_SERVER['REQUEST_URI'] ?? ''; $queryStart = \strpos($this->url, '?'); if ($queryStart) { $this->url = \substr($url, 0, $queryStart); \parse_str(\substr($url, $queryStart + 1), $this->parameters); } } public function getBaseUrl() : string { return $this->url; } public function getDownUrl(string $column) : string { $parameters = $this->parameters; $parameters[$this->columnParameter] = $column; $parameters[$this->sortParameter] = 'd'; return $this->url . '?' . \http_build_query($parameters); } public function getParsedParameters() : array { return $this->parameters; } public function getSortedColumn() : string { return $this->sortedColumn; } public function getSortedOrder() : string { return $this->sortedOrder; } public function getUpUrl(string $column) : string { $parameters = $this->parameters; $parameters[$this->columnParameter] = $column; $parameters[$this->sortParameter] = 'a'; return $this->url . '?' . \http_build_query($parameters); } public function setParameters(string $column = 'c', string $sort = 's') : static { $this->columnParameter = $column; $this->sortParameter = $sort; return $this; } public function setSortableColumns(array $columns) : static { $this->sortableColumns = \array_flip($columns); return $this; } public function setSortedColumnOrder(string $column, string $order) : static { $order = \strtolower($order); if (! \in_array($order, ['a', 'd'])) { $order = 'a'; } $this->sortedOrder = $order; $this->sortedColumn = $column; return $this; } protected function getSortHeader(string $column, string $title) : string { if (! isset($this->sortableColumns[$column])) { return $title; } $downUrl = $this->getDownUrl($column); $url = $upUrl = $this->getUpUrl($column); $icon = ''; if ($column == $this->sortedColumn) { if ('d' == $this->sortedOrder) { $icon = clone \PHPFUI\Language::getSortIcon('down'); $icon->addClass('float-right'); $icon->setLink($upUrl); } else { $icon = clone \PHPFUI\Language::getSortIcon('up'); $icon->addClass('float-right'); $url = $downUrl; $icon->setLink($downUrl); } } return new \PHPFUI\Link($url, $title, false) . $icon; } }