<?php
/**
* @author:  Bunzia Alexander <nifus@mail.ru> <http://www.weblancer.net/users/nifus/>
* @copyright: Copyright (c) 2010, Bunzia Alexander
* @version: 1.0
* @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @package: HiLo CMS
*/

if ( defined("inc_tmpl_class") ){
	return FALSE;
}
define("inc_tmpl_class", 1);
include_once(MAIN_SOURCE_PATH.'/modules/admin/lang/'.MAIN_LANG.'/lang.php');

	//	класс для формирования запроса
class tmpl_q extends query{


	
	public function __construct($alias){
		$this -> set_table( MAIN_TMPL_TBL );
		$this -> set_alias($alias);
	}
	
		//	связь между таблицами  system_tmpl и system_tmpl_block_link
	public function include_plb($alias,$cols=''){
		$this -> include_table( MAIN_PLB_TBL ,$alias,'t_id',$cols );
		return true;
	}
	
	public function where_id($v){
		$v = intval($v);
		if ( empty($v) ){
			return false;
		}
		return $this -> set_where( $this -> alias.'.t_id',$v);
	}
	
	
	public function orderby_tid($v){
		return $this -> set_orderby( $this -> alias.'.t_id',$v);
	}
	
	public function orderby_tname($v){
		return $this -> set_orderby( $this -> alias.'.t_name',$v);
	}


	


 
/****************************
*	
*	функции-обработчики алиасов при выборе из таблицы
*
***************************/
		
		
	static function tmpl_ul($v){
		
		$s = new select_box();
		$s -> selected_id($v);
		$s -> empty_record(false);
		$s -> opt_open('Стандартные');
		$handle = opendir(MAIN_SOURCE_PATH.'/tmpl/default/files');
		while (false !== ($file = readdir($handle))) { 
			if ( preg_match('#\.html$#iUs',$file) ){
				$s -> set('default/files/'.$file,$file );
			}
		}
		$s -> opt_close();
		$s -> opt_open('Пользовательские');
		$handle = opendir(MAIN_SOURCE_PATH.'/tmpl/project/html');
		while (false !== ($file = readdir($handle))) { 
			if ( preg_match('#\.html$#iUs',$file) ){
				$s -> set('project/html/'.$file,$file );
			}
		}
		$s -> opt_close();
		return $s -> get();
	}

		//	считаем сколько блоков задействовано в шаблоне с номером id
	protected function count_blocks($id){
	global $MAIN_DB;
	  $sql = "SELECT COUNT(*) FROM ".$MAIN_DB -> prefix("system_tmpl_block_link")."  WHERE t_id = '$id'";
		list($count) = $MAIN_DB -> fetch_array( $MAIN_DB -> query($sql) );
		return $count;
	}

	/**
	*	Выпадающий список шаблонов
	*
	*/
	static function tmplSelect($v){
		
		$s = new select_box();
		$s -> selected_id($v);
		$s -> empty_record(false);
		
		$t = new tmpl_q('t');
	  $t -> get('t_id,t_name');
	  $rows = array();
	  while( $row = $t -> row() ){
	    $s -> set($row['t_id'],$row['t_name'] );
	  }
		return $s -> get();
	}
	
	/**
  * Ссылка на блоки расположеные на странички v
  *
  * @var: int $v Номер страницы
  * @return: str Url-адрес
  */
	protected function blocks_url($v){
	  $v = intval($v);
		if ( empty($v) ){
			sys_error(ERROR_500);
		}
		return sys_url(URL_ADMIN_BLOCKS_FILTER,$v);
	}
	
	
}


	//	класс для управления записями таблицы system_tmpl
class tmpl{
		//	отладка запросов
	public $debug = false;
		//	массив в котором хранятся данные о текущей записе, __construct
	private $info = array();
		//	первичный ключ таблицы, __construct
	private $main_key = false;
		//	массив изменённых данных о текущей записи
	private $set_info = array();
		//	последняя  ошибка
	private $last_error=false;
	

		//	вызвается только внутри класса
		//	для создания объекта используются публичные статичные методы load_id / create
	private function __construct( $array=array() ){
		$this -> info = $array;
		$this -> main_key = $array['t_id'];
	}
	
