/**
  *
  * @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];
 }
Beispiel #2
0
 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']);
     }
 }
Beispiel #3
0
/**
 *
 * обработка 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;
}
Beispiel #4
0
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;
}