70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php namespace BookStack\Entities\Tools;
 | |
| 
 | |
| use BookStack\Entities\Models\BookChild;
 | |
| use BookStack\Entities\Models\Entity;
 | |
| use Illuminate\Support\Collection;
 | |
| 
 | |
| /**
 | |
|  * Finds the next or previous content of a book element (page or chapter).
 | |
|  */
 | |
| class NextPreviousContentLocator
 | |
| {
 | |
|     protected $relativeBookItem;
 | |
|     protected $flatTree;
 | |
|     protected $currentIndex = null;
 | |
| 
 | |
|     /**
 | |
|      * NextPreviousContentLocator constructor.
 | |
|      */
 | |
|     public function __construct(BookChild $relativeBookItem, Collection $bookTree)
 | |
|     {
 | |
|         $this->relativeBookItem = $relativeBookItem;
 | |
|         $this->flatTree = $this->treeToFlatOrderedCollection($bookTree);
 | |
|         $this->currentIndex = $this->getCurrentIndex();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the next logical entity within the book hierarchy.
 | |
|      */
 | |
|     public function getNext(): ?Entity
 | |
|     {
 | |
|         return $this->flatTree->get($this->currentIndex + 1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the next logical entity within the book hierarchy.
 | |
|      */
 | |
|     public function getPrevious(): ?Entity
 | |
|     {
 | |
|         return $this->flatTree->get($this->currentIndex - 1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the index of the current relative item.
 | |
|      */
 | |
|     protected function getCurrentIndex(): ?int
 | |
|     {
 | |
|         $index = $this->flatTree->search(function (Entity $entity) {
 | |
|             return get_class($entity) === get_class($this->relativeBookItem)
 | |
|                 && $entity->id === $this->relativeBookItem->id;
 | |
|         });
 | |
|         return $index === false ? null : $index;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Convert a book tree collection to a flattened version
 | |
|      * where all items follow the expected order of user flow.
 | |
|      */
 | |
|     protected function treeToFlatOrderedCollection(Collection $bookTree): Collection
 | |
|     {
 | |
|         $flatOrdered = collect();
 | |
|         /** @var Entity $item */
 | |
|         foreach ($bookTree->all() as $item) {
 | |
|             $flatOrdered->push($item);
 | |
|             $childPages = $item->visible_pages ?? [];
 | |
|             $flatOrdered = $flatOrdered->concat($childPages);
 | |
|         }
 | |
|         return $flatOrdered;
 | |
|     }
 | |
| }
 |