]*>/u', 'replaceContent', $text); } class ComponentRequest { public $component_id; public $r; function __construct($c, HttpRequest $r) { $this->component_id = $c; $this->r = $r; } function get($key, $default = null) { if ($key == 'active_page') { return $this->r->get($key); } if ($arr = $this->r->get($key)) { if (is_array($arr)) { return Arr::get($arr, $this->component_id, $default); } else { return $arr; } } return $default; } function getAction() { return $this->r->getAction(); } } /** * Класс компонента */ class Controller_Component { public $viewPath = array(); public $webPath = array(); public $template = null; public $templatePath; public $component_id; public $COMPONENTS_WEB; public /*.Settings.*/$registry; public /*.Database.*/$db; public /*.Collection.*/$parameter; public $module; public $item_module; function before() { } function get($request, $key, $default) { } function execute(HttpRequest $request, $has_id = true) { $crequest = new ComponentRequest($this->component_id, $request); $_action = $request->get('action', 'index'); if (is_array($_action)) { $action = 'action' . ucfirst(Arr::get($_action, $this->component_id, 'index')); } else { $action = 'action' . ucfirst($_action); } $this->before(); if (method_exists($this, $action)) { return call_user_func(array($this, $action), $crequest); } else { return $this->actionIndex($crequest); } } public function getView($name) { // /*.Settings.*/$registry = $this->registry; $template = ($this->template) ? $this->template : $registry->readKey(array('system', 'template')); $selected = null; foreach ($this->viewPath as $index => $viewPath) { // Загружать шаблон по умолчанию если не найден текущий if(is_dir(Path::join($this->viewPath[$index], 'templates', $template))) { $tpl = new PHPTAL(Path::join($this->viewPath[$index], 'templates', $template, $name)); $tpl->setPhpCodeDestination(PHPTAL_PHP_CODE_DESTINATION); $selected = $index; break; } } if ($selected === null) { $tpl = new PHPTAL(Path::join($this->viewPath[0], 'templates', 'modern', $name)); $tpl->setPhpCodeDestination(PHPTAL_PHP_CODE_DESTINATION); $template = 'modern'; $selected = 0; } $tpl->stripComments(true); $tpl->addPreFilter(new PHPTAL_PreFilter_Normalize()); $tpl->set('common', Path::join(WWW_PATH, '../', 'common')); $tpl->set('script', Path::join(WWW_PATH, 'js')); $tpl->set('media', Path::join(TEMPLATE_WEB, $template)); $tpl->set('site_template', SITE_WWW_PATH . '/templates' . $registry->readKey(array('system', 'template'))); $tpl->set('base', SITE_WWW_PATH); $tpl->set('component_base', $this->webPath[$selected]); $tpl->set('component', Path::join($this->webPath[$selected], 'templates', $template)); $tpl->set('component_id', $this->component_id); return $tpl; } public function getTemplatePath($name) { return Path::join($this->viewPath[0], 'templates', 'modern', $name); } public function getTemplateWebPath() { return Path::join($this->webPath[0], 'templates', 'modern'); } /** * @param $name Имя модели */ private function getModelPath($name) { return Path::join (CMS_PATH, "model", $name . ".php"); } /** * Создает модель * @param string $name * @return model */ public function getModel($name) { require_once ($this->getModelPath ($name)); $modelName = $name . "Mapper"; $model = new $modelName (); $model->db = $this->db; return $model; } public function options($key, $val, /*.Database_PDOStatement.*/$res) { $result = array(); while($res->next()) { $result[] = array('value' => $res->getString($key), 'name' => $res->getString($val)); } return $result; } public function optionsPair($list, $selected = false) { $result = array(); foreach ($list as $key => $value) { $result [] = array('value' => $key, 'name' => $value, 'selected' => $key == $selected); } return $result; } function getInfo() { $filename = Path::join($this->viewPath[0], 'install.json'); if (file_exists($filename)) { $settings = json_decode(file_get_contents($filename), true); return $settings; } return array(); } /** * Генерация интерфейса для выбора галлереи фотографии */ public function setParameters(/*.View_Composite.*/$view) { $form = new Form_Form(); $options = new OptionFactory($this->db); $settings = $this->getInfo(); $form->addFieldList($settings['parameter'], $options); $view->form = $form; $view->component = $settings['component']; $view->component_title = $settings['title']; } static function loadComponent($expression, Database $db, Settings $registry) { $expression = htmlspecialchars_decode($expression); $offset = strpos($expression, '?'); $url = parse_url($expression); $arguments = array(); if ($offset === false) { $path = $expression; } else if (is_int($offset)) { $path = substr($expression, 0, $offset); $query = substr($expression, $offset + 1); parse_str($query, $arguments); } $name = $path; $path = Path::join (BASE_PATH, 'components', $name, $name . '.php'); $className = 'Component_' . $name; if (file_exists($path)) { require_once ($path); $component = new $className(); $component->db = $db; $component->registry = $registry; $component->viewPath = array(BASE_PATH . '/components/' . $name . '/'); $component->webPath = array(SITE_WWW_PATH . '/components/' . $name); $component->COMPONENTS_WEB = SITE_WWW_PATH . '/components/'; } else { $path = Path::join (COMPONENTS, $name, $name . '.php'); require_once ($path); $component = new $className(); $component->db = $db; $component->registry = $registry; $component->viewPath = array(COMPONENTS . '/' . $name . '/', BASE_PATH . '/components/' . $name . '/'); if (defined('COMPONENTS_WEB')) { $component->webPath = array(COMPONENTS_WEB . '/' . $name, SITE_WWW_PATH . '/components/' . $name); $component->COMPONENTS_WEB = COMPONENTS_WEB; } } $stmt = $db->prepareStatement("SELECT * FROM component WHERE code = ?"); $stmt->setString(1, $expression); $cid = $stmt->executeQuery(); if ($cid->next()) { $component->component_id = $cid->getInt('id_component'); } else { $last = $db->getIdGenerator(); if ($last->isBeforeInsert()) { $result = $last->getId('component_id_component_seq'); $stmt = $db->prepareStatement("INSERT INTO component (id_component, code) VALUES ($result, ?)"); $stmt->setString(1, $expression); $stmt->executeQuery(); } if ($last->isAfterInsert()) { $stmt = $db->prepareStatement("INSERT INTO component (code) VALUES (?)"); $stmt->setString(1, $expression); $stmt->executeQuery(); $result = $last->getId('component_id_component_seq'); } $component->component_id = $result; } $params = new Collection(); $params->import(array_merge($_GET, $arguments)); $component->parameter = $params; $component->template = $params->get('template', false); global $componentsConfig; $editor = $component->getEditUrl(); if ($editor) { $componentsConfig[] = $editor; } return $component; } function getEditUrl() { return null; } function raw_query(/*.ComponentRequest.*/ $request) { $arr = $request->r->export('get'); $param = array(); /*.Collection.*/$parameter = $this->parameter; foreach($parameter->export() as $key => $value) { $param[$key] = $value; } $data = array(); foreach($arr as $key => $value) { if (is_array($value)) { $data[$key] = Arr::get($value, $this->component_id); } else { $data[$key] = $value; } } $data['param'] = $param; return $data; } function query(/*.ComponentRequest.*/ $request, $list) { $arr = $request->r->export('get'); foreach($list as $key => $val) { $arr[$key] [$this->component_id] = $val; } unset($arr['active_page']); return '?' . http_build_query($arr); } function addRequireJsPath($name, $path, $shim = null) { Controller_Site::addRequireJsPath($name, $path, $shim); } function actionIndex(/*.ComponentRequest.*/ $request) { } }