<?php

	/**
	 * AVE.cms
	 *
	 * @package AVE.cms
	 * @version 3.x
	 * @filesource
	 * @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
	 *
	 */

	/**
	 * Подключаем файл шаблонизатора Smarty
	 */
	require(BASE_DIR . '/lib/Smarty/Smarty.class.php');

	/**
	 * Расширение класса шаблонизатора Smarty
	 *
	 */
	class AVE_Template extends Smarty
	{
	/**
	 *	СВОЙСТВА
	 */

		/**
		 * Конструктор
		 *
		 * @param string $template_dir путь к директории шаблонов по умолчанию
		 * @return AVE_Template
		 */
		function __construct($template_dir)
		{
			/**
			 * Путь к директории шаблонов по умолчанию.
			 * Если вы не передадите тип ресурса во время подключения файлов, они будут искаться здесь.
			 */
			$this->template_dir = $template_dir;

			/**
			 * Имя каталога, в котором хранятся компилированные шаблоны.
			 */
			$this->compile_dir = BASE_DIR . '/tmp/cache/smarty';

			/**
			 * Имя каталога, в котором хранится кэш.
			 */
			$this->cache_dir_root = BASE_DIR . '/tmp/cache';

			/**
			 * Имя каталога, в котором хранится кэш шаблонов.
			 */
			$this->cache_dir = BASE_DIR . '/tmp/cache/tpl';

			/**
			 * Имя каталога, в котором хранится кэш модулей.
			 */
			$this->module_cache_dir = BASE_DIR . '/tmp/cache/module';

			/**
			 * Имя каталога, в котором хранится сессии пользователей.
			 */
			$this->session_dir = BASE_DIR . '/tmp/session';

			/**
			 * Имя каталога, в котором хранится сессии пользователей.
			 */
			$this->sql_cache_dir = BASE_DIR . '/tmp/cache/sql';

			/**
			 * Использование поддиректорий для хранения кэша и скомпилированных шаблонов.
			 */
			$this->use_sub_dirs = SMARTY_USE_SUB_DIRS;

			/**
			 * При каждом вызове РНР-приложения Smarty проверяет, изменился или нет текущий шаблон
			 * с момента последней компиляции. Если шаблон изменился, он перекомпилируется.
			 * В случае, если шаблон еще не был скомпилирован, его компиляция производится
			 * с игнорированием значения этого параметра.
			 */
			$this->compile_check = SMARTY_COMPILE_CHECK;

			/**
			 * Активирует debugging console - порожденное при помощи javascript окно браузера,
			 * содержащее информацию о подключенных шаблонах и загруженных переменных для текущей страницы.
			 */
			$this->debugging = SMARTY_DEBUGGING;

			/**
			 * Регистрация плагинов-функций Smarty.
			 * Передается наименование функции шаблона и имя функции, реализующей ее.
			 */
			$this->register_function('check_permission', 'check_permission');
			$this->register_function('get_home_link', 'get_home_link');
			$this->register_function('num_format', 'num_format');
			$this->register_function('thumb', 'make_thumbnail');

			/**
			 * Регистрация плагинов-модификаторов Smarty.
			 * Передается имя модификатора и имя функции, реализующей его.
			 */
			$this->register_modifier('pretty_date', 'pretty_date');
			$this->register_modifier('translate_date', 'translate_date');
			$this->register_modifier('utf8', 'utf8');

			// плагин позволяющий поставить метки шаблонов
			// для быстрого поиска шаблона отвечающего за вывод
			// перед использованием очистить cache/smarty
			// $this->register_postfilter('add_template_comment');

			/**
			 * Присваиваем общие значения для шаблонов.
			 * Можно явно передавать пары имя/значение,
			 * или ассоциативные массивы, содержащие пары имя/значение.
			 */
			$assign['BASE_DIR']          = BASE_DIR;
			$assign['ABS_PATH']          = ABS_PATH;
			$assign['DATE_FORMAT']       = DATE_FORMAT;
			$assign['TIME_FORMAT']       = TIME_FORMAT;
			$assign['PAGE_NOT_FOUND_ID'] = PAGE_NOT_FOUND_ID;

			$this->assign($assign);
		}

	/**
	 *	ВНУТРЕННИЕ МЕТОДЫ
	 */

		/**
		 * Проверка наличия одноименного шаблона в директории темы дизайна.
		 * При наличии шаблона в директории темы дизайна используется этот шаблон.
		 *
		 * @param string $tpl	путь к шаблону
		 * @return string
		 */
		function _redefine_template($tpl)
		{
			if (!defined('THEME_FOLDER')) return $tpl;

			$r_tpl = str_replace(BASE_DIR, BASE_DIR . '/templates/' . THEME_FOLDER, $tpl);

			return (file_exists($r_tpl) && is_file($r_tpl)) ? $r_tpl : $tpl;
		}

	/**
	 *	ВНЕШНИЕ МЕТОДЫ
	 */

		/**
		 * Переопределение одноименного метода Smarty
		 * для конфигурационных файлов созданных в теме дизайна.
		 *
		 * @param string $file
		 * @param string $section
		 * @param string $scope
		 */
		function config_load($file, $section = null, $scope = 'global')
		{
			Smarty::config_load($this->_redefine_template($file), $section, $scope);
		}

		/**
		 * Переопределение одноименного метода Smarty
		 * для пользовательских шаблонов созданных в теме дизайна.
		 *
		 * @param string $tpl_file name of template file
		 * @param string $cache_id
		 * @param string $compile_id
		 * @return string|false results of {@link _read_cache_file()}
		 */
		function is_cached($tpl_file, $cache_id = null, $compile_id = null)
		{
			return Smarty::is_cached($this->_redefine_template($tpl_file), $cache_id, $compile_id);
		}

		/**
		 * Переопределение одноименного метода Smarty
		 * для пользовательских шаблонов созданных в теме дизайна.
		 *
		 * @param string $resource_name
		 * @param string $cache_id
		 * @param string $compile_id
		 * @param boolean $display
		 */
		function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
		{
			return Smarty::fetch($this->_redefine_template($resource_name), $cache_id, $compile_id, $display);
		}

		/**
		 * Переопределение одноименного метода Smarty
		 * для пользовательских шаблонов созданных в теме дизайна.
		 *
		 * @param string $resource_name
		 * @param string $cache_id
		 * @param string $compile_id
		 */
		function display($resource_name, $cache_id = null, $compile_id = null)
		{
			$this->fetch($resource_name, $cache_id, $compile_id, true);
		}


		function recursivDelete($dir)
		{
			$it = new RecursiveDirectoryIterator($dir . '/');
			$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);

			foreach($files as $file)
			{
				if ($file->getFilename() === '.' || $file->getFilename() === '..')
					continue;

				if ($file->isDir())
					rmdir($file->getRealPath());
				else
					unlink($file->getRealPath());
			}

			rmdir($dir);
		}


		/**
		 * Метод очистки кэша
		 *
		 */
		function CacheClear()
		{
			global $AVE_DB, $AVE_Template;

			$message = array();

			// Метод очистки кэша
			if (isset($_REQUEST['templateCache']) && $_REQUEST['templateCache'] == '1')
			{
				// Smarty clear cache
				$this->clear_all_cache();

				foreach (glob($this->cache_dir_root . "/cache_*") as $filename)
					@unlink($filename);

				write_htaccess_deny($this->cache_dir . '/');

				// Memcached
				if (MEMCACHED_SERVER && MEMCACHED_PORT)
				{
					$m = new Memcached();
					$m->addServer(MEMCACHED_SERVER, MEMCACHED_PORT);
					$m->flush();
				}

				$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS');
				reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS_LOG'));

				// Очищаем кэш сессий в БД в таблице _sessions
				$AVE_DB->Query("
					DELETE FROM
						" . PREFIX . "_sessions
				");

				$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS');
				reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS_LOG'));
			}


			//Метод удаления скомпилированных шаблонов
			if (isset($_REQUEST['templateCompiledTemplate']) && $_REQUEST['templateCompiledTemplate'] == '1')
			{
				// Smarty compiled cache
				$this->clear_compiled_tpl();

				write_htaccess_deny($this->compile_dir . '/');

				$filename = $this->compile_dir . '/.htaccess';

				$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_CT_SUCCESS');
				reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_CT_SUCCESS_LOG'));
			}


			//Метод удаления скомпилированных шаблонов модулей
			if (isset($_REQUEST['moduleCache']) && $_REQUEST['moduleCache'] == '1')
			{
				$this->recursivDelete($this->module_cache_dir);

				mkdir($this->module_cache_dir, 0777, true);

				write_htaccess_deny($this->module_cache_dir . '/');

				$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_MC_SUCCESS');
				reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_MC_SUCCESS_LOG'));
			}


			//Метод удаления всех сессий
			if (isset($_REQUEST['sessionUsers']) && $_REQUEST['sessionUsers'] == '1')
			{
				$this->recursivDelete($this->session_dir);

				mkdir($this->session_dir, 0777, true);

				write_htaccess_deny($this->session_dir . '/');

				$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SU_SUCCESS');
				reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SU_SUCCESS_LOG'));
			}


			//Метод удаления кэша запросов
			if (isset($_REQUEST['sqlCache']) && $_REQUEST['sqlCache'] == '1')
			{
				$this->recursivDelete($this->sql_cache_dir);

				mkdir($this->sql_cache_dir, 0777, true);

				write_htaccess_deny($this->sql_cache_dir . '/');

				$message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SC_SUCCESS');
				reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SC_SUCCESS_LOG'));
			}

			echo json_encode(array($AVE_Template->get_config_vars('TEMPLATES_MESSAGE') . "<br />" . implode('<br />', $message), 'accept'));
		}


		/**
		 * Метод очистки миниатюр
		 *
		 */
		function ThumbnailsClear()
		{
			global $AVE_DB, $AVE_Template;

			$message = [];

			function rdel_thumb($dirname)
			{
				$dirs = glob("$dirname/*", GLOB_ONLYDIR|GLOB_NOSORT);

				$dir_thumb = THUMBNAIL_DIR;

				foreach ($dirs AS $dir)
				{
					$tmb = glob("$dir/$dir_thumb", GLOB_ONLYDIR|GLOB_NOSORT);

					foreach ($tmb AS $tmbs)
						rrmdir($tmbs);

					rdel_thumb($dir);
				}

				$hid_cat = (glob("$dirname/{.tmb}*", GLOB_ONLYDIR|GLOB_BRACE));

				$hid_tmb = $hid_cat[0];

				foreach (glob("$hid_cat[0]/*.png", GLOB_NOSORT) AS $filename)
					unlink("$filename");

				rrmdir(BASE_DIR . '/' . UPLOAD_DIR . '/' . THUMBNAIL_DIR);
			}

			rdel_thumb(BASE_DIR . '/' . UPLOAD_DIR);

			$message[] = $AVE_Template->get_config_vars('TEMPLATES_THUMBNAILS_SUCCESS');

			reportLog($AVE_Template->get_config_vars('TEMPLATES_THUMBNAILS_SUCCESS_LOG'));

			echo json_encode(array($AVE_Template->get_config_vars('TEMPLATES_MESSAGE') . "<br />" . implode('<br />', $message), 'accept'));
		}
	}
?>