* @copyright: Copyright (c) 2010, Bunzia Alexander * @version: 1.0 * @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL * @package: HiLo CMS */ /** * admin_pages * * Управление страницами */ class admin_pages{ private $error = false; private $act = 'index'; private $JsHttpRequest = false; public function __construct(){ global $MAIN_PAGE; define('M_PATH',MAIN_SOURCE_PATH.'/modules/'.$MAIN_PAGE -> dirname() ); define('M_URL',MAIN_SOURCE_URL.'/modules/'.$MAIN_PAGE -> dirname() ); define('A_CHARSET', $MAIN_PAGE -> charset() ); include_once(M_PATH.'/inc/url.php'); include_once(M_PATH.'/lang/ru/lang.php'); include_once(M_PATH.'/inc/class.pages.php'); include_once(M_PATH.'/inc/class.modules.php'); include_once(M_PATH.'/inc/class.blocks.php'); include_once(MAIN_SOURCE_PATH.'/inc/class.html.php'); include(MAIN_SOURCE_PATH.'/ext/ajax/JsHttpRequest.php'); $this -> JsHttpRequest = new JsHttpRequest( A_CHARSET ); $this -> act = !empty($_REQUEST['act']) ? $_REQUEST['act'] : $this -> act; $GLOBALS['_RESULT']['id_request'] = !empty($_REQUEST['id_request']) ? $_REQUEST['id_request'] : 0; admin_pages::inc_check_new_modules(); // проверка новых модулей } public function get(){ //sleep(2); $func = $this -> act; if ( !method_exists($this ,$func) ){ sys_error(ERROR_404); } return $this -> $func(); } // главная, формирует список страниц private function index(){ $t = new PHPTAL( M_PATH.'/tmpl/control_pages/main.html' ); $p = new pagesQuery('f'); $p -> include_modules('m','m.*'); $p -> include_tmpl('t','t.*'); $p -> where_main_rows(); $p -> orderby_mid('ASC'); $p -> orderby_active('ASC'); //$p -> set_debug(1); $p -> get(' f.f_id,f.f_name, f.f_meta_title, f.f_active,f.f_id AS count_blocks, f.f_id AS blocks_url, f.f_id as lang_links' ,false); $modules= array(); while( $row = $p -> row() ){ if ( !isset($modules[$row['m_id']]) ){ $modules[$row['m_id']] = arr_to_obj($row); } $modules[$row['m_id']] -> pages[$row['f_id']]=arr_to_obj($row); } $t -> modules = $modules; // список модулей include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/class.module.php'); $s = new select_box(); $s -> empty_record(true,0); $m = new m_query('m'); $m -> where_active(1); $m -> get('m_path,m_name'); while( $row = $m -> row() ){ $s -> set($row['m_path'],$row['m_name']); } $t -> module_list = $s -> get(); return $t -> execute(); } /* AJAX */ // перезагружаем таблицу со списком страниц, согласно правилам сортировки и фильтрации private function ajax_reload(){ sys_block_disable(); // макрос таблицы $t = new PHPTAL( M_PATH.'/tmpl/control_pages/inc/page_row.html' ); // выполнять макрос $t -> execute = true; // выбираем страницы $p = new pagesQuery('f'); $p -> include_tmpl('t','t.*'); $p -> include_modules('m','m.*'); $p -> orderby_mid('ASC'); $p -> where_mpath($_POST['filter_module']); $p -> where_main_rows(); // сортировка указанная пользователем if ( !empty($_REQUEST['orderby_key']) ){ $p -> $_REQUEST['orderby_key']( $_REQUEST['orderby_value']); }else{ $p -> orderby_active('ASC'); } $p -> get(' f.f_id,f.f_name, f.f_meta_title, f.f_active,f.f_id AS count_blocks, f.f_id AS blocks_url, f.f_id as lang_links' ,false); $modules= array(); while( $row = $p -> row() ){ if ( !isset($modules[$row['m_id']]) ){ $modules[$row['m_id']] = arr_to_obj($row); } $modules[$row['m_id']] -> pages[$row['f_id']]=arr_to_obj($row); } $t -> modules = $modules; $GLOBALS['_RESULT']['content'] = $t -> execute(); exit(); } /** * Обновляем страницу id * */ private function ajax_update(){ sys_block_disable(); // загружаем модуль из базы $m = modules::load_id($_REQUEST['id']); if ( false===$m ){ sys_error(ERROR_501,A_EMPTY_ID); } if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/info.php') ){ sys_error(ERROR_501,A_NOT_FOUND_FILE); } include_once(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/lang/'.MAIN_LANG.'/lang.php'); include_once(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/info.php'); if ( !is_array($m_info) || sizeof($m_info)==0 ){ sys_error(ERROR_501,M_ADMIN_BAD_INFO_FILE); } // обновляем имя $m -> set('m_name',$m_info['name']); if ( !$m -> update() ){ sys_error(ERROR_501,$m -> error() ); } // выполняем установку include_once( MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/inc/system.php'); $f = $m -> path().'_setup'; if ( function_exists($f) ){ if (false===$f() ) { sys_error(ERROR_501, 'ошибка установки модуля '); } } $setup_pages = array(); // перебираем страницы foreach( $m_info['page'] as $k=>$v ){ // загружаем страницу $k $p = pages::load_pname($k); // если страницы нет, то вставляем новую страницу if ( false===$p){ $p = pages::create(); $p -> set('f_active',1); $p -> set('f_name',$v); $p -> set('p_name',$k); $p -> set('m_dirname',$m -> path()); $p -> set('m_id',$m -> id() ); $p -> set('f_func',$k); $p -> set('lang',MAIN_LANG); $p_id = $p -> insert(); if ( false===$p_id ){ sys_error(ERROR_501, $p -> error() ); } $p -> set('link_id',$p_id); $p -> update(); pages::add_langs($p_id); $setup_pages[]=$k; }else{ // обновляем старую страницу $p -> set('f_name',$v); $p -> set('p_name',$k); $p -> set('m_dirname',$m -> path()); $p -> set('m_id',$m -> id() ); $p -> set('f_func',$k); $p_id = $p -> update(); if ( false===$p_id ){ sys_error(ERROR_501, $p -> error() ); } pages::add_langs($p_id); $setup_pages[]=$k; } } unset($p); // полчим список страниц модуля id $pages = new pagesQuery('p'); $pages -> where_mid($_REQUEST['id']); $pages -> get('f_id,p_name'); while( $row = $pages -> row() ){ // страница присутствует в обновлённом модуле, значит пропускаем её if ( in_array($row['p_name'],$setup_pages) ){ continue; } $row['obj_page'] = pages::load_id($row['f_id']) ; if ( false===$row['obj_page'] ){ sys_error(ERROR_501,$row['obj_page'] -> error() ); } // удаляем страницу $row['obj_page'] -> delete(); } // пишем в базу блоки модуля $setup_blocks = array(); foreach( $m_info['block'] as $block ){ $b = blocks::query('b'); $b -> where_parser_name($block['parser_name']); $b -> where_path( $m -> path() ); // $b -> set_debug(1); if ( !$b -> get('COUNT(*)',false) ){ die( $b -> error() ); } list($count) = $b -> row(); if ( $count>0 ){ $setup_blocks[]=$block['parser_name']; continue; } $p = blocks::create(); $p -> set('b_name',$block['name']); $p -> set('m_path',$m -> path() ); $p -> set('b_func',$block['file']); $p -> set('b_parser_name',$block['parser_name']); //$p -> set_debug(1); if ( !$p -> insert() ){ sys_error( ERROR_500, $p -> error() ); } $setup_blocks[]=$block['parser_name']; } // удаляем блоки которые остались за бортом $b = blocks::query('b'); $b -> where_path( $m -> path() ); $b -> get('b.b_id,b.b_parser_name',false); while( list($b_id,$b_parser_name) = $b -> row() ){ if ( in_array($b_parser_name,$setup_blocks) ){ // пропускаем блоки, которые только что были установленны continue; } $bl = blocks::load_id($b_id) ; if ( false===$bl ){ sys_error(ERROR_500,$bl -> error() ); } $bl -> delete(); } // удалим все старые плагины include_once(M_PATH.'/inc/class.plugins.php'); $p = new pluginsQuery('p'); $p -> where_module( $m -> path() ); $p -> get('plugin_id,name'); while( $row = $p -> row() ){ if ( empty($m_info['plugin'][ $row['name'] ]) ){ $p = plugins::load_id( $row['plugin_id']); $p -> delete(); } } // обнови и добавим новые foreach( $m_info['plugin'] as $pl_name => $pl_desc ){ $p = new pluginsQuery('p'); $p -> where_name($pl_name); $p -> where_module( $m -> path() ); $p -> get('plugin_id'); if ( $p -> get_count_rows()>0 ){ // обновляем старый плагин list($plugin_id) = $p -> row(); $pl = plugins::load_id($plugin_id); $pl -> set('desc',$pl_desc); $pl -> update(); }else{ // добавляем новый плагин $pl = plugins::create(); $pl -> set('desc',$pl_desc); $pl -> set('name',$pl_name); $pl -> set('path',$m -> path() ); $pl -> insert(); } } exit(); } /** * удаляем модуль id */ private function ajax_delete(){ sys_block_disable(); $m = modules::load_id($_REQUEST['id']); if ( false===$m ){ sys_error(ERROR_501, A_EMPTY_ID ); } $m -> delete(); exit(); } /** * удаляем страницу id */ private function ajax_delete_page(){ sys_block_disable(); $m = pages::load_id($_REQUEST['id']); if ( false===$m ){ sys_error(ERROR_501, A_EMPTY_ID ); } $m -> delete(); exit(); } // форма редактирвоания странички private function ajax_edit(){ sys_block_disable(); $p = new pagesQuery('f'); $p -> where_id($_GET['id']); if ( !$p -> get('*,f_id AS group_list,t_id as tmpl_list') ){ die( $p -> get_error() ); } // формируем страницу $t = new PHPTAL( M_PATH.'/tmpl/control_pages/form.html' ); $t -> page = $p -> row(); $t -> lang_edit = false; // редактируем ключевую запись $t -> link_id =$_GET['id']; $t -> lang = !empty($_GET['lang']) ? $_GET['lang'] : MAIN_LANG; echo 'Редактировать execute().']]>'; //$GLOBALS['_RESULT']['content'] = $t -> execute(); //$GLOBALS['_RESULT']['title'] = 'Редактировать страницу'; exit(); } private function ajax_lang_edit(){ sys_block_disable(); $t = new PHPTAL( M_PATH.'/tmpl/control_pages/form.html' ); $t -> lang_edit = true; // редактируем ключевую запись $p = new pagesQuery('p'); //$p -> set_debug(1); $p -> where_link($_GET['id']); $p -> where_lang($_GET['lang']); $p -> get('*, f_id AS group_list,t_id as tmpl_list'); $row = $p -> row(); $t -> page = $row; $t -> lang = !empty($_GET['lang']) ? $_GET['lang'] : MAIN_LANG; $t -> link_id = $_GET['id']; echo ''.M_ADMIN_SP_ADD_EDIT_PAGE.' execute().']]>'; exit(); } // сохранение формы редактирования странички $_REQUEST['id'] private function ajax_save(){ sys_block_disable(); // загружаем из базы страничку $_REQUEST['f_id'] $p = pages::load_id($_POST['f_id']); //$p -> set_debug(1); if ( false===$p ){ die( A_EMPTY_ID ); } // обновляем её foreach( $_POST['form'] as $k=>$v ){ $p -> set($k,$v); } $id = $p -> update(); // обновляем права доступа к страничке $p -> set_group($_POST['groups']); // обновляем морду $GLOBALS['_RESULT']['msg'] = 'Изменения сохранены'; exit(); } /** * выдаёт информацию о странице * */ private function ajax_info(){ $p = new pagesQuery('q'); //$p -> set_debug(1); if (false===$p -> where_pname($_GET['page']) ){ sys_error(ERROR_500,'Ошибка: нет страницы "'.$_GET['page'].'"'); } $p -> include_tmpl('t','t.t_name'); $p -> get('q.*,q.t_id as count_blocks'); $row = $p -> row(); $t = new PHPTAL( ); $t -> setSnippet('admin','ajax_info'); $t -> row =$row; $GLOBALS['_RESULT']['content'] = $t -> execute(); $GLOBALS['_RESULT']['title'] = 'Информация о странице'; exit(); } /** * редактирует шаблон * */ private function ajax_tmpl(){ $p = new pagesQuery('q'); $p -> where_pname($_GET['page']); $p -> include_tmpl('t','t.t_id,t.t_content'); $p -> get(false); $row = $p -> row(); $t = new PHPTAL( ); $t -> setSnippet('admin','ajax_tmpl'); $t -> row =$row; $GLOBALS['_RESULT']['content'] = $t -> execute(); $GLOBALS['_RESULT']['title'] = 'Шаблон'; exit(); } /** * редактирует шаблон * */ private function ajax_tmpl_save(){ include_once(M_PATH.'/inc/class.tmpl.php'); $p = tmpl::load_id($_POST['t_id']); $p -> set('t_content',$_POST['tmpl']); $p -> update(); /*$p = new pagesQuery('q'); $p -> where_pname($_GET['page']); $p -> include_tmpl('t','t.t_path'); $p -> get(false); $row = $p -> row(); file_put_contents(MAIN_SOURCE_PATH.'/tmpl/'.$row['t_path'],$_POST['tmpl'] ); */ exit(); } /************************/ // проверяем, нет ли новых модулей. Если есть, то заносим их в базу private function inc_check_new_modules(){ global $MAIN_DB; if ( !$handle = opendir(MAIN_SOURCE_PATH.'/modules') ) { return false; } // перебираем всё в папке modules while (false !== ($path = readdir($handle) ) ) { // ищем модуль path в базе данных $m = new m_query('m'); if ( !$m -> where_path($path) ){ continue; } //$m -> set_debug(1); $m -> get('COUNT(*)'); list($exists) = $m -> row(); if ( !empty($exists) ){ continue; } if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$path.'/info.php') ){ continue; } include_once(MAIN_SOURCE_PATH.'/modules/'.$path.'/lang/'.MAIN_LANG.'/lang.php'); include_once(MAIN_SOURCE_PATH.'/modules/'.$path.'/info.php'); if ( !is_array($m_info) || sizeof($m_info)==0 ){ continue; } // пишем в базу новый модуль $m = modules::create( ); $m -> set('m_status',1); $m -> set('m_name',$m_info['name']); $m -> set('m_path',$path); // ставим модуль в конец списка $mq = new m_query('m'); $mq -> get(' MAX(m_pos) '); list($max_pos) = $mq -> row(); $max_pos++; $m -> set('m_pos',$max_pos); //$m -> set_debug(1); $m_id = $m -> insert(); if ( false===$m_id ){ return false; } // пишем в базу страницы модуля foreach( $m_info['page'] as $page => $name ){ $p = pages::create(); $p -> set('f_name',$name); $p -> set('p_name',$page); $p -> set('m_dirname',$path); $p -> set('m_id',$m_id); $p -> set('f_func',$page); $id = $p -> insert(); //$p -> set_debug(1); $p -> set('link_id',$id); $p -> update(); } // пишем в базу блоки модуля foreach( $m_info['block'] as $block ){ $p = blocks::create(); $p -> set('b_name',$block['name']); $p -> set('m_path',$path); $p -> set('b_func',$block['file']); $p -> set('b_parser_name',$block['parser_name']); //$p -> set_debug(1); if ( !$p -> insert() ){ sys_error( '500', $p -> error() ); } } } return true; } } ?>