5 * 主にシステムの動作に関わる制御の仲介を行う
9 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
11 * @package Magic3 Framework
12 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
13 * @copyright Copyright 2006-2013 Magic3 Project.
14 * @license http://www.gnu.org/copyleft/gpl.html GPL License
15 * @version SVN: $Id: systemManager.php 6173 2013-07-16 02:23:00Z fishbone $
16 * @link http://www.magic3.org
18 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php'); // Magic3コアクラス
20 class SystemManager extends Core
22 private $_systemConfigArray = array(); // システム定義値
23 private $_siteDefArray = array(); // サイト定義値
24 private $defaultAdminTemplateId; // 管理画面用テンプレートID
25 private $defaultTemplateId; // PC用テンプレートID
26 private $defaultMobileTemplateId; // 携帯用テンプレートID
27 private $defaultSmartphoneTemplateId; // スマートフォン用テンプレートID
28 private $adminDefaultTheme; // 管理画面用jQueryUIテーマ
29 private $permitInitSystem; // システム初期化可能かどうか
30 private $siteInPublic; // Webサイトの公開状況
31 private $sitePcInPublic; // PC用サイトの公開状況
32 private $siteMobileInPublic; // 携帯用サイトの公開状況
33 private $siteSmartphoneInPublic; // スマートフォン用サイトの公開状況
34 private $mobileAutoRedirect; // 携帯の自動遷移
35 private $smartphoneAutoRedirect; // スマートフォンの自動遷移
36 private $usePageCache; // 表示キャッシュ機能を使用するかどうか
37 private $pageCacheLifetime; // 画面キャッシュの更新時間(分)
38 private $useTemplateIdInSession; // テンプレートIDをセッションに保存するかどうか
39 private $acceptLanguage; // アクセス可能言語
40 private $systemLanguages; // システムで利用可能な言語
41 private $hierarchicalPage; // 階層化ページを使用するかどうか
42 const CF_DEFAULT_LANG = 'default_lang'; // デフォルト言語
43 const CF_PERMIT_INIT_SYSTEM = 'permit_init_system'; // システム初期化可能かどうか
44 const CF_PERMIT_CHANGE_LANG = 'permit_change_lang'; // 言語変更可能かどうか
45 const CF_USE_TEMPLATE_ID_IN_SESSION = 'use_template_id_in_session'; // セッションのテンプレートIDを使用するかどうか
46 const CF_REGENERATE_SESSION_ID = 'regenerate_session_id'; // セッションIDを毎回更新するかどうか
47 const CF_SITE_IN_PUBLIC = 'site_in_public'; // Webサイトの公開状況
48 const CF_SITE_PC_IN_PUBLIC = 'site_pc_in_public'; // PC用サイトの公開状況
49 const CF_SITE_MOBILE_IN_PUBLIC = 'site_mobile_in_public'; // 携帯用サイトの公開状況
50 const CF_SITE_SMARTPHONE_IN_PUBLIC = 'site_smartphone_in_public'; // スマートフォン用サイトの公開状況
51 const CF_USE_PAGE_CACHE = 'use_page_cache'; // 画面キャッシュ機能を使用するかどうか
52 const CF_PAGE_CACHE_LIFETIME = 'page_cache_lifetime'; // 画面キャッシュの更新時間(分)
53 const CF_DEFAULT_TEMPLATE = 'default_template'; // システム定義値取得用キー(PC用デフォルトテンプレート)
54 const CF_DEFAULT_TEMPLATE_MOBILE = 'mobile_default_template'; // システム定義値取得用キー(携帯用デフォルトテンプレート)
55 const CF_DEFAULT_TEMPLATE_SMARTPHONE = 'smartphone_default_template'; // システム定義値取得用キー(スマートフォン用デフォルトテンプレート)
56 const CF_ADMIN_DEFAULT_THEME = 'admin_default_theme'; // 管理画面用jQueryUIテーマ
57 const CF_DEFAULT_THEME = 'default_theme'; // 一般画面用jQueryUIテーマ
58 const CF_ACCEPT_LANGUAGE = 'accept_language'; // アクセス可能言語
59 const CF_ADMIN_DEFAULT_TEMPLATE = 'admin_default_template'; // 管理用デフォルトテンプレート
60 const CF_MOBILE_AUTO_REDIRECT = 'mobile_auto_redirect'; // 携帯の自動遷移
61 const CF_SMARTPHONE_AUTO_REDIRECT = 'smartphone_auto_redirect'; // スマートフォンの自動遷移
62 const CF_HIERARCHICAL_PAGE = 'hierarchical_page'; // 階層化ページを使用するかどうか
63 const DEFAULT_PAGE_CACHE_LIFETIME = 1440; // デフォルトの画面キャッシュの更新時間(分)。1日ごと。
68 function __construct()
71 parent::__construct();
74 $this->db = $this->gInstance->getSytemDbObject();
77 $this->defaultAdminTemplateId = ''; // 管理画面用テンプレートID
78 $this->defaultTemplateId = ''; // PC用テンプレートID
79 $this->defaultMobileTemplateId = ''; // 携帯用テンプレートID
80 $this->defaultSmartphoneTemplateId = ''; // スマートフォン用テンプレートID
81 $this->adminDefaultTheme = ''; // 管理画面用jQueryUIテーマ
82 $this->permitInitSystem = false; // システム初期化可能かどうか
83 $this->siteInPublic = '1'; // Webサイトの公開状況
84 $this->sitePcInPublic = '1'; // PC用サイトの公開状況
85 $this->siteMobileInPublic = '1'; // 携帯用サイトの公開状況
86 $this->siteSmartphoneInPublic = '1'; // スマートフォン用サイトの公開状況
87 $this->mobileAutoRedirect = '0'; // 携帯の自動遷移
88 $this->smartphoneAutoRedirect = '0'; // スマートフォンの自動遷移
89 $this->usePageCache = '0'; // 表示キャッシュ機能を使用するかどうか
90 $this->pageCacheLifetime = self::DEFAULT_PAGE_CACHE_LIFETIME; // 画面キャッシュの更新時間(分)
91 $this->useTemplateIdInSession = true; // テンプレートIDをセッションに残すかどうか
92 $this->acceptLanguage = array(); // アクセス可能言語
93 $this->systemLanguages = array('ja', 'en'); // システムで利用可能な言語
94 $this->hierarchicalPage = false; // 階層化ページを使用するかどうか
99 * @param string $key キーとなる項目値
102 function getSystemConfig($key)
104 $value = $this->_systemConfigArray[$key];
114 * @param string $key キーとなる項目値
115 * @param string $value 値
116 * @return true = 正常、false=異常
118 function updateSystemConfig($key, $value)
120 $ret = $this->db->updateSystemConfig($key, $value);
121 if ($ret) $this->_systemConfigArray[$key] = $value;
127 * @param string $key キーとなる項目値
130 function getSiteDef($key)
132 $value = $this->_siteDefArray[$key];
140 * システム定義値、サイト定義値をDBから取得
142 * @return bool true=取得成功、false=取得失敗
144 function _loadSystemConfig()
146 $this->_systemConfigArray = array();
147 $this->_siteDefArray = array();
150 $ret = $this->db->getAllSystemConfig($rows);
153 $configCount = count($rows);
154 for ($i = 0; $i < $configCount; $i++){
155 $key = $rows[$i]['sc_id'];
156 $value = $rows[$i]['sc_value'];
157 $this->_systemConfigArray[$key] = $value;
160 $this->defaultAdminTemplateId = $this->getSystemConfig(self::CF_ADMIN_DEFAULT_TEMPLATE); // 管理画面用テンプレートID
161 $this->defaultTemplateId = $this->getSystemConfig(self::CF_DEFAULT_TEMPLATE); // PC用テンプレートID
162 $this->defaultMobileTemplateId = $this->getSystemConfig(self::CF_DEFAULT_TEMPLATE_MOBILE);// 携帯用テンプレートID
163 $this->defaultSmartphoneTemplateId = $this->getSystemConfig(self::CF_DEFAULT_TEMPLATE_SMARTPHONE); // スマートフォン用テンプレートID
164 $this->adminDefaultTheme = $this->getSystemConfig(self::CF_ADMIN_DEFAULT_THEME); // 管理画面用jQueryUIテーマ
165 if ($this->getSystemConfig(self::CF_PERMIT_INIT_SYSTEM) == '1'){// システム初期化可能かどうか
166 $this->permitInitSystem = true;
168 $this->permitInitSystem = false;
170 if ($this->db->getSystemConfig(self::CF_USE_TEMPLATE_ID_IN_SESSION) == '1'){// テンプレートIDをセッションに保存するかどうか
171 $this->useTemplateIdInSession = true;
173 $this->useTemplateIdInSession = false;
175 $this->siteInPublic = $this->getSystemConfig(self::CF_SITE_IN_PUBLIC); // Webサイトの公開状況
176 if ($this->siteInPublic == '') $this->siteInPublic = '1'; // デフォルトは公開
177 $this->sitePcInPublic = $this->getSystemConfig(self::CF_SITE_PC_IN_PUBLIC); // PC用サイトの公開状況
178 if ($this->sitePcInPublic == '') $this->sitePcInPublic = '1'; // デフォルトは公開
179 $this->siteMobileInPublic = $this->getSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC); // 携帯用サイトの公開状況
180 if ($this->siteMobileInPublic == '') $this->siteMobileInPublic = '1'; // デフォルトは公開
181 $this->siteSmartphoneInPublic = $this->getSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC); // スマートフォン用サイトの公開状況
182 if ($this->siteSmartphoneInPublic == '') $this->siteSmartphoneInPublic = '1'; // デフォルトは公開
183 $this->mobileAutoRedirect = $this->getSystemConfig(self::CF_MOBILE_AUTO_REDIRECT); // 携帯の自動遷移
184 if ($this->mobileAutoRedirect == '') $this->mobileAutoRedirect = '0';
185 $this->smartphoneAutoRedirect = $this->getSystemConfig(self::CF_SMARTPHONE_AUTO_REDIRECT); // スマートフォンの自動遷移
186 if ($this->smartphoneAutoRedirect == '') $this->smartphoneAutoRedirect = '0';
187 $this->usePageCache = $this->getSystemConfig(self::CF_USE_PAGE_CACHE); // 表示キャッシュ機能を使用するかどうか
188 if ($this->usePageCache == '') $this->usePageCache = '0'; // デフォルトはキャッシュなし
189 $this->pageCacheLifetime = intval($this->getSystemConfig(self::CF_PAGE_CACHE_LIFETIME)); // 画面キャッシュの更新時間(分)
190 if ($this->pageCacheLifetime < 0) $this->pageCacheLifetime = self::DEFAULT_PAGE_CACHE_LIFETIME;
191 if ($this->getSystemConfig(self::CF_HIERARCHICAL_PAGE) == '1') $this->hierarchicalPage = true; // 階層化ページを使用するかどうか
193 $value = $this->getSystemConfig(self::CF_ACCEPT_LANGUAGE); // アクセス可能言語
194 if (!empty($value)) $this->acceptLanguage = explode(',', $value);
196 $this->gLog->error(__METHOD__, 'DBエラー発生: システム定義(_system_config)が読み込めません。');
201 $lang = $this->getSystemConfig(self::CF_DEFAULT_LANG);// デフォルト言語
203 // サイト定義をデフォルト言語で読み込む。データが空でもエラーとしない
204 $ret = $this->db->getAllSiteDefValue($lang, $rows);
207 $defCount = count($rows);
208 for ($i = 0; $i < $defCount; $i++){
209 $key = $rows[$i]['sd_id'];
210 $value = $rows[$i]['sd_value'];
211 $this->_siteDefArray[$key] = $value;
219 * @param bool $reload 再取得するかどうか
220 * @return bool true=システム初期化モード、false=システム初期化しない
222 public function canInitSystem($reload = false)
225 $value = $this->db->getSystemConfig(self::CF_PERMIT_INIT_SYSTEM); // システム初期化可能かどうか
227 $this->permitInitSystem = true;
229 $this->permitInitSystem = false;
232 return $this->permitInitSystem; // システム初期化可能かどうか
239 public function enableInitSystem()
242 $this->db->updateSystemConfig(self::CF_PERMIT_INIT_SYSTEM, 1);
245 $this->canInitSystem(true);
252 public function disableInitSystem()
255 $this->db->updateSystemConfig(self::CF_PERMIT_INIT_SYSTEM, 0);
258 $this->canInitSystem(true);
261 * セッションを毎回更新するかどうかを返す
263 * @return bool true=毎回更新、false=更新しない
265 public function regenerateSessionId()
267 $retValue = $this->getSystemConfig(self::CF_REGENERATE_SESSION_ID);
268 if ($retValue == '1'){
277 * @return bool true=変更可能、false=変更不可
279 function canChangeLang()
281 $retValue = $this->getSystemConfig(self::CF_PERMIT_CHANGE_LANG);
282 if ($retValue == '1'){
289 * テンプレートIDをセッションに保存するかどうかを取得
291 * @param bool $reload 再取得するかどうか
292 * @return bool true=変更可能、false=変更不可
294 function useTemplateIdInSession($reload = false)
297 $retValue = $this->db->getSystemConfig(self::CF_USE_TEMPLATE_ID_IN_SESSION);
298 if ($retValue == '1'){
299 $this->useTemplateIdInSession = true;
301 $this->useTemplateIdInSession = false;
304 return $this->useTemplateIdInSession;
307 * 管理画面用のデフォルトのテンプレートIDを取得
309 * @param bool $reload 再取得するかどうか
310 * @return string デフォルトのテンプレートID
312 function defaultAdminTemplateId($reload = false)
315 $this->defaultAdminTemplateId = $this->db->getSystemConfig(self::CF_ADMIN_DEFAULT_TEMPLATE);
317 return $this->defaultAdminTemplateId;
322 * @param bool $reload 再取得するかどうか
323 * @return string デフォルトのテンプレートID
325 function defaultTemplateId($reload = false)
328 $this->defaultTemplateId = $this->db->getSystemConfig(self::CF_DEFAULT_TEMPLATE);
330 return $this->defaultTemplateId;
333 * 携帯用デフォルトのテンプレートIDを取得
335 * @param bool $reload 再取得するかどうか
336 * @return string デフォルトのテンプレートID
338 function defaultMobileTemplateId($reload = false)
341 $this->defaultMobileTemplateId = $this->db->getSystemConfig(self::CF_DEFAULT_TEMPLATE_MOBILE);
343 return $this->defaultMobileTemplateId;
346 * スマートフォン用デフォルトのテンプレートIDを取得
348 * @param bool $reload 再取得するかどうか
349 * @return string デフォルトのテンプレートID
351 function defaultSmartphoneTemplateId($reload = false)
354 $this->defaultSmartphoneTemplateId = $this->db->getSystemConfig(self::CF_DEFAULT_TEMPLATE_SMARTPHONE);
356 return $this->defaultSmartphoneTemplateId;
361 * @param string $templateId デフォルトテンプレートID
362 * @return true=成功、false=失敗
364 function changeDefaultTemplate($templateId)
366 $ret = $this->db->updateSystemConfig(self::CF_DEFAULT_TEMPLATE, $templateId);
369 $this->defaultTemplateId(true);
375 * @param string $templateId デフォルトテンプレートID
376 * @return true=成功、false=失敗
378 function changeDefaultMobileTemplate($templateId)
380 $ret = $this->db->updateSystemConfig(self::CF_DEFAULT_TEMPLATE_MOBILE, $templateId);
383 $this->defaultMobileTemplateId(true);
387 * スマートフォン用デフォルトテンプレートの変更
389 * @param string $templateId デフォルトテンプレートID
390 * @return true=成功、false=失敗
392 function changeDefaultSmartphoneTemplate($templateId)
394 $ret = $this->db->updateSystemConfig(self::CF_DEFAULT_TEMPLATE_SMARTPHONE, $templateId);
397 $this->defaultSmartphoneTemplateId(true);
401 * 管理画面用jQueryUIテーマを取得
403 * @param bool $reload 再取得するかどうか
404 * @return string デフォルトのjQueryUIテーマ
406 function adminDefaultTheme($reload = false)
409 $this->adminDefaultTheme = $this->db->getSystemConfig(self::CF_ADMIN_DEFAULT_THEME);
411 return $this->adminDefaultTheme;
414 * 一般画面用jQueryUIテーマを取得
416 * @return string jQueryUIテーマ
418 function defaultTheme()
422 if (!isset($theme)) $theme = $this->getSystemConfig(self::CF_DEFAULT_THEME);
426 * デフォルト言語以外のサイト定義を読み込む
428 * @param string $langId 言語ID
429 * @return bool true=成功(指定言語あり)、false=失敗(指定言語なし)
431 function roadSiteDefByLang($langId)
433 if ($langId == $this->getSystemConfig(self::CF_DEFAULT_LANG)) return false;
436 $ret = $this->db->getAllSiteDefValue($langId, $rows);
439 $defCount = count($rows);
440 for ($i = 0; $i < $defCount; $i++){
441 $key = $rows[$i]['sd_id'];
442 $value = $rows[$i]['sd_value'];
446 $this->_siteDefArray[$key] = $value;
455 * @param bool $reload 再取得するかどうか
456 * @return array アクセス可能言語
458 function getAcceptLanguage($reload = false)
461 $value = $this->db->getSystemConfig(self::CF_ACCEPT_LANGUAGE); // アクセス可能言語
463 $this->acceptLanguage = array();
465 $this->acceptLanguage = explode(',', $value);
468 return $this->acceptLanguage;
475 function getSystemLanguages()
477 return $this->systemLanguages;
480 * アップロード可能なファイルの最大サイズを返す
482 * @param bool $byInteger 数値のバイトサイズを返すかどうか
483 * @return string バイトサイズ
485 public function getMaxFileSizeForUpload($byInteger = false)
487 $limit = convBytes(ini_get('upload_max_filesize')) > convBytes(ini_get('post_max_size')) ? ini_get('post_max_size') : ini_get('upload_max_filesize');
488 $limit = convBytes($limit) > convBytes(ini_get('memory_limit')) ? ini_get('memory_limit') : $limit;
490 if ($byInteger){ // ファイルサイズを数値で返す場合
491 return convBytes($limit);
499 * @param int $type デバイスタイプ(0=PC,1=携帯,2=スマートフォン)
500 * @return bool true=有効、false=無効
502 public function getSiteActiveStatus($type)
504 static $siteActiveStatus; // アクセスポイントが有効かどうか
506 if (!isset($siteActiveStatus)){
507 $siteActiveStatus = array();
509 $ret = $this->db->getPageIdRecords(0/*ページID*/, $rows);
511 for ($i = 0; $i < 3; $i++){
518 $pageId = M3_DIR_NAME_MOBILE . '_index';
521 $pageId = M3_DIR_NAME_SMARTPHONE . '_index';
524 for ($j = 0; $j < count($rows); $j++){
525 if ($rows[$j]['pg_id'] == $pageId){
526 $siteActiveStatus[$i] = $rows[$j]['pg_active'];
533 return $siteActiveStatus[$type];
538 * @param bool $reload 再取得するかどうか
539 * @return bool true=公開、false=非公開
541 public function siteInPublic($reload = false)
544 $this->siteInPublic = $this->db->getSystemConfig(self::CF_SITE_IN_PUBLIC); // Webサイトの公開状況
545 if ($this->siteInPublic == '') $this->siteInPublic = '1'; // デフォルトは公開
547 return $this->siteInPublic; // Webサイトの公開状況
552 * @param bool $reload 再取得するかどうか
553 * @return bool true=公開、false=非公開
555 public function sitePcInPublic($reload = false)
558 $this->sitePcInPublic = $this->db->getSystemConfig(self::CF_SITE_PC_IN_PUBLIC); // PC用サイトの公開状況
559 if ($this->sitePcInPublic == '') $this->sitePcInPublic = '1'; // デフォルトは公開
561 return $this->sitePcInPublic; // PC用サイトの公開状況
566 * @param bool $reload 再取得するかどうか
567 * @return bool true=公開、false=非公開
569 public function siteMobileInPublic($reload = false)
572 $this->siteMobileInPublic = $this->db->getSystemConfig(self::CF_SITE_MOBILE_IN_PUBLIC); // 携帯用サイトの公開状況
573 if ($this->siteMobileInPublic == '') $this->siteMobileInPublic = '1'; // デフォルトは公開
575 return $this->siteMobileInPublic; // 携帯用サイトの公開状況
578 * スマートフォン用サイトを公開するかどうか
580 * @param bool $reload 再取得するかどうか
581 * @return bool true=公開、false=非公開
583 public function siteSmartphoneInPublic($reload = false)
586 $this->siteSmartphoneInPublic = $this->db->getSystemConfig(self::CF_SITE_SMARTPHONE_IN_PUBLIC); // スマートフォン用サイトの公開状況
587 if ($this->siteSmartphoneInPublic == '') $this->siteSmartphoneInPublic = '1'; // デフォルトは公開
589 return $this->siteSmartphoneInPublic; // スマートフォン用サイトの公開状況
594 * @param bool $reload 再取得するかどうか
595 * @return bool true=公開、false=非公開
597 public function mobileAutoRedirect($reload = false)
600 $this->mobileAutoRedirect = $this->db->getSystemConfig(self::CF_MOBILE_AUTO_REDIRECT); // 携帯の自動遷移
601 if ($this->mobileAutoRedirect == '') $this->mobileAutoRedirect = '0';
603 return $this->mobileAutoRedirect;
606 * スマートフォンの自動遷移を行うかどうか
608 * @param bool $reload 再取得するかどうか
609 * @return bool true=公開、false=非公開
611 public function smartphoneAutoRedirect($reload = false)
614 $this->smartphoneAutoRedirect = $this->db->getSystemConfig(self::CF_SMARTPHONE_AUTO_REDIRECT); // スマートフォンの自動遷移
615 if ($this->smartphoneAutoRedirect == '') $this->smartphoneAutoRedirect = '0';
617 return $this->smartphoneAutoRedirect;
622 * @param bool $reload 再取得するかどうか
623 * @return bool true=キャッシュ、false=キャッシュなし
625 public function usePageCache($reload = false)
628 $this->usePageCache = $this->db->getSystemConfig(self::CF_USE_PAGE_CACHE); // 表示キャッシュ機能を使用するかどうか
629 if ($this->usePageCache == '') $this->usePageCache = '0'; // デフォルトはキャッシュなし
631 return $this->usePageCache;
636 * @param bool $reload 再取得するかどうか
637 * @return int キャッシュの更新時間(分)
639 public function pageCacheLifetime($reload = false)
642 $this->pageCacheLifetime = intval($this->db->getSystemConfig(self::CF_PAGE_CACHE_LIFETIME)); // 画面キャッシュの更新時間(分)
643 if ($this->pageCacheLifetime < 0) $this->pageCacheLifetime = self::DEFAULT_PAGE_CACHE_LIFETIME;
645 return $this->pageCacheLifetime;
650 * @param bool $reload 再取得するかどうか
651 * @return int true=階層化ページ使用、false=階層化ページ不使用
653 public function hierarchicalPage($reload = false)
656 $value = $this->getSystemConfig(self::CF_HIERARCHICAL_PAGE);
658 $this->hierarchicalPage = false; // 階層化ページを使用するかどうか
660 $this->hierarchicalPage = true; // 階層化ページを使用するかどうか
663 return $this->hierarchicalPage;
668 * @return array コンテンツタイプ
670 public function getAllContentType()
672 $contentType = array( M3_VIEW_TYPE_CONTENT, // 汎用コンテンツ
673 M3_VIEW_TYPE_PRODUCT, // 製品
674 M3_VIEW_TYPE_BBS, // BBS
675 M3_VIEW_TYPE_BLOG, // ブログ
676 M3_VIEW_TYPE_WIKI, // wiki
677 M3_VIEW_TYPE_USER, // ユーザ作成コンテンツ
678 M3_VIEW_TYPE_EVENT, // イベント
679 M3_VIEW_TYPE_PHOTO, // フォトギャラリー
680 M3_VIEW_TYPE_SEARCH); // 検索結果