<?php
/**
 * システム制御マネージャー
 *
 *  主にシステムの動作に関わる制御の仲介を行う
 *
 * PHP versions 5
 *
 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
 *
 * @package    Magic3 Framework
 * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
 * @copyright  Copyright 2006-2009 Magic3 Project.
 * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
 * @version    SVN: $Id: systemManager.php 2551 2009-11-14 07:44:55Z fishbone $
 * @link       http://www.magic3.org
 */
require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');		// Magic3コアクラス

class SystemManager extends Core
{
	private $_systemConfigArray = array();			// システム定義値
	private $_siteDefArray = array();			// サイト定義値
	private $defaultTemplateId;						// PC用テンプレートID
	private $defaultMobileTemplateId;				// 携帯用テンプレートID
	private $permitInitSystem;						// システム初期化可能かどうか
	private $sitePcInPublic;			// PC用サイトの公開状況
	private $siteMobileInPublic;		// 携帯用サイトの公開状況
	private $usePageCache;		// 表示キャッシュ機能を使用するかどうか
	private $pageCacheLifetime;	// 画面キャッシュの更新時間(分)
	private $useTemplateIdInSession;	// テンプレートIDをセッションに保存するかどうか
	const CF_DEFAULT_LANG = 'default_lang';			// デフォルト言語
	const CF_PERMIT_INIT_SYSTEM = 'permit_init_system';					// システム初期化可能かどうか
	const CF_PERMIT_CHANGE_LANG = 'permit_change_lang';					// 言語変更可能かどうか
	const CF_USE_TEMPLATE_ID_IN_SESSION = 'use_template_id_in_session';			// セッションのテンプレートIDを使用するかどうか
	const CF_REGENERATE_SESSION_ID = 'regenerate_session_id';			// セッションIDを毎回更新するかどうか
	const CF_SITE_PC_IN_PUBLIC = 'site_pc_in_public';				// PC用サイトの公開状況
	const CF_SITE_MOBILE_IN_PUBLIC = 'site_mobile_in_public';		// 携帯用サイトの公開状況
	const CF_USE_PAGE_CACHE = 'use_page_cache';		// 画面キャッシュ機能を使用するかどうか
	const CF_PAGE_CACHE_LIFETIME = 'page_cache_lifetime';		// 画面キャッシュの更新時間(分)
	const CF_DEFAULT_TEMPLATE			= 'default_template';			// システム定義値取得用キー(PC用デフォルトテンプレート)
	const CF_DEFAULT_TEMPLATE_MOBILE	= 'mobile_default_template';	// システム定義値取得用キー(携帯用デフォルトテンプレート)
	const DEFAULT_PAGE_CACHE_LIFETIME = 1440;		// デフォルトの画面キャッシュの更新時間(分)。1日ごと。
	
	/**
	 * コンストラクタ
	 */
	function __construct()
	{
		// 親クラスを呼び出す
		parent::__construct();
			
		// システムDBオブジェクト取得
		$this->db = $this->gInstance->getSytemDbObject();
		
		// 初期値を設定
		$this->defaultTemplateId = '';						// PC用テンプレートID
		$this->defaultMobileTemplateId = '';				// 携帯用テンプレートID
		$this->permitInitSystem		= false;			// システム初期化可能かどうか
		$this->sitePcInPublic = '1';			// PC用サイトの公開状況
		$this->siteMobileInPublic = '1';		// 携帯用サイトの公開状況
		$this->usePageCache = '0';		// 表示キャッシュ機能を使用するかどうか
		$this->pageCacheLifetime = self::DEFAULT_PAGE_CACHE_LIFETIME;	// 画面キャッシュの更新時間(分)
		$this->useTemplateIdInSession = true;	// テンプレートIDをセッションに残すかどうか
	}
	/**
	 * システム定義値を取得
	 *
	 * @param string $key    キーとなる項目値
	 * @return string		値
	 */
	function getSystemConfig($key)
	{
		$value = $this->_systemConfigArray[$key];
		if (isset($value)){
			return $value;
		} else {
			return '';
		}
	}
	/**
	 * サイト定義値を取得
	 *
	 * @param string $key    キーとなる項目値
	 * @return string		値
	 */
	function getSiteDef($key)
	{
		$value = $this->_siteDefArray[$key];
		if (isset($value)){
			return $value;
		} else {
			return '';
		}
	}
	/**
	 * システム定義値、サイト定義値をDBから取得
	 *
	 * @return bool			true=取得成功、false=取得失敗
	 */
	function _loadSystemConfig()
	{
		$this->_systemConfigArray = array();
		$this->_siteDefArray = array();

		// システム定義を読み込み
		$ret = $this->db->getAllSystemConfig($rows);
		if ($ret){
			// 取得データを連想配列にする
			$configCount = count($rows);
			for ($i = 0; $i < $configCount; $i++){
				$key = $rows[$i]['sc_id'];
				$value = $rows[$i]['sc_value'];
				$this->_systemConfigArray[$key] = $value;
			}
			// メンバー変数に再設定
			$this->defaultTemplateId		= $this->getSystemConfig(self::CF_DEFAULT_TEMPLATE);	// PC用テンプレートID
			$this->defaultMobileTemplateId	= $this->getSystemConfig(self::CF_DEFAULT_TEMPLATE_MOBILE);// 携帯用テンプレートID
			if ($this->getSystemConfig(self::CF_PERMIT_INIT_SYSTEM) == '1'){// システム初期化可能かどうか
				$this->permitInitSystem = true;
			} else {
				$this->permitInitSystem = false;
			}
			if ($this->db->getSystemConfig(self::CF_USE_TEMPLATE_ID_IN_SESSION) == '1'){// テンプレートIDをセッションに保存するかどうか
				$this->useTemplateIdInSession = true;
			} else {
				$this->useTemplateIdInSession = false;
			}
			$this->sitePcInPublic		= $this->getSystemConfig(self::CF_SITE_PC_IN_PUBLIC);			// PC用サイトの公開状況
			if ($this->sitePcInPublic == '') $this->sitePcInPublic = '1';		// デフォルトは公開
			$this->siteMobileInPublic	= $this->getSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC);	// 携帯用サイトの公開状況
			if ($this->siteMobileInPublic == '') $this->siteMobileInPublic = '1';		// デフォルトは公開
			$this->usePageCache	= $this->getSystemConfig(self::CF_USE_PAGE_CACHE);	// 表示キャッシュ機能を使用するかどうか
			if ($this->usePageCache == '') $this->usePageCache = '0';		// デフォルトはキャッシュなし
			$this->pageCacheLifetime = intval($this->getSystemConfig(self::CF_PAGE_CACHE_LIFETIME));	// 画面キャッシュの更新時間(分)
			if ($this->pageCacheLifetime < 0) $this->pageCacheLifetime = self::DEFAULT_PAGE_CACHE_LIFETIME;
		} else {
			$this->gLog->error(__METHOD__, 'DBエラー発生: システム定義(_system_config)が読み込めません。');
			return false;
		}
		
