/** * * @param str $db_id * @return c_db */ function get_db($db_id) { if (!isset($this->dbs[$db_id])) { global $o_global; $nodes = $o_global->settings_array['databases']; $res_node = ''; foreach ($nodes as $k => $node) { if (c_xml::is_system_key($k)) { continue; } if ($node['@id'] == $db_id) { $res_node = $node; break; } } if (empty($res_node)) { $this->dbs[$db_id] = false; } else { $this->dbs[$db_id] = new c_db($res_node['name']['.'], $res_node['user']['.'], $res_node['password']['.'], $res_node['host']['.']); } } return $this->dbs[$db_id]; }
function get_page_by_screen($screen, $pages = false) { global $o_cur_user; if (!is_array($screen)) { $screen = explode('/', $screen); } if ($pages === false) { $pages = $this->site_array['pages']; } $cur_screen = array_shift($screen); /*Begin собираем все экраны с именем $screen*/ $pages_like_screen = array(); foreach ($pages as $k => $v) { if (c_xml::is_system_key($k)) { continue; } if ($v['@screen'] == $cur_screen) { $pages_like_screen[] = $v; } } //die; /*End собираем все экраны с именем $screen*/ //ничего не нашли if (count($pages_like_screen) == 0) { return false; } $res_page = $pages_like_screen[0]; /*if ($res_page===false){ //ни один экран не подошел по правам. //root'у выдадим первый попавшийся if (isset($cur_user_rights) && $cur_user_rights=='root') $res_page=$pages_like_screen[0]; else { //перебросим на экран логина if (!$this->is_ajax){ global $o_session; $o_session->set_session('login_from', '', $_SERVER['REQUEST_URI']); redirect_to('/login'); } else { echo 'error'; exit(); } } }*/ if (empty($res_page['pages']) || empty($screen)) { return $res_page; } else { return $this->get_page_by_screen($screen, $res_page['pages']); } }
/** * * обработка xml xsl'ем * @param str $xsl_file * @param str $root_node_name * @param array,str,c_xml $dta - можно передать массив (тогда обязательно задать $root_node_name), строку с xml-данными, c_xml * @param bool $is_debug * @param array $params * @param array $keys_as_params * @param bool $kill_doctype */ function xsl_out($xsl_file, $root_node_name, $dta = array(), $is_debug = false, $params = array(), $keys_as_params = array(), $kill_doctype = true) { global $o_global; if (!isset($params['res_site_url'])) { $params['res_site_url'] = $o_global->res_site_url; } if (!isset($params['res_engine_url'])) { $params['res_engine_url'] = $o_global->res_engine_url; } if (!isset($params['current_url'])) { $params['current_url'] = $o_global->current_url; } if (is_object($dta)) { $xml = $dta->toXML(); } elseif (is_array($dta)) { $xml = c_xml::arrayToXML($root_node_name, $dta); } else { $xml = $dta; } $res = ''; if ($is_debug || $_REQUEST['debug_xsl'] > 0 && _GL_DEBUG === true || $_REQUEST['debug_xsl'] === $xsl_file && _GL_DEBUG === true) { $_REQUEST['debug_xsl'] = $_REQUEST['debug_xsl'] - 1; //можно дебажить до определённого уровня $res .= '<B>File: "' . $xsl_file . '"</B><BR/>'; if (!empty($params)) { $res .= '<U>Params</U>:<BR>'; foreach ($params as $k => $v) { $res .= "<B>{$k}</B>={$v}<BR>"; } } $res .= c_xml::dump($xml); $save_to = _PMP_ROOT . '/tmp/xml_dump.xml'; $fp = @fopen($save_to, 'w'); if ($fp !== false) { @fwrite($fp, $xml); } @fclose($fp); } $res .= c_xml::transform($xsl_file, $xml, $params); if ($kill_doctype) { $res = preg_replace("/^\\<!DOCTYPE.*\\.dtd\"\\>/i", '', $res, 1); } return $res; }
function run_site() { global $o_global; /* Ищем обработчик для заданного пути * обработчики задаются в _site.xml * * Если для пути /one/two/three в _site.xml обработчик не задан, то ищется обработчик для /one/two, * если нет и для этого пути, то бурётся обработчик для /one. Иначе выводится 404 * * */ $url_params = $o_global->url_params; if ($url_params[0] == 'res') { //для ресурсов сразу отдаём 404 header("HTTP/1.0 404 Not Found"); /*$tmp=$o_global->site_root.implode('/',$url_params); echo file_get_contents($tmp);*/ exit; } do { $cur_page = $o_global->get_page_by_screen($url_params); array_pop($url_params); } while ($cur_page === false && !empty($url_params)); $o_global->curr_page = $cur_page; if ($o_global->curr_page === false) { //попробуем найти эту же страницу, но без учёта прав $url_params = $o_global->url_params; do { $cur_page_nr = $o_global->get_page_by_screen($url_params, $o_global->site_full_array['pages']); array_pop($url_params); } while ($cur_page_nr === false && !empty($url_params)); if ($cur_page_nr === false) { //этой страницы нет вообще $o_global->curr_page = $o_global->get_page_by_screen('404'); if ($o_global->curr_page === false) { header("HTTP/1.0 404 Not Found"); echo '404'; exit; } } else { //эта страница есть, значит для просмтора не хватает прав //перебросим на страницу логина if (!$o_global->is_ajax) { global $o_session; $o_session->set_session('login_from', '', $_SERVER['REQUEST_URI']); redirect_to('/login'); } else { echo 'error'; exit; } } } //если задан редирект if (isset($o_global->curr_page['redirect'])) { redirect_to($o_global->curr_page['redirect']['.']); } if ($o_global->curr_page['@ajax'] == 1) { $o_global->is_ajax = true; } $out_result = false; /*Begin проверим кеш*/ if ($o_global->settings_array['enable_cache']['.'] == 1 && $o_global->curr_page['@cache_time'] > 0) { //кеш включён $o_cache = new c_cache($o_global->curr_page['@cache_time']); if (empty($_POST) && !$o_global->is_ajax) { $cache_key = make_cache_key(); //если установлен, то кеш сохраним $out_result = $o_cache->get($cache_key); } else { //какие-то действия, значит надо очистить кеш $o_cache->remove(make_cache_key()); } } /*End проверим кеш*/ /*Begin из кеша не взяли*/ if ($out_result === false) { $handlers = $o_global->curr_page['handlers']; if (is_array($handlers)) { if ($o_global->is_ajax) { $handler = $handlers['content']['.']; if (load_handler($handler)) { $handler_class = get_handler_class($handler); $o_handler = new $handler_class(); $o_handler->handler_info = $handlers['content']; $out_result = $o_handler->run(); } } else { $dta = array(); foreach ($handlers as $part => $handler_arr) { if (c_xml::is_system_key($part)) { continue; } if (!isset($o_global->curr_page['handlers'][$part])) { continue; } //в обработчик мог изменить количество обработчиков $handler = $handler_arr['.']; if (load_handler($handler)) { $handler_class = get_handler_class($handler); $o_handler = new $handler_class(); $o_handler->handler_info = $handler_arr; $dta['parts'][$part] = $o_handler->run(); } } /*устанавливаем параметры из раздела <params></params> страницы*/ if (is_array($o_global->curr_page['params'])) { foreach ($o_global->curr_page['params'] as $k => $itm) { if (c_xml::is_system_key($k)) { continue; } $params[$k] = $itm['.']; } } if (is_array($o_global->curr_page['title'])) { $params['title'] = $o_global->curr_page['title']['.']; } else { $params['title'] = $o_global->curr_page['title']; } if (is_array($o_global->curr_page['description'])) { $params['description'] = $o_global->curr_page['description']['.']; } else { $params['description'] = $o_global->curr_page['description']; } if (is_array($o_global->curr_page['keywords'])) { $params['keywords'] = $o_global->curr_page['keywords']['.']; } else { $params['keywords'] = $o_global->curr_page['keywords']; } if (is_array($o_global->curr_page['theme'])) { $out_result = xsl_out($o_global->curr_page['theme']['.'], 'page', $dta, false, $params, false, false); } else { $out_result = xsl_out($o_global->curr_page['theme'], 'page', $dta, false, $params, false, false); } } } else { //если обработчики не заданы, то просто выводим xsl $params['title'] = $o_global->curr_page['title']['.']; $params['description'] = $o_global->curr_page['description']['.']; $params['keywords'] = $o_global->curr_page['keywords']['.']; $out_result = xsl_out($o_global->curr_page['theme']['.'], 'page', array(), false, $params, false, false); } /*Begin сохраним кеш*/ if (isset($cache_key)) { $o_cache->set($cache_key, $out_result); } /*End сохраним кеш*/ } /*End из кеша не взяли*/ echo $out_result; }