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)); | ||
|  |     } | ||
|  | } |