* @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