		//	обновляем запись $this -> main_key в таблице system_tmpl
	public function update(){
	global $MAIN_DB;
			//	ну мало-ли, бывает и такое
		if ( false===$this -> main_key ){
			sys_error('500',A_EMPTY_ID);
		}
			//	если при установки столбцов для обновления произошла ошибка, то запрос выполнять не будем
		if ( false!==$this -> error() ){
			return false;
		}
			//	обновлять нечего, даже без mysql-я я вам скажу что будет хуйня
		if ( sizeof($this -> set_info)==0 ){
			sys_error('500',A_EMPTY_ARRAY);
		}
			//	формируем запрос
		$sql = array();
		foreach( $this -> set_info as $k=>$v ){
			$sql[]="`$k`='".sys_in_sql($v)."'";
		}
			
			//	выполняем запрос, отправляем ключ на родину
			//	нет проверки нау спешность выполнения запроса потому-что это под контролем класса $MAIN_DB
		$sql = "
			UPDATE ".MAIN_TMPL_TBL." 
			SET ".implode(',',$sql)." 
			WHERE t_id='".$this -> main_key."'";
		if ( !empty($this -> debug) ){
			die($sql);
		}
		$MAIN_DB -> query($sql);
		return $this -> main_key;
	}
	
		//	добавление новой записи в таблицу  system_tmpl
	public function insert(){
	global $MAIN_DB;
			//	если при установки столбцов для обновления произошла ошибка, то запрос выполнять не будем
		if ( false!==$this -> error() ){
			return $this -> error();
		}
		
			//	обновлять нечего, даже без mysql-я я вам скажу что будет хуйня
		if ( sizeof($this -> set_info)==0 ){
			sys_error('500',A_EMPTY_ARRAY);
		}
		
			//	формируем и выполняем запрос
		$sql = array();
		foreach( $this -> set_info as $k=>$v ){
			$sql[]="`$k`='".sys_in_sql($v)."'";
		}
		$sql = "INSERT INTO ".MAIN_TMPL_TBL." SET ".implode(',',$sql)."";
		if ( !empty($this -> debug) ){
			die($sql);
		}
		$MAIN_DB -> query($sql);
		return $MAIN_DB -> insert_id();
	}
	
		//	удаляем запись $this -> main_key в таблице system_tmpl
	public function delete(){
	global $MAIN_DB;
			//	получаем запись
		$id = $this -> id();
			//	бывает же такая хуйня!
		if ( empty($id) ){
			sys_error('500',A_EMPTY_ID);
		}
			//	чистим обе таблицы
		$sql = "DELETE FROM ".MAIN_TMPL_TBL." WHERE t_id='$id'";
		$MAIN_DB -> query($sql);
		
		$sql = "DELETE FROM ".MAIN_PLB_TBL." WHERE t_id='$id'";
		$MAIN_DB -> query($sql);
		return true;
	}
	
		//	выдаёт значение столбца $k в обрабатываемой строке
	public function get($k){
		if ( isset($this -> info[$k]) ){
			return $this -> info[$k];
		} 
		sys_error('500', sprintf(A_NOT_VAR,$k) );
	}
	
		//	задаёт  значение столбца $k в обрабатываемой строке
	public function set($k,$v){
		if ( method_exists($this,'set_'.$k) ){
			$f = 'set_'.$k;
			return $this -> $f($v);
		}
		$this -> set_info[$k] = $v;
		return true;
	}
		//	отладка запросов insert/update
	public function set_debug($flag){
		$this -> debug = $flag;
	}
	
	public function del_block($v){
	global $MAIN_DB;
		$v = intval($v);
		if ( empty($v) ){
			sys_error('500');
		}
		$sql = "DELETE  FROM ".MAIN_PLB_TBL." 
				WHERE t_id='".$this -> id()."' AND id='".$v."'";
		$MAIN_DB -> query($sql);
		return true;	
	}
	
