getInstance public $template; function __construct() { self::$_uid ++; $this->uid = self::$_uid; } function getUID() { return 'component:'. $this->uid; } public function getView($name) { require_once "core/view/compositeview.php"; // $template = ($this->template) ? $this->template : $this->_registry->readKey(array('system', 'template')); // Загружать шаблон по умолчанию если не найден текущий if (is_dir(Path::join($this->viewPath, 'templates', $template))) { $template_file = Path::join($this->viewPath, 'templates', $template, $name); } else { $template_file = Path::join($this->viewPath, 'templates', 'modern', $name); } $tpl = new View_Composite($template_file); $tpl->script = $_script = Path::join(WWW_PATH, 'js'); $tpl->media = $_media = Path::join(TEMPLATE_WEB, $template); $tpl->component = $_template = Path::join(COMPONENTS_WEB, strtolower(get_class($this)), 'templates', 'modern'); $tpl->setAlias(array( '${media}' => $_media, '${script}' => $_script, '${template}' => $_template)); $tpl->loadImports(Path::skipExtension($template_file) . ".import"); return $tpl; } public function setParameters($view) { } /** * @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 'core/mapper/mapper.php'; require_once ($this->getModelPath ($name)); $modelName = $name . "Mapper"; $model = new $modelName (); $model->db = $this->db; return $model; } public function options($key, $val, $res) { $result = array(); while($res->next()) { $result[] = array('value' => $res->getInt($key), 'name' => $res->getString($val)); } return $result; } public function optionsPair($list) { $result = array(); foreach ($list as $key => $value) { $result [] = array('value' => $key, 'name' => $value); } return $result; } /* В дальнейшем нужно зменить на методы + Методы могут быть и javascript */ protected $editUrl; function setEditUrl($url) { $this->editUrl = $url; } function getEditUrl() { return $this->editUrl; } } /** * TALES для подключения компонентов * component:name?param1=value1¶m2=value2 */ class Component_Tales implements PHPTAL_Tales { static public function component($expression, $nothrow = false) { return "phptal_component('" . $expression . "')"; } } function loadComponent($name, $db, $registry) { $path = Path::join(COMPONENTS, $name, $name . ".php"); // echo COMPONENTS, '
'; // echo $path; if (file_exists($path)) { require_once ($path); $component = new $name(); $component->db = $db; $component->_registry = $registry; $component->viewPath = COMPONENTS."/".$name."/"; return $component; } throw new FileNotFountException(); } /** * Функция подключения компонента */ global $componentList; $componentList = array(); function phptal_component ($real_expression, $offset = 0) { global $db, $registry, $componentList; // Нужно както передавать параметры $expression = htmlspecialchars_decode($real_expression); $url = parse_url($expression); parse_str($url['query'], $arguments); $name = $url['path']; $component = loadComponent($name, $db, $registry); $req = new HttpRequest(); $params = new Collection(); $params->import(array_merge($_GET, $arguments)); $component->params = $params; $componentList [] = array( 'uid' => $component->getUID(), 'params' => $expression, 'name' => $name, 'offset' => $offset, 'size' => strlen($real_expression), /* Вместо ссылки на редактирование нужно передавать список методов для работы с компонентом edit (редактирование содержание), new (новое содержание), шаблон коменнента ... вместе с иконками этих методов ! Компоненты могут содержать другие компоненты */ 'editurl' => $component->getEditUrl(), 'newurl' => '' ); unset($req['active_page']); $component->template = $params->get('template', false); return $component->execute($params, $req); } /* Регистрация нового префикса для подключения компонента */ $registry = PHPTAL_TalesRegistry::getInstance(); $registry->registerPrefix('component', array('Component_Tales', 'component'));