You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							186 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							186 lines
						
					
					
						
							4.2 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace App\Controllers; | 
						|
 | 
						|
use App\Classes\Db; | 
						|
use App\Model\Model; | 
						|
use App\Model\ContentModel; | 
						|
use App\Model\PageHasContentModel; | 
						|
use App\Model\SectionHasContentModel; | 
						|
 | 
						|
class PageController extends BaseController { | 
						|
 | 
						|
	/** | 
						|
	 * Path of the page view files. | 
						|
	 * | 
						|
	 * @var string | 
						|
	 */ | 
						|
	protected $views = '../app/views/'; | 
						|
 | 
						|
	//-------------------------------------// | 
						|
 | 
						|
	/** | 
						|
	 * Create a new page controller instance. | 
						|
	 * | 
						|
	 * @param  Klein $router | 
						|
	 * | 
						|
	 * @return mixed | 
						|
	 */ | 
						|
	public function __construct(\Klein\Klein $router = null) | 
						|
	{ | 
						|
		parent::__construct($router); | 
						|
	} | 
						|
 | 
						|
	//-------------------------------------// | 
						|
 | 
						|
	/** | 
						|
	 * Handle page request with Db stored content. | 
						|
	 * | 
						|
	 * @param  int $id | 
						|
	 * | 
						|
	 * @return void | 
						|
	 */ | 
						|
	public function routeAction(int $id): void | 
						|
	{ | 
						|
		// Pull pages from cache | 
						|
		$pages = Db::getPages(); | 
						|
		$page = array_search($id, array_column($pages, 'id')); | 
						|
		$page = $pages[$page]; | 
						|
 | 
						|
		$title           = $page['title'] ?? ''; | 
						|
		$metaDescription = $page['meta_description'] ?? ''; | 
						|
 | 
						|
		// Load linked content | 
						|
		$pageHasContent    = new PageHasContentModel; | 
						|
		$sectionHasContent = new SectionHasContentModel; | 
						|
		$contents = array_merge( | 
						|
			(array)$this->loadLinkedContent($pageHasContent, 'page', $id), | 
						|
			(array)$this->loadLinkedContent($sectionHasContent, 'section', $page['section_id'])); | 
						|
 | 
						|
		// Exit if nothing was found | 
						|
		if (!_exists($contents)) { | 
						|
			parent::throw404(); | 
						|
		} | 
						|
 | 
						|
		$sideContent = in_array('2', array_column($contents, 'type')); | 
						|
 | 
						|
		$this->router->service()->contents = $contents; | 
						|
		$this->router->service()->sideContent = $sideContent; | 
						|
		$this->view('content', $title, $metaDescription); | 
						|
	} | 
						|
 | 
						|
	//-------------------------------------// | 
						|
 | 
						|
	/** | 
						|
	 * Load all content blocks linked to the provided Model. | 
						|
	 * | 
						|
	 * @param  Model  $model | 
						|
	 * @param  string  $column | 
						|
	 * @param  int  $id | 
						|
	 * | 
						|
	 * @return null|array | 
						|
	 */ | 
						|
	protected function loadLinkedContent(Model $model, string $column, int $id): ?array | 
						|
	{ | 
						|
		// Load all the Model <-> Content link data | 
						|
		$hasContent = $model::selectAll('*', " | 
						|
			WHERE {$column}_id = :id | 
						|
			ORDER BY {$model->getSort()} ASC", [ | 
						|
				[':id', $id, \PDO::PARAM_INT], | 
						|
			] | 
						|
		); | 
						|
 | 
						|
		// Exit if nothing was found | 
						|
		if (!_exists($hasContent)) { | 
						|
			return null; | 
						|
		} | 
						|
 | 
						|
		// Get all the content | 
						|
		$contentIds = array_column($hasContent, 'content_id'); | 
						|
		$contents = ContentModel::findAll($contentIds); | 
						|
 | 
						|
		// Exit if nothing was found | 
						|
		if (!_exists($contents)) { | 
						|
			return null; | 
						|
		} | 
						|
 | 
						|
		// Remove inactive content | 
						|
		foreach ($contents as $key => $content) { | 
						|
			if ($content['active'] == "0") { | 
						|
				unset($contents[$key]); | 
						|
			} | 
						|
		} | 
						|
		$contents = array_values($contents); | 
						|
 | 
						|
		return $contents; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Render page view with title and meta description. | 
						|
	 * | 
						|
	 * @param  string  $view | 
						|
	 * @param  string  $pageTitle | 
						|
	 * @param  string  $metaDescription | 
						|
	 * | 
						|
	 * @return void | 
						|
	 */ | 
						|
	protected function view( | 
						|
		string $view = '', string $pageTitle = '', string $metaDescription = ''): void | 
						|
	{ | 
						|
		if ($view != '') { | 
						|
			$view = $this->fileExists($this->views . $view . '.php'); | 
						|
		} | 
						|
 | 
						|
		if ($this->page == null) { | 
						|
			if ($view == '' && $this->section == '') { | 
						|
				// / | 
						|
				$view = $this->fileExists($this->views . 'home.php'); | 
						|
			} | 
						|
 | 
						|
			if ($view == '') { | 
						|
				// /example.php | 
						|
				$view = $this->fileExists($this->views . $this->section . '.php'); | 
						|
			} | 
						|
 | 
						|
			if ($view == '') { | 
						|
				// /example/index.php | 
						|
				$view = $this->fileExists($this->views . $this->section . '/index.php'); | 
						|
			} | 
						|
		} | 
						|
		else if ($view == '') { | 
						|
			// /example/my-page.php | 
						|
			$view = $this->fileExists($this->views . $this->section  . '/' . $this->page  . '.php'); | 
						|
		} | 
						|
 | 
						|
		if ($view != '') { | 
						|
			$pageTitle != '' | 
						|
				? $this->router->service()->pageTitle = $pageTitle | 
						|
				: $this->router->service()->pageTitle = ucfirst(str_replace('-', ' ', $this->page)); | 
						|
			$this->router->service()->metaDescription = $metaDescription; | 
						|
			$this->router->service()->render($view); | 
						|
		} | 
						|
		else { | 
						|
			parent::throw404(); | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	//-------------------------------------// | 
						|
 | 
						|
	/** | 
						|
	 * Loop back filename if it exists, empty string otherwise. | 
						|
	 * | 
						|
	 * @param  string  $file | 
						|
	 * | 
						|
	 * @return string | 
						|
	 */ | 
						|
	private function fileExists(string $file): string | 
						|
	{ | 
						|
		return file_exists($file) ? $file : ''; | 
						|
	} | 
						|
 | 
						|
} | 
						|
 | 
						|
// @Todo | 
						|
// - Fix line 32, breaks if no DB content! | 
						|
// - Implement page.description (meta) | 
						|
// - Use page.title instead of content.title (?)
 | 
						|
 |