|
|
|
<?php
|
|
|
|
/*
|
|
|
|
* Copyright © 2021 ExacTI Technology Solutions. All rights reserved.
|
|
|
|
* GPLv3 General License.
|
|
|
|
* https://exacti.com.br
|
|
|
|
* Phacil PHP Framework - https://github.com/exacti/phacil-framework
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Phacil\Framework;
|
|
|
|
|
|
|
|
use TypeError;
|
|
|
|
use Mustache_Exception_UnknownTemplateException;
|
|
|
|
use RuntimeException;
|
|
|
|
use SmartyException;
|
|
|
|
use \Phacil\Framework\Config;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Extend this class to create interation with your module controller to Phacil engine controller.
|
|
|
|
*
|
|
|
|
* Use as:
|
|
|
|
* <code>
|
|
|
|
* <?php
|
|
|
|
* namespace YourPrefix\Path\Controller;
|
|
|
|
* class YouClass extends \Phacil\Framework\Controller {
|
|
|
|
* public function index() {
|
|
|
|
* #Your code
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* You can use the __construct function on call the \Phacil\Framework\Register object inside parent.
|
|
|
|
*
|
|
|
|
* <code>
|
|
|
|
* public funcion __construct(\Phacil\Framework\Registry $registry){ parent::__construct($registry); YOUR_CODE; }
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* @abstract
|
|
|
|
* @package Phacil\Framework
|
|
|
|
* @since 0.1.0
|
|
|
|
*/
|
|
|
|
abstract class Controller {
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @var Registry
|
|
|
|
*/
|
|
|
|
protected $registry;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @var int
|
|
|
|
*/
|
|
|
|
protected $id;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @var mixed
|
|
|
|
*/
|
|
|
|
protected $layout;
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* The template path
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $template;
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* The childrens parts of the controller
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $children = array();
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* The variables of controller
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $data = array();
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* The twig aditional funcions created by your!
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $twig = array();
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* The errors array
|
|
|
|
*
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $error = array();
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* The rendered output
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $output;
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* Allowed template types
|
|
|
|
*
|
|
|
|
* @var string[]
|
|
|
|
*/
|
|
|
|
public $templateTypes = ["tpl", "twig", "mustache", "smarty", "phtml"];
|
|
|
|
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
/**
|
|
|
|
* The original route of childrens
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $routeOrig;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The output content type
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $contentType = 'text/html; charset=utf-8';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements constructor.
|
|
|
|
*
|
|
|
|
* If you use this, don't forget the parent::__construct($registry);
|
|
|
|
*
|
|
|
|
* @param \Phacil\Framework\Registry $registry
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function __construct(\Phacil\Framework\Registry $registry = null) {
|
|
|
|
if (!$registry) {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var \Phacil\Framework\Registry
|
|
|
|
*/
|
|
|
|
$registry = \Phacil\Framework\Registry::getInstance();
|
|
|
|
}
|
|
|
|
$this->registry = &$registry;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @return void */
|
|
|
|
private function __getRegistryClass(){
|
|
|
|
$this->registry = \Phacil\Framework\startEngineExacTI::getRegistry();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param string $key
|
|
|
|
* @return Registry
|
|
|
|
* @final
|
|
|
|
*/
|
|
|
|
final public function __get($key) {
|
|
|
|
if (!$this->registry) {
|
|
|
|
$this->__getRegistryClass();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->registry->get($key);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param string $key
|
|
|
|
* @param object $value
|
|
|
|
* @return void
|
|
|
|
* @final
|
|
|
|
*/
|
|
|
|
final public function __set($key, $value) {
|
|
|
|
if(!$this->registry) {
|
|
|
|
$this->__getRegistryClass();
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->registry->set($key, $value);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $route
|
|
|
|
* @param array $args
|
|
|
|
* @return \Phacil\Framework\Interfaces\Action
|
|
|
|
* @final
|
|
|
|
*/
|
|
|
|
final protected function forward($route, array $args = array()) {
|
|
|
|
return new Action($route, $args);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* Send redirect HTTP header to specified URL
|
|
|
|
*
|
|
|
|
* Use the \Phacil\Framework\Response::redirect() registered object.
|
|
|
|
*
|
|
|
|
* @param string $url
|
|
|
|
* @param int $status
|
|
|
|
* @return never
|
|
|
|
* @final
|
|
|
|
*/
|
|
|
|
final protected function redirect($url, $status = 302) {
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
$this->registry->response->redirect($url, $status);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
* Get and load the childrens controller classes
|
|
|
|
*
|
|
|
|
* @final
|
|
|
|
* @param string $child
|
|
|
|
* @param array $args
|
|
|
|
* @return object
|
|
|
|
*/
|
|
|
|
final protected function getChild($child, array $args = array()) {
|
|
|
|
$action = new Action($child, $args);
|
|
|
|
$file = $action->getFile();
|
|
|
|
$class = $action->getClass();
|
|
|
|
$classAlt = $action->getClassAlt();
|
|
|
|
$method = $action->getMethod();
|
|
|
|
|
|
|
|
if (file_exists($file)) {
|
|
|
|
require_once($file);
|
|
|
|
|
|
|
|
foreach($classAlt as $classController){
|
|
|
|
try {
|
|
|
|
if(class_exists($classController)){
|
|
|
|
$this->registry->routeOrig = $child;
|
|
|
|
$controller = new $classController($this->registry);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} catch (Exception $th) {
|
|
|
|
//throw $th;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$controller->$method($args);
|
|
|
|
|
|
|
|
$this->registry->routeOrig = null;
|
|
|
|
|
|
|
|
return $controller->output;
|
|
|
|
} else {
|
Controller child exception, Log, Response and Login
Action PHPDoc improvements, Controller child exception, Log new functions (getpath, getfilename, head and tail), log class check dir and creates if not exists, Response redirect improvement, Controller redirect function use the response redirect class, login interface documentation, login doc
3 years ago
|
|
|
throw new Exception("Could not load controller " . $child . '!', 1);
|
|
|
|
|
|
|
|
//exit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
* @throws TypeError
|
|
|
|
* @throws Mustache_Exception_UnknownTemplateException
|
|
|
|
* @throws RuntimeException
|
|
|
|
* @throws SmartyException
|
|
|
|
* @throws Exception
|
|
|
|
* @final
|
|
|
|
*/
|
|
|
|
final protected function render() {
|
|
|
|
|
|
|
|
foreach ($this->children as $child) {
|
|
|
|
$this->data[basename($child)] = $this->getChild($child);
|
|
|
|
}
|
|
|
|
|
|
|
|
$tpl = new \Phacil\Framework\Render($this->registry);
|
|
|
|
|
|
|
|
$pegRout = explode("/", ($this->registry->routeOrig)?: Request::GET('route'));
|
|
|
|
$pegRoutWithoutLast = $pegRout;
|
|
|
|
array_pop($pegRoutWithoutLast);
|
|
|
|
$pegRoutWithoutPenultimate = $pegRoutWithoutLast;
|
|
|
|
array_pop($pegRoutWithoutPenultimate);
|
|
|
|
|
|
|
|
if($this->template === NULL) {
|
|
|
|
|
|
|
|
$thema = ($this->config->get("config_template") != NULL) ? $this->config->get("config_template") : "default";
|
|
|
|
|
|
|
|
|
|
|
|
foreach($tpl->getTemplateTypes() as $extensionTemplate) {
|
|
|
|
$structure = [];
|
|
|
|
|
|
|
|
$structure[] = $thema.'/'.$pegRout[0].'/'.$pegRout[1].((isset($pegRout[2])) ? '_'.$pegRout[2] : '').'.'.$extensionTemplate;
|
|
|
|
$structure[] = 'default/'.$pegRout[0].'/'.$pegRout[1].((isset($pegRout[2])) ? '_'.$pegRout[2] : '').'.'.$extensionTemplate;
|
|
|
|
$structure[] = $pegRout[0].'/'.$pegRout[1].((isset($pegRout[2])) ? '_'.$pegRout[2] : '').'.'.$extensionTemplate;
|
|
|
|
$structure[] = implode("/", $pegRoutWithoutLast).'/View/'.end($pegRout).'.'.$extensionTemplate;
|
|
|
|
$structure[] = implode("/", $pegRoutWithoutPenultimate).'/View/'.((isset($pegRout[count($pegRout)-2])) ? $pegRout[count($pegRout)-2]."_".end($pegRout) : end($pegRout)).'.'.$extensionTemplate;
|
|
|
|
|
|
|
|
|
|
|
|
foreach($structure as $themefile){
|
|
|
|
if(file_exists(Config::DIR_APP_MODULAR() .$themefile)){
|
|
|
|
$this->template = $themefile;
|
|
|
|
$templatePath = Config::DIR_APP_MODULAR();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if(file_exists(Config::DIR_TEMPLATE() .$themefile)){
|
|
|
|
$this->template = $themefile;
|
|
|
|
$templatePath = Config::DIR_TEMPLATE();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if(file_exists(Config::DIR_APP_MODULAR().implode("/", $pegRoutWithoutLast)."/View/" .$this->template)){
|
|
|
|
$templatePath = Config::DIR_APP_MODULAR().implode("/", $pegRoutWithoutLast)."/View/";
|
|
|
|
} elseif(file_exists(Config::DIR_APP_MODULAR().implode("/", $pegRoutWithoutPenultimate)."/View/" .$this->template)){
|
|
|
|
$templatePath = Config::DIR_APP_MODULAR().implode("/", $pegRoutWithoutPenultimate)."/View/";
|
|
|
|
}
|
|
|
|
if(file_exists(Config::DIR_TEMPLATE() .$this->template)){
|
|
|
|
$templatePath = Config::DIR_TEMPLATE();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (file_exists($templatePath . $this->template)) {
|
|
|
|
|
|
|
|
$templateFileInfo = pathinfo($templatePath .$this->template);
|
|
|
|
$templateType = $templateFileInfo['extension'];
|
|
|
|
|
|
|
|
$tpl->setTemplate($templateType, $templatePath, $this->template, $this->data, $this->twig);
|
|
|
|
|
|
|
|
$this->registry->response->addHeader('Content-Type', $this->contentType);
|
|
|
|
|
|
|
|
$this->output = $tpl->render();
|
|
|
|
|
|
|
|
unset($tpl);
|
|
|
|
|
|
|
|
return $this->output;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
throw new Exception('Error: Could not load template ' . $templatePath . $this->template . '!');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param bool $commonChildren
|
|
|
|
* @return \Phacil\Framework\Response
|
|
|
|
* @throws Exception
|
|
|
|
* @final
|
|
|
|
*/
|
|
|
|
protected function out ($commonChildren = true) {
|
|
|
|
if($commonChildren === true){
|
|
|
|
$this->children = array_merge(array(
|
|
|
|
'common/footer',
|
|
|
|
'common/header'), $this->children
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->response->setOutput($this->render());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|