db; } public function installPath($name) { return Path::join(CMS_PATH, "modules", $name, "install"); } public function addSuggest($view, $name) { $suggest = array(); $file = Path::join($this->viewPath, 'help', $name . '.suggest'); if (file_exists($file) && include($file)) { $view->addScriptRaw("add_suggest(".json::encode($suggest).");\n"); } } function findIcon($icon, $size) { return Path::join($this->iconPath, $size . 'x' . $size, $icon . '.png'); } /** * Создает представление * @param string $file * @return template */ public function getView($name) { require_once "core/view/compositeview.php"; $file = $name . self::TEMPLATE_EXTENSION; // Список возможных директорий для поиска файла шаблона $theme = $this->_registry->readKey(array('system', 'theme')); $icon_theme = $this->_registry->readKey(array('system', 'icon_theme')); $list = array( Path::join($this->viewPath, TEMPLATES) => Path::join(WWW_PATH, "modules", $this->name, TEMPLATES), PHPTAL_TEMPLATE_REPOSITORY => ""); // Поиск файла для шаблона foreach($list as $ospath => $path) { $template = Path::join($ospath, $file); if(file_exists($template)) { break; } } $tpl = new View_Composite($template); $tpl->icons = $this->iconPath; // Путь к файлам текущей темы $tpl->media = $this->themePath; // Путь к файлам текущей темы $tpl->script = $this->jsPath; // Путь к файлам скриптов $tpl->template = $path; // Путь к файлам текущего шаблона $tpl->setAlias(array( '${icons}' => $this->iconPath, '${media}' => $this->themePath, '${script}' => $this->jsPath, '${template}' => $path)); $tpl->loadImports(Path::skipExtension($template) . ".import"); $this->addSuggest($tpl, $name); return $tpl; } public function getModel($name) { if (!$this->factory) { $this->factory = new ModelFactory($this->db, $this->_registry, $this->_shortcut); } return $this->factory->getModel($name); } /** * Выбор действия * Т.к действия являются методами класса то * 1. Можно переопределить действия * 2. Использовать наследование чтобы добавить к старому обработчику новое поведение * @param $request Обьект запроса */ public function execute1(HTTPRequest $request) { $action = self::ACTION_PREFIX . ucfirst($request->getAction()); if (method_exists($this, $action)) { return $this->forward($action, $request); } else { return $this->forward("actionIndex", $request); } } public function execute(HTTPRequest $request) { $result = $this->execute1($request); if ($result) { $this->view = $result; } return $this->render(); } public function forward($action, HTTPRequest $args) { // Действия до вызова основного обработчика /*foreach($this->_aspect as $aspect) { if (isset($aspect->before[$action])) { call_user_func ($aspect->before[$action], $action, $args); } }*/ return call_user_func(array($this, $action), $args); } /** * Страница по умолчанию */ public function actionIndex(HttpRequest $request) { return ""; } public function postUrl($name, $param) { return "?" . http_build_query( array_merge(array('module' => strtolower(get_class($this)), "action" => $name), $this->param, $param)); } /** * Генерация ссылки c учетом прав пользователя на ссылки * * @parma string $name Действие * @parma string $param Дополнительные параметры */ public function nUrl($name, array $param = array()) { if (!$this->access || $this->access->checkAction($name)) { return lcurry(array($this, 'postUrl'), $name, $param); } return null; } public function fUrl($name, array $param = array()) { return forceUrl($this->nUrl($name, $param)); } /** * Добавляет параметр для всех ссылок создаваемых функцией nUrl, aUrl */ public function addParameter($name, $value) { if ($value) { $this->param [$name] = $value; } } /** * Генерация ссылки на действие контроллера * Ajax определяется автоматически mode = ajax используется для смены layout */ public function aUrl($name, array $param = array()) { return $this->nUrl($name, array_merge(array('mode' => 'ajax'), $param)); // FIXME } /** * Добавление помошника контроллера */ public function addHelper($class) { $this->helpers [] = $class; } /** * Вызов помошников контроллера */ public function callHelpers(HttpRequest $request) { $action = self::ACTION_PREFIX . $request->getAction(); foreach ($this->helpers as $helper) { if (method_exists($helper, $action)) { return call_user_func(array($helper, $action), $request, $this); } else { return $helper->actionIndex($request, $this); // Вместо return response ??? } } } /** * Загрузка файла класса */ public function loadClass($path, $setup = null) { if (file_exists($path)) { require_once ($path); $class = pathinfo($path, PATHINFO_FILENAME); return new $class($setup); } return null; } public function loadSettings($path) { $result = new Settings($path); $result->read(); return $result->export(); } // Для Widgets public $view = null; public $childNodes = array(); public $childViews = array(); public function setView($name) { $this->view = $this->getView($name); } /** * Установка заголовка для отображения */ public function setTitle($title) { $this->view->setTitle($title); } /** * Добавление widget к отображению */ public function addChild(/*Widget*/ $section, $node) { $this->childNodes[$section] = $node; } /** * Добавление дочернего отображения к текущему отображению */ public function addView(/*CompositeView*/ $section, $node) { $this->childViews[$section] = $node; } /** * Генерация содержания * Путаница c execute и render */ public function render() { foreach ($this->childNodes as $name => $node) { $node->make($this); $this->view->setView($name, $node->view); } foreach ($this->childViews as $name => $node) { $this->view->setView($name, $node); } return $this->view; } function getPageId($request) { $pageId = time(); $request->session()->set('page', $pageId); return $pageId; } function checkPageId($request, $page) { $_page = $request->session()->get('page'); $result = ($_page && $_page == $page); $request->session()->clean('page'); return $result; } } class Controller_Action extends Controller {}