		// 言語取得
		$lang = $this->getSystemConfig(self::CF_DEFAULT_LANG);// デフォルト言語

		// サイト定義を読み込む。データが空でもエラーとしない
		$ret = $this->db->getAllSiteDefValue($lang, $rows);
		if ($ret){
			// 取得データを連想配列にする
			$defCount = count($rows);
			for ($i = 0; $i < $defCount; $i++){
				$key = $rows[$i]['sd_id'];
				$value = $rows[$i]['sd_value'];
				$this->_siteDefArray[$key] = $value;
			}
		}
		return true;
	}
	/**
	 * システム初期化可能どうかを返す
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return bool		true=システム初期化モード、false=システム初期化しない
	 */
	public function canInitSystem($reload = false)
	{
		if ($reload){
			$value = $this->db->getSystemConfig(self::CF_PERMIT_INIT_SYSTEM);			// システム初期化可能かどうか
			if ($value == '1'){
				$this->permitInitSystem = true;
			} else {
				$this->permitInitSystem = false;
			}
		}
		return $this->permitInitSystem;			// システム初期化可能かどうか
	}
	/**
	 * システム初期化可能にする
	 *
	 * @return 		なし
	 */
	public function enableInitSystem()
	{
		// データを更新
		$this->db->updateSystemConfig(self::CF_PERMIT_INIT_SYSTEM, 1);
		
		// データを再取得
		$this->canInitSystem(true);
	}
	/**
	 * システム初期化を不可にする
	 *
	 * @return 		なし
	 */
	public function disableInitSystem()
	{
		// データを更新
		$this->db->updateSystemConfig(self::CF_PERMIT_INIT_SYSTEM, 0);
		
		// データを再取得
		$this->canInitSystem(true);
	}
	/**
	 * セッションを毎回更新するかどうかを返す
	 *
	 * @return bool		true=毎回更新、false=更新しない
	 */
	public function regenerateSessionId()
	{
		$retValue = $this->getSystemConfig(self::CF_REGENERATE_SESSION_ID);
		if ($retValue == '1'){
			return true;
		} else {
			return false;
		}
	}
	/**
	 * 表示言語変更可能かどうかを取得
	 *
	 * @return bool			true=変更可能、false=変更不可
	 */
	function canChangeLang()
	{
		$retValue = $this->getSystemConfig(self::CF_PERMIT_CHANGE_LANG);
		if ($retValue == '1'){
			return true;
		} else {
			return false;
		}
	}
	/**
	 * テンプレートIDをセッションに保存するかどうかを取得
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return bool			true=変更可能、false=変更不可
	 */
	function useTemplateIdInSession($reload = false)
	{
		if ($reload){
			$retValue = $this->db->getSystemConfig(self::CF_USE_TEMPLATE_ID_IN_SESSION);
			if ($retValue == '1'){
				$this->useTemplateIdInSession = true;
			} else {
				$this->useTemplateIdInSession = false;
			}
		}
		return $this->useTemplateIdInSession;
	}
	/**
	 * デフォルトのテンプレートIDを取得
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return string	デフォルトのテンプレートID
	 */
	function defaultTemplateId($reload = false)
	{
		if ($reload){
			$this->defaultTemplateId		= $this->db->getSystemConfig(self::CF_DEFAULT_TEMPLATE);
		}
		return $this->defaultTemplateId;
	}
	/**
	 * 携帯用デフォルトのテンプレートIDを取得
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return string	デフォルトのテンプレートID
	 */
	function defaultMobileTemplateId($reload = false)
	{
		if ($reload){
			$this->defaultMobileTemplateId		= $this->db->getSystemConfig(self::CF_DEFAULT_TEMPLATE_MOBILE);
		}
		return $this->defaultMobileTemplateId;
	}
	/**
	 * デフォルトテンプレートの変更
	 *
	 * @param string  $templateId	デフォルトテンプレートID
	 * @return						true=成功、false=失敗
	 */
	function changeDefaultTemplate($templateId)
	{
		$ret = $this->db->updateSystemConfig(self::CF_DEFAULT_TEMPLATE, $templateId);
		
		// データ再取得
		$this->defaultTemplateId(true);
		return $ret;
	}
	/**
	 * 携帯用デフォルトテンプレートの変更
	 *
	 * @param string  $templateId	デフォルトテンプレートID
	 * @return						true=成功、false=失敗
	 */
	function changeDefaultMobileTemplate($templateId)
	{
		$ret = $this->db->updateSystemConfig(self::CF_DEFAULT_TEMPLATE_MOBILE, $templateId);
		
		// データ再取得
		$this->defaultMobileTemplateId(true);
		return $ret;
	}
	/**
	 * デフォルト言語を取得
	 *
	 * @param string	デフォルト言語
	 */
