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