107 lines
3.6 KiB
PHP
107 lines
3.6 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Первичный контроллер контроллер страниц
|
||
* @package system.controller
|
||
*/
|
||
namespace ctiso\Controller;
|
||
use ctiso\Controller\Action,
|
||
ctiso\Settings,
|
||
ctiso\Database,
|
||
ctiso\Collection,
|
||
ctiso\Filter\ActionAccess,
|
||
ctiso\Filter\ActionLogger,
|
||
ctiso\Path,
|
||
ctiso\UserMessageException,
|
||
ctiso\HttpRequest;
|
||
|
||
class Front extends Action
|
||
{
|
||
|
||
protected $_param; // Параметр по которому выбирается модуль
|
||
protected $default; // Значение параметра по умолчанию
|
||
|
||
protected $modules = array();
|
||
|
||
/**
|
||
* @param Settings $settings
|
||
*/
|
||
public function __construct($db, $settings, $user, $default) {
|
||
parent::__construct();
|
||
$this->settings = $settings;
|
||
$this->db = $db;
|
||
$this->user = $user;
|
||
$this->default = $default;
|
||
}
|
||
|
||
public function isLoaded($name) {
|
||
return isset($this->modules[$name]);
|
||
}
|
||
|
||
/**
|
||
* Создает экземпляр модуля и выполняет действия для него
|
||
* @param string $name Имя модуля
|
||
* @param request $request Имя модуля
|
||
* @return string
|
||
*/
|
||
public function loadModule($name, Collection $request, $controller = null)
|
||
{
|
||
if ($this->isLoaded($name)) {
|
||
$module = $this->modules[$name];
|
||
return $module->access->execute($request);
|
||
}
|
||
|
||
$system = $this->settings['system'];
|
||
|
||
$moulesPath = $system->readKey(['path', 'modules']);
|
||
$logPath = Path::join($this->settings['site'], $system->readKey(['path', 'access.log']));
|
||
$moduleFile = Path::join($this->settings['base'], $moulesPath, $name, 'classes', $controller ? $controller : $name);
|
||
|
||
$ucname = ucfirst($name);
|
||
$moduleClass = "Modules\\$ucname\\$ucname";
|
||
$module = new $moduleClass();
|
||
if ($module) {
|
||
// Инициализация модуля
|
||
$modPath = Path::join($moulesPath, $name);
|
||
$module->viewPath = $modPath;
|
||
$module->name = $name;
|
||
//
|
||
$module->settings = $this->settings;
|
||
$module->db = $this->db;
|
||
// Ведение лога
|
||
$logger = new ActionLogger($module, $logPath, $this->user);
|
||
$logger->before = $this->loadSettings(Path::join($modPath, 'filter', 'logger.php'));
|
||
// Управление доступом
|
||
$module->access = new ActionAccess($logger);
|
||
$module->access->access = $this->loadSettings(Path::join($modPath, 'filter', 'access.php'));
|
||
|
||
$module->setUp();
|
||
|
||
$this->modules[$name] = $module;
|
||
$result = $module->access->execute($request);
|
||
return $result;
|
||
}
|
||
return null; // throw new FileNotFoundException();
|
||
}
|
||
|
||
|
||
public function execute(HttpRequest $request)
|
||
{
|
||
$name = explode("\\", $request->get('module', $this->default));
|
||
if (count($name) >= 2) {
|
||
$controller = $name[1];
|
||
} else {
|
||
$controller = null;
|
||
}
|
||
try {
|
||
return $this->loadModule($name[0], $request, $controller);
|
||
} catch (UserMessageException $ex) { //Исключение с понятным пользователю сообщением
|
||
$mode = $request->get('mode');
|
||
if($mode == 'ajax' || $mode == 'json') {
|
||
return json_encode(['result'=>'fail', 'message'=> $ex->userMessage]);
|
||
} else {
|
||
return $ex->userMessage;
|
||
}
|
||
}
|
||
}
|
||
}
|