* @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;
}
}
?>