	public function add_block($b_id,$item){
	global $MAIN_DB;
	  include_once(MAIN_SOURCE_PATH.'/modules/admin/inc/class.blocks.php');
	  $b = blocks::load_id($b_id);
	  if ( false===$b ){
			sys_error('500');
		}
		$sql = "INSERT INTO ".MAIN_PLB_TBL." SET 
					t_id='".$this -> id()."',
					b_id='".$b_id."',
					var='".$item."',
					title='".sys_in_sql($b -> title() )."'
					";
		return $MAIN_DB -> query($sql);
			
	}
/********************************	
	SET - функции. Это уникальные обработчики для значений заносимых в базу данных.
		
	
********************************/	
	
	
	public function set_t_name($v){
		if ( empty($v) ){
			$this -> make_error(ERROR_MESSAGE,M_ADMIN_TMPL_NAME_EMPTY);
			return false;
		}
		$this -> set_info['t_name']=$v;
		return true;
	}
	
	public function set_t_path($v){
		if ( empty($v) ){
			$this -> make_error(ERROR_MESSAGE,M_ADMIN_TMPL_PATH_EMPTY);
			return false;
		}
		//echo MAIN_SOURCE_PATH.'/tmpl/'.$v;
		/*if ( !sys_is_file($v) ){
			$this -> make_error(ERROR_MESSAGE,M_ADMIN_TMPL_PATH_FALSE);
			return false;
		}*/
		
		if ( !file_exists(MAIN_SOURCE_PATH.'/tmpl/'.$v) ){
			$this -> make_error(ERROR_MESSAGE,M_ADMIN_TMPL_PATH_FALSE);
			return false;
		}
		$this -> set_info['t_path']=$v;
		return true;
	}
	
	

	

	
	
/*********************
*	
*	GET	- функции
*
*****************/
	
	public function id(){
		return $this -> info['t_id']; 
	}
	public function path(){
		return $this -> info['t_path']; 
	}

/********************
*		
*	СТАТИЧНЫЕ ФУНКЦИИ
*		
********************/
	
		//	загрузка модуля по его id
	static function load_id($id){
		
		$m = new tmpl_q('m');
		if ( !$m -> where_id($id) ){
			return false;
		}
		$m -> get('*');
		if (  $m -> get_count_rows()==0 ){
			return FALSE;
		}
		return new tmpl($m -> row());
	}
	
			//	загрузка модуля по его id
	static function create(){
		return new tmpl( array('t_id'=>0) );
	}
	
	/**
	* Получаем все шаблоны зарегистрированные в системе
	*
	* @return: array Список шаблонов зарегистрированных в системе
	*/
	static function get_list(){
	  $t = new tmpl_q('t');
	  //$t -> set_debug(1);
	  $t -> get('*');
	  $rows = array();
	  while( $row = $t -> row() ){
	    $rows[]=$row;
	  }
	  return $rows;
	}
	
	/**
	* Получаем список шаблонов в которох выводится указанный блок
	*
	* @var: $v int Уникальный номер блока в базе данных 
	* @return: array Список шаблонов  в которох выводится указанный блок
	*/
	static function get_list_tmpl($v){
	global $MAIN_DB;
	  $v = intval($v);
	  if ( empty($v) ){
	    sys_error(ERROR_500);
	  }
	  $sql = "SELECT t_id FROM ".MAIN_PLB_TBL." WHERE b_id='$v'";
	  $res = $MAIN_DB -> query($sql);
	  $rows = array();
	  while( list($t_id) = $MAIN_DB -> fetch_array($res) ){
	    $rows[]=$t_id;
	  }
	  return $rows;
	}	
	
	/**
	* Удалим все упоминания о блоке из таблицы связей
	*
	* @var: $v int Уникальный номер блока в базе данных 
	* @return: bool
	*/
	static function clear_tmpl($v){
	global $MAIN_DB;
	  $sql = "DELETE FROM ".MAIN_PLB_TBL." WHERE b_id='$v'";
	  $MAIN_DB -> query($sql);
	    //  очищаем кэш таблицы тут...
	  return true;
	}
/*****************
*
*	Обработка ошибок
*
******************/	

	private function make_error($type,$msg){
		$info = debug_backtrace();
		$line = $info[1]['line'];
		$file = $info[1]['file'];
		switch($type){
			
			case(ERROR_MESSAGE):
				$this -> last_error = $msg;
				break;
		}
	}
	
			//	возвращаем последнюю ошибку
	public function error(){
  		return $this -> last_error;
	}
	
	
	
		
	
	
	
}

?>
