* @copyright: Copyright (c) 2010, Bunzia Alexander * @version: 1.0 * @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL * @package: HiLo CMS */ /** * Управление страницами * */ class admin_control_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; } 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.*, m.m_name as module_title'); $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); $t -> modules = $p -> rows(); $t -> new_modules = filedsGetPages::new_modules(); $t -> active_modules_ul = filedsGetPages::active_modules_ul(); return $t -> execute(); } private function reload(){ sys_block_disable(); $t = new PHPTAL( M_PATH.'/tmpl/control_pages/inc/page_row.html' ); $t -> execute = true; $p = new pagesQuery('f'); //$p -> set_debug(1); $p -> include_tmpl('t','t.*'); $p -> include_modules('m','m.*, m.m_name as module_title'); $p -> orderby_mid('ASC'); $p -> where_mpath($_POST['where_module']); $p -> where_main_rows(); // сортировка указанная пользователем if ( !empty($_POST['orderby_key']) ){ $p -> $_POST['orderby_key']( $_POST['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); $t -> modules = $p -> rows(); if ( !empty($_POST['filter_module']) ){ $t -> new_modules = false; }else{ $t -> new_modules = filedsGetPages::new_modules(); } HL::ajaxContent( $t -> execute() ); } /** * Обновляем модуль * */ private function update(){ sys_block_disable(); // загружаем модуль из базы try{ $m = modules::load_id($_POST['id']); if ( false===$m ){ throw new Exception(A_EMPTY_ID); } if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$m -> path().'/info.php') ){ throw new Exception(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 ){ throw new Exception(M_ADMIN_BAD_INFO_FILE); } // обновляем имя $m -> set('m_name',$m_info['name']); if ( !$m -> update() ){ throw new Exception( $m -> error() ); } // перебираем страницы $setup_pages = array(); foreach( $m_info['page'] as $k=>$v ){ $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 ){ throw new Exception( $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 ){ throw new Exception( $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'] ){ throw new Exception( $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) ){ throw new Exception( $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() ){ throw new Exception( $p -> error() ); } $setup_blocks[]=$block['parser_name']; }//foreach // удаляем блоки которые остались за бортом $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 ){ throw new Exception( $bl -> error() ); } $bl -> delete(); } }catch( Exception $e ){ HL::ajaxError( $e -> getMessage() ); } self::reload(); exit(); } private function install(){ global $MAIN_DB; sys_block_disable(); try{ $path = $_POST['id']; if ( false===modules::is_path($path) ){ throw new Exception('Ошибка: неверное название папки содержащей модулем!'); } if ( true===modules::exists_module($path) ){ throw new Exception('Ошибка: модуль "'.$path.'" уже установлен!'); } if ( !file_exists(MAIN_SOURCE_PATH.'/modules/'.$path.'/info.php') ){ throw new Exception( 'Ошибка: модуль "'.$path.'" не содержит системного файла info.php!' ); } 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 ){ throw new Exception( 'Ошибка: модуль "'.$path.'" содержит системнsq файл info.php неверного формата!' ); } // установим модуль $m = modules::create(); //$m -> set_debug(1); $m -> set('m_path',$path); $m -> set('m_status',1); $m -> set('m_name',$m_info['name']); $id = $m -> insert(); $m -> set('m_pos',$id); $m -> update(); $m -> installPages($m_info['page']); $m -> installBlocks($m_info['blocks']); if ( false===$MAIN_DB -> importFile(MAIN_SOURCE_PATH.'/modules/'.$path.'/'.$m_info['sql'] ) ){ throw new Exception( 'Ошибка: не удалось импортировать sql инструкции модуля "'.$path.'"!' ); } }catch( Exception $e ){ if ( false!==$m ){ $m -> delete(); } HL::ajaxError( $e -> getMessage() ); } self::reload(); exit(); } /** * удаляем модуль id */ private function delete(){ sys_block_disable(); $m = modules::load_id($_POST['id']); if ( false===$m ){ HL::ajaxError(A_EMPTY_ID ); } $m -> delete(); self::reload(); 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(); self::reload(); exit(); } // форма редактирвоания странички private function edit(){ sys_block_disable(); $p = new pagesQuery('f'); $p -> where_id($_POST['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 =$_POST['id']; $t -> lang = !empty($_POST['lang']) ? $_POST['lang'] : MAIN_LANG; HL::ajaxWindow( 'Редактировать',$t -> execute() ); 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(); } /** * сохранение формы редактирования странички * */ private function save(){ sys_block_disable(); try{ $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']); }catch( Exception $e ){ HL::ajaxError( $e -> getMessage() ); } self::reload(); 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(); } /************************/ } //end class