phplibrary/src/Controller/Front.php

107 lines
3.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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