mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-02-24 19:34:25 +08:00
50 lines
1.4 KiB
PHP
50 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace BookStack\Sorting;
|
|
|
|
/**
|
|
* Generate a URL with multiple parameters for sorting purposes.
|
|
* Works out the logic to set the correct sorting direction
|
|
* Discards empty parameters and allows overriding.
|
|
*/
|
|
class SortUrl
|
|
{
|
|
public function __construct(
|
|
protected string $path,
|
|
protected array $data,
|
|
protected array $overrideData = []
|
|
) {
|
|
}
|
|
|
|
public function withOverrideData(array $overrideData = []): self
|
|
{
|
|
return new self($this->path, $this->data, $overrideData);
|
|
}
|
|
|
|
public function build(): string
|
|
{
|
|
$queryStringSections = [];
|
|
$queryData = array_merge($this->data, $this->overrideData);
|
|
|
|
// Change sorting direction if already sorted on current attribute
|
|
if (isset($this->overrideData['sort']) && $this->overrideData['sort'] === $this->data['sort']) {
|
|
$queryData['order'] = ($this->data['order'] === 'asc') ? 'desc' : 'asc';
|
|
} elseif (isset($this->overrideData['sort'])) {
|
|
$queryData['order'] = 'asc';
|
|
}
|
|
|
|
foreach ($queryData as $name => $value) {
|
|
$trimmedVal = trim($value);
|
|
if ($trimmedVal !== '') {
|
|
$queryStringSections[] = urlencode($name) . '=' . urlencode($trimmedVal);
|
|
}
|
|
}
|
|
|
|
if (count($queryStringSections) === 0) {
|
|
return url($this->path);
|
|
}
|
|
|
|
return url($this->path . '?' . implode('&', $queryStringSections));
|
|
}
|
|
}
|