/*	function getDefaultLanguage()
	{
		$retValue = '';
		$queryStr = 'select sc_value from _system_config ';
		$queryStr .=  'where sc_id = ?';
		$ret = $this->selectRecord($queryStr, array('default_lang'), $row);
		if ($ret) $retValue = $row['sc_value'];
		return $retValue;
	}*/
	/**
	 * アップロード可能なファイルの最大サイズを返す
	 *
	 * @return string		バイトサイズ
	 */
	public function getMaxFileSizeForUpload()
	{	
		$limit = ini_get('upload_max_filesize') > ini_get('post_max_size') ? ini_get('post_max_size') : ini_get('upload_max_filesize');
		$limit = $limit > ini_get('memory_limit') ? ini_get('memory_limit') : $limit;
		return $limit;
	}
	/**
	 * PC用サイトを公開するかどうか
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return bool			true=公開、false=非公開
	 */
	public function sitePcInPublic($reload = false)
	{
		if ($reload){
			$this->sitePcInPublic		= $this->db->getSystemConfig(self::CF_SITE_PC_IN_PUBLIC);			// PC用サイトの公開状況
			if ($this->sitePcInPublic == '') $this->sitePcInPublic = '1';		// デフォルトは公開
		}
		return $this->sitePcInPublic;			// PC用サイトの公開状況
	}
	/**
	 * 携帯用サイトを公開するかどうか
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return bool			true=公開、false=非公開
	 */
	public function siteMobileInPublic($reload = false)
	{
		if ($reload){
			$this->siteMobileInPublic	= $this->db->getSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC);	// 携帯用サイトの公開状況
			if ($this->siteMobileInPublic == '') $this->siteMobileInPublic = '1';		// デフォルトは公開
		}
		return $this->siteMobileInPublic;			// 携帯用サイトの公開状況
	}
	/**
	 * 表示キャッシュ機能を使用するかどうか
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return bool			true=キャッシュ、false=キャッシュなし
	 */
	public function usePageCache($reload = false)
	{
		if ($reload){
			$this->usePageCache	= $this->db->getSystemConfig(self::CF_USE_PAGE_CACHE);	// 表示キャッシュ機能を使用するかどうか
			if ($this->usePageCache == '') $this->usePageCache = '0';		// デフォルトはキャッシュなし
		}
		return $this->usePageCache;
	}
	/**
	 * 画面キャッシュの更新時間
	 *
	 * @param bool $reload	再取得するかどうか
	 * @return int			キャッシュの更新時間(分)
	 */
	public function pageCacheLifetime($reload = false)
	{
		if ($reload){
			$this->pageCacheLifetime = intval($this->db->getSystemConfig(self::CF_PAGE_CACHE_LIFETIME));	// 画面キャッシュの更新時間(分)
			if ($this->pageCacheLifetime < 0) $this->pageCacheLifetime = self::DEFAULT_PAGE_CACHE_LIFETIME;
		}
		return $this->pageCacheLifetime;
	}
}
?>
