OSDN Git Service

携帯関係のウィジェット、テンプレートを削除。
[magic3/magic3.git] / widgets / admin_main / include / container / admin_mainTemplistWidgetContainer.php
1 <?php
2 /**
3  * コンテナクラス
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
9  * @package    Magic3 Framework
10  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11  * @copyright  Copyright 2006-2018 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id$
14  * @link       http://www.magic3.org
15  */
16 require_once($gEnvManager->getCurrentWidgetContainerPath() .    '/admin_mainTempBaseWidgetContainer.php');
17 require_once($gEnvManager->getCurrentWidgetDbPath() . '/admin_mainDb.php');
18 require_once($gEnvManager->getLibPath()                         . '/pclzip-2-8-2/pclzip.lib.php');
19 require_once($gEnvManager->getCurrentWidgetContainerPath()              . '/admin_mainDef.php');                        // 定義クラス
20 require_once($gEnvManager->getCommonPath()              . '/archive.php');
21 // Joomlaテンプレート用
22 require_once($gEnvManager->getJoomlaRootPath() . '/JParameter.php');
23 require_once($gEnvManager->getJoomlaRootPath() . '/JRender.php');
24                                 
25 class admin_mainTemplistWidgetContainer extends admin_mainTempBaseWidgetContainer
26 {
27         private $db;    // DB接続オブジェクト
28         private $serialArray = array();         // 表示されているコンテンツシリアル番号
29         private $newTemplate = array();         // 新規追加テンプレート
30         private $defalutTemplate;       // デフォルトのテンプレート
31         private $templateTypeArray;             // テンプレートタイプ
32         private $templateType;                  // 現在のテンプレートタイプ
33         private $isExistsTemplateList;          // テンプレートが存在するかどうか
34 //      const BREADCRUMB_TITLE                  = 'テンプレート管理';           // 画面タイトル名(パンくずリスト)
35         const TITLE_INFO_URL                    = 'テンプレートの情報';                // テンプレート情報URLのタイトル
36         const TEMPLATE_THUMBNAIL_FILENAME = 'template_thumbnail.png';           // テンプレートサムネール
37         const TEMPLATE_THUMBNAIL_FILENAME_WP = 'screenshot';                            // テンプレートサムネール(WordPressテンプレート)
38         const previewImageSizeHeight = 27;
39         const previewImageSizeWidth = 42;
40         const imageSizeHeight = 135;
41         const imageSizeWidth = 210;
42         const JOOMLA_CONFIG_FILENAME = 'templateDetails.xml';           // Joomla!のテンプレート設定ファイル名
43         const NOT_FOUND_TEMPLATE_ICON_FILE = '/images/system/notfound32.png';           // テンプレートが見つからないアイコン
44         const DOWNLOAD_ZIP_ICON_FILE = '/images/system/download_zip32.png';             // Zipダウンロード用アイコン
45 //      const UPLOAD_ICON_FILE = '/images/system/upload32.png';         // ウィジェットアップロード用アイコン
46         const RELOAD_ICON_FILE = '/images/system/reload32.png';         // 再読み込み用アイコン
47 //      const AREA_OPEN_ICON_FILE = '/images/system/area_open32.png';           // 拡張領域表示アイコン
48         const THEMLER_APP_FILENAME = '/app/themler.version';            // Themlerテンプレートかどうかを判断するためのファイル
49         const DEFAULT_IMAGE_DIR = '/images';            // デフォルトの画像格納ディレクトリ
50         const CF_PERMIT_DETAIL_CONFIG   = 'permit_detail_config';                               // 開発モードかどうか
51         
52         /**
53          * コンストラクタ
54          */
55         function __construct()
56         {
57                 // 親クラスを呼び出す
58                 parent::__construct();
59                 
60                 // DB接続オブジェクト作成
61                 $this->db = new admin_mainDb();
62                 
63                 // テンプレートタイプメニュー項目
64                 $isActiveSitePc                 = $this->isActiveAccessPoint(0/*PC*/);                                  // PC用サイト有効かどうか
65                 $isActiveSiteSmartphone = $this->isActiveAccessPoint(2/*スマートフォン*/);               // スマートフォン用サイト有効かどうか
66                 $isActiveSiteMobile             = $this->isActiveAccessPoint(1/*スマートフォン*/);               // 携帯用サイト有効かどうか
67                 $this->templateTypeArray = array();
68                 if ($isActiveSitePc) $this->templateTypeArray[] = array(        'name' => $this->_('For PC'),                   'value' => '0');        // PC用
69                 if ($isActiveSiteSmartphone) $this->templateTypeArray[] = array(        'name' => $this->_('For Smartphone'),   'value' => '2');                // スマートフォン用
70                 if ($isActiveSiteMobile) $this->templateTypeArray[] = array(    'name' => $this->_('For Mobile'),               'value' => '1');        // 携帯用
71         }
72         /**
73          * テンプレートファイルを設定
74          *
75          * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
76          * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
77          *
78          * @param RequestManager $request               HTTPリクエスト処理クラス
79          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
80          * @return string                                               テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
81          */
82         function _setTemplate($request, &$param)
83         {       
84                 return 'templist.tmpl.html';
85         }
86         /**
87          * ヘルプデータを設定
88          *
89          * ヘルプの設定を行う場合はヘルプIDを返す。
90          * ヘルプデータの読み込むディレクトリは「自ウィジェットディレクトリ/include/help」に固定。
91          *
92          * @param RequestManager $request               HTTPリクエスト処理クラス
93          * @param object         $param                 任意使用パラメータ。そのまま_assign()に渡る
94          * @return string                                               ヘルプID。ヘルプデータはファイル名「help_[ヘルプID].php」で作成。ヘルプを使用しない場合は空文字列「''」を返す。
95          */
96         function _setHelp($request, &$param)
97         {       
98                 return 'templist';
99         }
100         /**
101          * テンプレートにデータ埋め込む
102          *
103          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
104          *
105          * @param RequestManager $request               HTTPリクエスト処理クラス
106          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
107          * @return                                                              なし
108          */
109 /*      function _postAssign($request, &$param)
110         {
111                 $this->gPage->setAdminBreadcrumbDef(array(self::BREADCRUMB_TITLE));
112         }*/
113         /**
114          * テンプレートにデータ埋め込む
115          *
116          * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
117          *
118          * @param RequestManager $request               HTTPリクエスト処理クラス
119          * @param object         $param                 任意使用パラメータ。_setTemplate()と共有。
120          * @return                                                              なし
121          */
122         function _assign($request, &$param)
123         {
124                 $act = $request->trimValueOf('act');
125                 $selectedItemNo = $request->trimValueOf('no');          // 処理対象の項目番号
126                 $userId = $this->gEnv->getCurrentUserId();
127                 $templateId = $request->trimValueOf('template');                // テンプレートID
128                 $this->templateType = $request->trimValueOf('item_type');// 現在のテンプレートタイプ
129                 if ($this->templateType == '') $this->templateType = '0';               // デフォルトはPC用テンプレート
130                 
131                 if ($act == 'readnew'){         // テンプレート再読み込みのとき
132                         $addTemplateCount = 0;
133                         // テンプレート一覧取得
134                         if ($this->db->getAllTemplateIdList($rows)){
135                                 // テンプレートディレクトリチェック
136                                 switch ($this->templateType){
137                                         case '0':               // PC用テンプレート
138                                         default:
139                                                 $searchPath = $this->gEnv->getTemplatesPath();
140                                                 break;
141                                         case '1':               // 携帯用テンプレート
142                                                 $searchPath = $this->gEnv->getTemplatesPath() . '/' . M3_DIR_NAME_MOBILE;
143                                                 break;
144                                         case '2':               // スマートフォン用テンプレート
145                                                 $searchPath = $this->gEnv->getTemplatesPath() . '/' . M3_DIR_NAME_SMARTPHONE;
146                                                 break;
147                                 }
148                                 
149                                 if (is_dir($searchPath)){
150                                         $dir = dir($searchPath);
151                                         while (($file = $dir->read()) !== false){
152                                                 $filePath = $searchPath . '/' . $file;
153                                                 // ディレクトリかどうかチェック
154                                                 if (strncmp($file, '.', 1) != 0 && $file != '..' && is_dir($filePath) &&
155                                                         strncmp($file, '_', 1) != 0     &&      // 「_」で始まる名前のディレクトリは読み込まない
156                                                         strlen($file) > 1 &&                    // 携帯、スマートフォン用ディレクトリ「m」「s」は読み込まない
157                                                         !($this->templateType == 0 && $file == 'system')){                              // PC用Joomla!デフォルトテンプレート「system」は読み込まない
158                                                         
159                                                         // テンプレートIDを作成
160                                                         switch ($this->templateType){
161                                                                 case '0':               // PC用テンプレート
162                                                                 default:
163                                                                         $templateId = $file;
164                                                                         break;
165                                                                 case '1':               // 携帯用テンプレート
166                                                                         $templateId = M3_DIR_NAME_MOBILE . '/' . $file;
167                                                                         break;
168                                                                 case '2':               // スマートフォン用テンプレート
169                                                                         $templateId = M3_DIR_NAME_SMARTPHONE . '/' . $file;
170                                                                         break;
171                                                         }
172                                 
173                                                         // DBに登録されていない場合は登録
174                                                         for ($i = 0; $i < count($rows); $i++){
175                                                                 if ($templateId == $rows[$i]['tm_id']) break;
176                                                         }
177                                                         if ($i == count($rows)){
178                                                                 // テンプレートを新規登録
179                                                                 $ret = $this->addNewTemplate(intval($this->templateType), $templateId);
180                                                                 if ($ret){
181                                                                         $this->newTemplate[] = $templateId;
182                                                                         $addTemplateCount++;            // テンプレート追加
183                                                                 }
184                                                         }
185                                                 }
186                                         }
187                                         $dir->close();
188                                 }
189                         } else {
190                         }
191                         // 終了メッセージを表示
192                         if ($addTemplateCount > 0){
193                                 //$msg = '新規テンプレートを追加しました(追加数=' . $addTemplateCount . ')';
194                                 $msg = sprintf($this->_('New templates added. (templates count=%d)'), $addTemplateCount);                       // 新規テンプレートを追加しました(追加数=%d)
195                         } else {
196                                 //$msg = '新規テンプレートはありません';
197                                 $msg = $this->_('No new templates added.');             // 新規テンプレートはありません
198                         }
199                         $this->setMsg(self::MSG_GUIDANCE, $msg);
200                 } else if ($act == 'deleteline'){               // テンプレート削除のとき
201                         // パラメータエラーチェック
202                         if (empty($templateId)) $this->setMsg(self::MSG_APP_ERR, $this->_('Template not selected.'));           // テンプレートが選択されていません
203                         
204                         if (!$this->isExistsMsg()){             // エラーなしのとき
205                                 // テンプレートディレクトリ取得
206                                 $templatePath = $this->gEnv->getTemplatesPath() . '/' . $templateId;
207                 
208                                 // ディレクトリ削除
209                                 if ((is_dir($templatePath) && rmDirectory($templatePath)) || !is_dir($templatePath)){// 削除成功か、ディレクトリが存在しないとき
210                                         $ret = $this->db->deleteTemplate($templateId);
211                                         if ($ret){              // データ更新成功のとき
212                                                 $this->setMsg(self::MSG_GUIDANCE, sprintf($this->_('Template deleted. (template ID: %s)'), $templateId));       // テンプレートを削除しました(テンプレートID:%s)
213                                         } else {
214                                                 $this->setMsg(self::MSG_APP_ERR, sprintf($this->_('Failed in deleting template. (template ID: %s)'), $templateId));     // テンプレート削除に失敗しました(テンプレートID:%s)
215                                         }
216                                 } else {
217                                         $this->setMsg(self::MSG_APP_ERR, sprintf($this->_('Failed in deleting template directory. (directory: %s)'), $templatePath));   // テンプレートのディレクトリが削除できませんでした(ディレクトリ:%s)
218                                 }
219                         }
220                 } else if ($act == 'delete'){           // 項目削除の場合
221                         $listedItem = explode(',', $request->trimValueOf('seriallist'));
222                         $delItems = array();
223                         for ($i = 0; $i < count($listedItem); $i++){
224                                 // 項目がチェックされているかを取得
225                                 $itemName = 'item' . $i . '_selected';
226                                 $itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
227                                 
228                                 if ($itemValue){                // チェック項目
229                                         $delItems[] = $listedItem[$i];
230                                 }
231                         }
232                         if (count($delItems) > 0){
233                                 // 削除するコンテンツの情報を取得
234                                 $delContentInfo = array();
235                                 for ($i = 0; $i < count($delItems); $i++){
236                                         // テンプレートディレクトリ取得
237                                         $templateId = $delItems[$i];
238                                         $templatePath = $this->gEnv->getTemplatesPath() . '/' . $templateId;
239                 
240                                         // ディレクトリ削除
241                                         if ((is_dir($templatePath) && rmDirectory($templatePath)) || !is_dir($templatePath)){// 削除成功か、ディレクトリが存在しないとき
242                                                 $ret = $this->db->deleteTemplate($templateId);
243                                                 if ($ret){              // データ更新成功のとき
244                                                         $this->setMsg(self::MSG_GUIDANCE, sprintf($this->_('Template deleted. (template ID: %s)'), $templateId));       // テンプレートを削除しました(テンプレートID:%s)
245                                                 } else {
246                                                         $this->setMsg(self::MSG_APP_ERR, sprintf($this->_('Failed in deleting template. (template ID: %s)'), $templateId));     // テンプレート削除に失敗しました(テンプレートID:%s)
247                                                 }
248                                         } else {
249                                                 $this->setMsg(self::MSG_APP_ERR, sprintf($this->_('Failed in deleting template directory. (directory: %s)'), $templatePath));   // テンプレートのディレクトリが削除できませんでした(ディレクトリ:%s)
250                                         }
251                                 }
252                         }
253                 } else if ($act == 'upload'){           // ファイルアップロードの場合
254                         // アップロードされたファイルか?セキュリティチェックする
255                         if (is_uploaded_file($_FILES['upfile']['tmp_name'])){
256                                 $uploadFilename = $_FILES['upfile']['name'];            // アップロードされたファイルのファイル名取得
257
258                                 // ファイル名の解析
259                                 $pathParts = pathinfo($uploadFilename);
260                                 $ext = $pathParts['extension'];         // 拡張子
261                                 $templateName = basename($uploadFilename, '.' . $ext);          // 拡張子をはずす
262                                 $ext = strtolower($ext);
263                                 
264                                 // ファイル拡張子のチェック
265                                 if ($ext != 'zip'){
266                                         //$msg = 'zip圧縮のファイルのみアップロード可能です';
267                                         $msg = $this->_('Only zip format file is allowed to upload.');  // zip圧縮のファイルのみアップロード可能です
268                                         $this->setAppErrorMsg($msg);
269                                 }
270                                 
271                                 // テンポラリディレクトリの書き込み権限をチェック
272                                 if (!is_writable($this->gEnv->getWorkDirPath())){
273                                         //$msg = '一時ディレクトリに書き込み権限がありません。ディレクトリ:' . $this->gEnv->getWorkDirPath();
274                                         $msg = sprintf($this->_('You are not allowed to write temporary directory. (directory: %s)'), $this->gEnv->getWorkDirPath());   // 一時ディレクトリに書き込み権限がありません。(ディレクトリ:%s)
275                                         $this->setAppErrorMsg($msg);
276                                 }
277                                 
278                                 if ($this->getMsgCount() == 0){         // エラーが発生していないとき
279                                         // ファイルを保存するサーバディレクトリを指定
280                                         $tmpFile = tempnam($this->gEnv->getWorkDirPath(), M3_SYSTEM_WORK_UPLOAD_FILENAME_HEAD);
281                 
282                                         // アップされたテンポラリファイルを保存ディレクトリにコピー
283                                         $ret = move_uploaded_file($_FILES['upfile']['tmp_name'], $tmpFile);
284                                         if ($ret){
285                                                 // 解凍先ディレクトリ取得
286                                                 $extDir = $this->gEnv->getTempDir();
287
288                                                 // ファイルを解凍
289                                                 $archiver = new Archive();
290                                                 $ret = $archiver->extract($tmpFile, $extDir, $ext);
291                                                 if ($ret){
292                                                         // 作成されたファイルを取得
293                                                         $fileList = getFileList($extDir);
294                                                         if (count($fileList) == 1 && is_dir($extDir . '/' . $fileList[0])){             // 単一ディレクトリのとき
295                                                                 $srcTemplateDir = $extDir . '/' . $fileList[0];
296                                                         } else {
297                                                                 // 設定ファイルを取得
298                                                                 $srcTemplateDir = $extDir;
299                                                         }
300                                                         // テンプレートIDを求める
301                                                         $templateId = $this->getTemplateId($srcTemplateDir);
302                                                         
303                                                         // テンプレートIDが取得できないときは、送信されたファイルのファイル名を使用
304                                                         if (empty($templateId)) $templateId = $templateName;
305                                                         
306                                                         // テンプレートIDを修正
307                                                         switch ($this->templateType){
308                                                                 case '0':               // PC用テンプレート
309                                                                 default:
310                                                                         break;
311                                                                 case '1':               // 携帯用テンプレート
312                                                                         $templateId = M3_DIR_NAME_MOBILE . '/' . $templateId;
313                                                                         break;
314                                                                 case '2':               // スマートフォン用テンプレート
315                                                                         $templateId = M3_DIR_NAME_SMARTPHONE . '/' . $templateId;
316                                                                         break;
317                                                         }
318                                                         
319                                                         // 同IDのテンプレートがないかチェック
320                                                         if ($this->db->getAllTemplateIdList($rows)){
321                                                                 for ($i = 0; $i < count($rows); $i++){
322                                                                         if ($templateId == $rows[$i]['tm_id']) break;
323                                                                 }
324                                                                 if ($i < count($rows)){
325                                                                         //$msg = '同じIDのテンプレートがすでに存在します(テンプレートID:' . $templateId . ')';
326                                                                         $msg = sprintf($this->_('The template already exists. (template ID: %s)'), $templateId);                // テンプレートがすでに存在します(テンプレートID:%s)
327                                                                         $this->setAppErrorMsg($msg);
328                                                                 }
329                                                         }
330                                                         
331                                                         if ($this->getMsgCount() == 0){         // エラーが発生していないとき
332                                                                 // 既にディレクトリがないかチェック
333                                                                 $destTemplateDir = $this->gEnv->getTemplatesPath() . '/' . $templateId;                 // テンプレートの移動先
334                                                                 if (file_exists($destTemplateDir)){
335                                                                         //$msg = '同じIDのテンプレートディレクトリがすでに存在します(テンプレートID:' . $templateId . ')';
336                                                                         $msg = sprintf($this->_('The template directory already exists. (directory: %s)'), $destTemplateDir);// テンプレートディレクトリがすでに存在します(ディレクトリ:%s)
337                                                                         $this->setAppErrorMsg($msg);
338                                                                 } else {
339                                                                         // ディレクトリを移動
340                                                                         $ret = @rename($srcTemplateDir, $destTemplateDir);
341                                                                         if (!$ret) $ret = mvDirectory($srcTemplateDir, $destTemplateDir);               // 2009/7/17 異なるデバイス間でrenameできなかった問題に対応
342                                                                         if ($ret){
343                                                                                 // テンプレートを新規登録
344                                                                                 $ret = $this->addNewTemplate(intval($this->templateType), $templateId);
345                                                                                 if ($ret){
346                                                                                         //$msg = 'ファイルのアップロードが完了しました(テンプレートID:' . $templateId . ')';
347                                                                                         $msg = sprintf($this->_('File uploaded. (template ID: %s)'), $templateId);              // ファイルのアップロードが完了しました(テンプレートID: %s)
348                                                                                         $this->setGuidanceMsg($msg);
349                                                                                         $this->newTemplate[] = $templateId;
350                                                                                 } else {
351                                                                                         // 新規登録失敗の場合はディレクトリを削除
352                                                                                         rmDirectory($destTemplateDir);
353                                                                                 }
354                                                                         } else {
355                                                                                 //$msg = 'ディレクトリの移動に失敗しました(ディレクトリ:' . $destTemplateDir . ')';
356                                                                                 $msg = sprintf($this->_('Failed in moving directory. (directory: %s)'), $destTemplateDir);// ディレクトリの移動に失敗しました(ディレクトリ:%s)
357                                                                                 $this->setAppErrorMsg($msg);
358                                                                         }
359                                                                 }
360                                                         }
361                                                 }
362                                                 // 解凍用ディレクトリを削除
363                                                 if (file_exists($extDir)) rmDirectory($extDir);
364                                         } else {
365                                                 //$msg = 'ファイルのアップロードに失敗しました';
366                                                 $msg = $this->_('Failed in uploading file.');           // ファイルのアップロードに失敗しました
367                                                 $this->setAppErrorMsg($msg);
368                                         }
369                                         // テンポラリファイル削除
370                                         unlink($tmpFile);
371                                 }
372                         } else {
373                                 //$msg = 'アップロードファイルが見つかりません(要因:アップロード可能なファイルのMaxサイズを超えている可能性があります - ' . $this->gSystem->getMaxFileSizeForUpload() . 'バイト)';
374                                 $msg = sprintf($this->_('Uploded file not found. (detail: The file may be over maximum size to be allowed to upload. Size %s bytes.'), $this->gSystem->getMaxFileSizeForUpload());      // アップロードファイルが見つかりません(要因:アップロード可能なファイルのMaxサイズを超えている可能性があります。%sバイト)
375                                 $this->setAppErrorMsg($msg);
376                         }
377                 } else if ($act == 'download'){         // ファイルダウンロードのとき
378                         switch ($this->templateType){
379                                 case '0':               // PC用テンプレート
380                                 default:
381                                         $templatesDir = $this->gEnv->getTemplatesPath();                // テンプレートディレクトリ
382                                         $templateDir = $templatesDir . '/' . $templateId;                       // ダウンロードするテンプレートのディレクトリ
383                                         $downloadFilename = $templateId . '.zip';               // ダウンロード時のファイル名
384                                         break;
385                                 case '1':               // 携帯用テンプレート
386                                         $templatesDir = $this->gEnv->getTemplatesPath() . '/' . M3_DIR_NAME_MOBILE;             // テンプレートディレクトリ
387                                         $templateDir = $this->gEnv->getTemplatesPath() . '/' . $templateId;                     // ダウンロードするテンプレートのディレクトリ
388                                         list($dir, $filename) = explode('/', $templateId);      // 先頭の「m/」を削除
389                                         $downloadFilename = $filename . '.zip';         // ダウンロード時のファイル名
390                                         break;
391                                 case '2':               // スマートフォン用テンプレート
392                                         $templatesDir = $this->gEnv->getTemplatesPath() . '/' . M3_DIR_NAME_SMARTPHONE;         // テンプレートディレクトリ
393                                         $templateDir = $this->gEnv->getTemplatesPath() . '/' . $templateId;                     // ダウンロードするテンプレートのディレクトリ
394                                         list($dir, $filename) = explode('/', $templateId);      // 先頭の「s/」を削除
395                                         $downloadFilename = $filename . '.zip';         // ダウンロード時のファイル名
396                                         break;
397                         }
398                         $tmpFile = tempnam($this->gEnv->getWorkDirPath(), M3_SYSTEM_WORK_DOWNLOAD_FILENAME_HEAD);               // zip処理用一時ファイル
399                         
400                         // zip圧縮
401                         $zipFile = new PclZip($tmpFile);
402                         $ret = $zipFile->create($templateDir, PCLZIP_OPT_REMOVE_PATH, $templatesDir);
403                         if ($ret){
404                                 // ページ作成処理中断
405                                 $this->gPage->abortPage();
406                                 
407                                 // ダウンロード処理
408                                 $ret = $this->gPage->downloadFile($tmpFile, $downloadFilename, true/*実行後ファイル削除*/);
409                                 
410                                 // システム強制終了
411                                 $this->gPage->exitSystem();
412                         } else {
413                                 //$msg = 'ファイルのダウンロードに失敗しました(要因: ' . $zipFile->errorName(true) . ')';
414                                 $msg = sprintf($this->_('Failed in downloading file. (detail: %s)'), $zipFile->errorName(true));                // ファイルのダウンロードに失敗しました(要因: %s)
415                                 $this->setAppErrorMsg($msg);
416                                 
417                                 // テンポラリファイル削除
418                                 unlink($tmpFile);
419                         }
420                 } else if ($act == 'changedefault'){            // デフォルトテンプレートの変更のとき
421                         // パラメータエラーチェック
422                         if (empty($templateId)) $this->setMsg(self::MSG_APP_ERR, $this->_('Template not selected.'));           // テンプレートが選択されていません
423                         
424                         if (!$this->isExistsMsg()){             // エラーなしのとき
425                                 switch ($this->templateType){
426                                         case '0':               // PC用テンプレート
427                                         default:
428                                                 // デフォルトテンプレート変更
429                                                 $this->gSystem->changeDefaultTemplate($templateId);
430
431                                                 // セッションのテンプレートIDを更新
432                                                 $request->setSessionValue(M3_SESSION_CURRENT_TEMPLATE, $templateId);
433                                                 break;
434                                         case '1':               // 携帯用テンプレート
435                                                 // デフォルトテンプレート変更
436                                                 $this->gSystem->changeDefaultMobileTemplate($templateId);
437                                                 break;
438                                         case '2':               // スマートフォン用テンプレート
439                                                 // デフォルトテンプレート変更
440                                                 $this->gSystem->changeDefaultSmartphoneTemplate($templateId);
441                                                 break;
442                                 }
443                                 // キャッシュデータをクリア
444                                 $this->gCache->clearAllCache();
445                         }
446                 } else if ($act == 'changetype'){               // テンプレートタイプの変更のとき
447                 } else if ($act == 'init'){             // テンプレート初期化のとき
448                         $ret = $this->initializeTemplate($templateId);
449                         if ($ret){
450                                 $msg = sprintf($this->_('Template initialization completed. (template ID: %s)'), $templateId);          // テンプレート初期化完了しました。(テンプレートID: %s)
451                                 $this->setMsg(self::MSG_GUIDANCE, $msg);
452                         } else {
453                                 $msg = sprintf($this->_('Failed in template initializing. (template ID: %s)'), $templateId);            // テンプレート初期化に失敗しました。(テンプレートID: %s)
454                                 $this->setMsg(self::MSG_APP_ERR, $msg);
455                         }
456                 }
457                         
458                 // テンプレートのタイプごとの処理
459                 switch ($this->templateType){
460                         case '0':               // PC用テンプレート
461                         default:
462                                 $this->defalutTemplate = $this->gSystem->defaultTemplateId();// デフォルトのテンプレート
463                                 $installDir = $this->gEnv->getTemplatesPath();// テンプレート格納ディレクトリ
464                                 break;
465                         case '2':               // スマートフォン用テンプレート
466                                 $this->defalutTemplate = $this->gSystem->defaultSmartphoneTemplateId();// デフォルトのテンプレート
467                                 $installDir = $this->gEnv->getTemplatesPath() . '/' . M3_DIR_NAME_SMARTPHONE;// テンプレート格納ディレクトリ
468                                 break;
469                 }
470                 // デフォルトのテンプレートが存在しない場合はエラーメッセージを表示
471                 if ($this->_db->getTemplate($this->defalutTemplate, $row)){
472                         $templateDir = $this->gEnv->getTemplatesPath() . '/' . $this->defalutTemplate;                  // テンプレートのディレクトリ
473                         if (!file_exists($templateDir)){
474                                 $msg = $this->_('Default template directory does not exist.');          // デフォルトテンプレートのディレクトリが存在しません。
475                                 $this->setAppErrorMsg($msg);
476                         }
477                 } else {
478                         $msg = $this->_('Default template is not selected.');           // デフォルトテンプレートが選択されていません。
479                         $this->setAppErrorMsg($msg);
480                 }
481                 
482                 // テンプレート選択メニュー作成
483                 $this->createTemplateTypeMenu();
484                 
485                 // テンプレートリストを取得
486                 $this->db->getAllTemplateList(intval($this->templateType), array($this, 'tempListLoop'));
487                 if (!$this->isExistsTemplateList) $this->tmpl->setAttribute('templist', 'visibility', 'hidden');// テンプレートがないときは、一覧を表示しない
488                 
489                 // 画面にデータを埋め込む
490                 $this->tmpl->addVar("_widget", "install_dir", $installDir);// インストールディレクトリ
491                 $this->tmpl->addVar("_widget", "admin_url", $this->getUrl($this->gEnv->getDefaultAdminUrl()));// 管理用URL
492                 $this->tmpl->addVar("_widget", "max_file_size", $this->gSystem->getMaxFileSizeForUpload(true/*数値のバイト数*/));                        // アップロードファイルの最大サイズ
493 /*              // テンプレートアップロード
494                 $imageUrl = $this->getUrl($this->gEnv->getRootUrl() . self::UPLOAD_ICON_FILE);
495                 $imageTitle = 'テンプレートアップロード';
496                 $imageTag = '<img src="' . $imageUrl . '" width="32" height="32" border="0" alt="' . $imageTitle . '" title="' . $imageTitle . '" />';
497                 $this->tmpl->addVar("_widget", "upload_image", $imageTag);
498                 // 拡張表示アイコン
499                 $imageUrl = $this->getUrl($this->gEnv->getRootUrl() . self::AREA_OPEN_ICON_FILE);
500                 $imageTitle = '詳細表示';
501                 $imageTag = '<img src="' . $imageUrl . '" width="32" height="32" border="0" alt="' . $imageTitle . '" title="' . $imageTitle . '" />';
502                 $this->tmpl->addVar("_widget", "area_open_image", $imageTag);*/
503                 // 再読み込みアイコン
504                 $imageUrl = $this->getUrl($this->gEnv->getRootUrl() . self::RELOAD_ICON_FILE);
505                 $imageTitle = 'ディレクトリ再読み込み';
506                 $imageTag = '<img src="' . $imageUrl . '" width="32" height="32" border="0" alt="' . $imageTitle . '" title="' . $imageTitle . '" />';
507                 $this->tmpl->addVar("_widget", "reload_image", $imageTag);
508                 // その他
509                 $this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示項目のシリアル番号を設定
510                 
511                 // テキストをローカライズ
512                 $localeText = array();
513                 $localeText['msg_update_line'] = $this->_('Update line?');              // 行を更新しますか?
514                 $localeText['msg_delete_line'] = $this->_('Delete tmplate?');           // テンプレートを削除しますか?
515                 $localeText['msg_no_upload_file'] = $this->_('File not selected.');             // アップロードするファイルが選択されていません
516                 $localeText['msg_upload_file'] = $this->_('Upload file.');              // ファイルをアップロードします
517                 $localeText['label_template_list'] = $this->_('Template List');                 // テンプレート一覧
518 //              $localeText['label_template_type'] = $this->_('Template Type:');                        // テンプレートタイプ:
519                 $localeText['label_install_dir'] = $this->_('Install Directory:');                      // インストールディレクトリ:
520                 $localeText['label_read_new'] = $this->_('Reload directory');                   // ディレクトリ再読み込み
521                 $localeText['label_show_detail'] = $this->_('Show detail');                     // 詳細表示
522                 $localeText['label_template_name'] = $this->_('Name');                  // 名前
523                 $localeText['label_template_format'] = $this->_('Format');                      // 形式
524                 $localeText['label_template_creator'] = $this->_('Genarator - Version');                        // 生成ソフト - バージョン
525                 $localeText['label_template_default'] = $this->_('Default');                    // デフォルト
526                 $localeText['label_template_date'] = $this->_('Update Date');                   // 更新日時
527                 $localeText['label_template_operation'] = $this->_('Operation');                        // 操作
528                 $localeText['label_template_upload'] = $this->_('Template Upload (zip compressed file)');                       // テンプレートアップロード(zip圧縮ファイル)
529                 $localeText['msg_select_file'] = $this->_('Select file to upload.');                    // アップロードするファイルを選択してください
530                 $localeText['label_upload'] = $this->_('Upload');                       // アップロード
531                 $localeText['label_cancel'] = $this->_('Cancel');                       // キャンセル
532                 $this->setLocaleText($localeText);
533         }
534         /**
535          * テンプレートリスト、取得したデータをテンプレートに設定する
536          *
537          * @param int $index                    行番号(0~)
538          * @param array $fetchedRow             フェッチ取得した行
539          * @param object $param                 未使用
540          * @return bool                                 true=処理続行の場合、false=処理終了の場合
541          */
542         function tempListLoop($index, $fetchedRow, $param)
543         {
544                 $genarator = $fetchedRow['tm_generator'];                       // テンプレート作成アプリケーション
545                 $version = $fetchedRow['tm_version'];                           // テンプレートバージョン
546                 $infoUrl = $fetchedRow['tm_info_url'];                          // テンプレート情報リンク
547
548                 // テンプレートが存在するかどうかチェック
549                 $isExistsTemplate = false;
550                 $templateId = $fetchedRow['tm_id'];// テンプレートID
551                 $templateDir = $this->gEnv->getTemplatesPath() . '/' . $templateId;                     // テンプレートのディレクトリ
552                 if (file_exists($templateDir)) $isExistsTemplate = true;
553                 
554 /*              // デフォルトテンプレート
555                 $defaultCheck = '';
556                 if ($templateId == $this->defalutTemplate){
557                         $defaultCheck = 'checked ';
558                 }
559                 if (!$isExistsTemplate) $defaultCheck .= 'disabled';            // テンプレートが存在しないときは使用不可
560                 */
561                 
562                 // 画面イメージ表示設定
563                 $name = $this->convertToDispString($fetchedRow['tm_name']);                     // テンプレート名
564                 $templateIndexFile = $templateDir . '/index.php';                                               // テンプレートindex.phpファイル
565                 
566                 $imgUrl = '';
567                 if ($fetchedRow['tm_type'] == 100){             // WordPressテンプレートの場合
568                         // 画像を検索
569                         foreach (array('png', 'gif', 'jpg', 'jpeg') as $ext){
570                                 $imgPath = $this->gEnv->getTemplatesPath() . '/' . $templateId . '/' . self::TEMPLATE_THUMBNAIL_FILENAME_WP . '.' . $ext;
571                                 if (file_exists($imgPath)){
572                                         $imgUrl = $this->gEnv->getTemplatesUrl() . '/' . $templateId . '/' . self::TEMPLATE_THUMBNAIL_FILENAME_WP . '.' . $ext;
573                                         break;
574                                 }
575                         }
576                 } else {
577                         $imgUrl = $this->gEnv->getTemplatesUrl() . '/' . $templateId . '/' . self::TEMPLATE_THUMBNAIL_FILENAME;
578                 }
579                 
580                 // 新規に追加されたテンプレートかチェック
581                 $idText = $this->convertToDispString($templateId);
582                 for ($i = 0; $i < count($this->newTemplate); $i++){
583                         if ($this->newTemplate[$i] == $templateId){
584                                 $idText = '<b><font color="green">' . $this->convertToDispString($templateId) . '</font></b>';
585                                 break;
586                         }
587                 }
588                 // デフォルトの場合はアイコンを付加
589                 if ($templateId == $this->defalutTemplate){
590                         $idText = '<span rel="m3help" data-container="body" title="デフォルトテンプレート"><i class="glyphicon glyphicon-ok-sign"></i></span> ' . $idText;
591                 }
592                 
593                 // テンプレートサムネール画像
594                 if ($isExistsTemplate){         // テンプレートが存在するとき
595                         $imageTag = '<img src="' . $this->getUrl($imgUrl) . '" width="' . self::previewImageSizeWidth . '" height="' . self::previewImageSizeHeight . '" border="0" />';
596                 } else {
597                         $iconTitle = $this->_('Template not found.');           // テンプレートが見つかりません
598                         $iconUrl = $this->gEnv->getRootUrl() . self::NOT_FOUND_TEMPLATE_ICON_FILE;
599                         $imageTag = '<img src="' . $this->getUrl($iconUrl) . '" border="0" alt="' . $iconTitle . '" title="' . $iconTitle . '" />';
600                 }
601                 
602                 // テンプレート情報リンク
603                 $infoButtonTag = '';
604                 if (!empty($infoUrl)) $infoButtonTag = $this->gDesign->createInfoLink($infoUrl, self::TITLE_INFO_URL);
605                 
606                 // テンプレートフォーマット
607                 switch ($fetchedRow['tm_type']){
608                         case 0:                                 // Joomla!v1.0型
609                                 $formatType = 'J10';            // テンプレート形式
610                                 break;
611                         case 1:                                 // Joomla!v1.5型
612                                 $formatType = 'J15';            // テンプレート形式
613                                 break;
614                         case 2:                                 // Joomla!v2.5型
615                                 $formatType = 'J25';            // テンプレート形式
616                                 break;
617                         case 10:                                        // Bootstrap v3.0型
618                                 $formatType = 'B30';            // テンプレート形式
619                                 break;
620                         case 11:                                        // Bootstrap v4.0型
621                                 $formatType = 'B40';            // テンプレート形式
622                                 break;
623                         case 100:                                       // WordPress型
624                                 $formatType = 'W00';            // テンプレート形式
625                                 break;
626                         default:
627                                 $formatType = $this->_('Not Detected');                 // 未定
628                                 break;
629                 }
630                 $formatType .= ' /<br />';
631                 
632                 // テンプレートを作成したアプリケーション、バージョンを取得
633                 if (empty($genarator)){
634                         if (file_exists($templateIndexFile)){
635                                 $content = file_get_contents($templateIndexFile);
636                                 $version = $this->getArtVersion($content);
637                                 if (empty($version)){
638                                         $formatType .= $this->_('Not Detected');                // 未検出
639                                 } else {
640                                         $formatType .= 'artisteer - ' . $version;
641                                 }
642                         }
643                 } else {
644                         $formatType .= $genarator . ' - ' . $version;
645                 }
646
647                 // ダウンロードボタン
648                 $downloadDisabled = false;// ボタンの状態
649                 if (!$isExistsTemplate) $downloadDisabled = true;
650                 $eventAttr = 'onclick="downloadTemplate(\'' . $templateId . '\');"';
651                 $downloadButtonTag = $this->gDesign->createDownloadButton(''/*同画面*/, $this->_('.zip Download'), ''/*タグID*/, $eventAttr/*クリックイベント時処理*/, $downloadDisabled/*ボタン使用可否*/);
652                 // テンプレート設定画面ボタン
653                 $configDisabled = '';// ボタンの状態
654                 $configTemplateId = $templateId;                // 設定画面用テンプレートID
655                 if (!$fetchedRow['tm_has_admin']){
656                         $configDisabled = 'disabled';           // 管理画面がなければ使用不可
657                         $configTemplateId = '';
658                 }
659                 // テンプレート編集ボタン
660                 $editDisabled = '';// ボタンの状態
661                 $editUrl = '?task=' . self::TASK_TEMPIMAGE . '&' . M3_REQUEST_PARAM_TEMPLATE_ID . '=' . $templateId;    // テンプレート編集画面
662                 $imageBasePath = $this->gEnv->getTemplatesPath() . '/' . $templateId . self::DEFAULT_IMAGE_DIR;                         
663                 if (!is_dir($imageBasePath)){                   // ディレクトリがない場合はボタンを使用不可にする
664                         $editDisabled = 'disabled';
665                         $editUrl = '';
666                 }
667 //              $editButtonTag = $this->gDesign->createEditButton($editUrl, $this->_('Edit Template'), ''/*タグID*/, $editDisabled/*ボタン状態*/);
668                 
669                 // テンプレートCSS生成ボタン
670                 $generateCssUrl = '?task=' . self::TASK_TEMPGENERATECSS . '&' . M3_REQUEST_PARAM_TEMPLATE_ID . '=' . $templateId;       // テンプレートCSS生成画面
671                 $generateDisabled = '';
672                 $canGenerateCss = $this->canGenerateCss($templateId);
673                 if (!$canGenerateCss) $generateDisabled = 'class="disabled"';
674                 
675                 // デフォルト選択ボタン
676                 $defaultDisabled = '';
677                 if (!$isExistsTemplate || $templateId == $this->defalutTemplate) $defaultDisabled = 'class="disabled"';
678                 
679                 $row = array(
680                         'index'                 => $index,                                                                                                      // 項目番号
681                         'serial'                => $this->convertToDispString($fetchedRow['tm_serial']),                        // シリアル番号
682                         'id_str'                => $idText,
683                         'id'                    => $this->convertToDispString($templateId),                     // ID
684                         'template_id'   => $this->convertToDispString($configTemplateId),       // 設定画面用テンプレートID
685                         'name'                  => $name,               // 名前
686                         'info_button'   => $infoButtonTag,              // テンプレート情報URL
687                         'format_type'   => $formatType,         // テンプレート形式
688                         'update_dt'             => $this->convertToDispDateTime($fetchedRow['tm_create_dt']),   // 更新日時
689 //                      'is_default'    => $defaultCheck,                                                                               // デフォルトテンプレートかどうか
690                         'image_tag'             => $imageTag,           // 画像
691                         'download_button'       => $downloadButtonTag,          // ダウンロードボタン
692                         'config_disabled'       => $configDisabled,                     // テンプレート設定画面ボタンの使用可否
693                         'edit_disabled'         => $editDisabled,               // テンプレート編集ボタンの使用可否
694                         'edit_url'                      => $editUrl,                            // テンプレート画像編集用URL
695                         'generate_css_url'      => $generateCssUrl,                     // テンプレートCSS生成用URL
696                         'generate_disabled'     => $generateDisabled,           // CSS生成ボタンの使用可否
697                         'default_disabled'      => $defaultDisabled             // デフォルト選択ボタン
698                 );
699                 $this->tmpl->addVars('templist', $row);
700                 $this->tmpl->parseTemplate('templist', 'a');
701                 
702                 // 表示中のコンテンツIDを保存
703                 $this->serialArray[] = $templateId;
704                 
705                 $this->isExistsTemplateList = true;             // テンプレートが存在する
706                 return true;
707         }
708         /**
709          * テンプレートを新規追加
710          *
711          * @param int $type                     テンプレート種別(0=PC用、1=携帯用, 2=スマートフォン用)
712          * @param string $id            テンプレートID(ディレクトリ名)
713          * @param bool                          true=成功、false=失敗
714          */
715         function addNewTemplate($type, $id)
716         {
717                 $ret = false;
718                 $templType = 0;                 // テンプレートのタイプデフォルト値(Joomla!1.0)
719                 $cleanType = 0;                 // HTMLの出力のクリーニングタイプ
720                 $genarator = '';                // テンプレート作成アプリケーション
721                 $version = '';                  // テンプレートバージョン
722                 $infoUrl = '';                  // テンプレート情報リンク
723                 $templateDir = $this->gEnv->getTemplatesPath() . '/' . $id;                     // テンプレートディレクトリ
724                 
725                 // テンプレートかどうかのエラーチェック
726                 if (!file_exists($templateDir . '/index.php')){                 // index.phpがなければエラー
727                         $msg = $this->_('Upload file is not the correct template format.');             // アップロードしたファイルは正しいテンプレートフォーマットではありません。
728                         $this->setAppErrorMsg($msg);
729                         return false;
730                 }
731                 
732                 // テンプレートの種別を判定
733                 switch ($type){
734                         case '0':               // PC用テンプレート
735                         case '2':               // スマートフォン用テンプレート
736                                 $configFile = $this->gEnv->getTemplatesPath() . '/' . $id . '/' . self::JOOMLA_CONFIG_FILENAME;
737                                 if (file_exists($configFile)){
738                                         if (!function_exists('simplexml_load_file')){
739                                                 $msg = $this->_('SimpleXML module not installed.');             // SimpleXML拡張モジュールがインストールされていません
740                                                 $this->setAppErrorMsg($msg);
741                                                 return false;
742                                         }
743                                         $xml = simplexml_load_file($configFile);
744                                         if ($xml !== false){
745                                                 if ($xml->attributes()->type == 'template'){
746                                                         $version = $xml->attributes()->version;
747                                                         $format = $xml->attributes()->format;
748                                                         if (strcasecmp($format, 'bootstrap') == 0){             // Bootstrapタイプのテンプレートの場合
749                                                                 $templType = 10;                // Bootstrap v3.0型
750                                                         } else {                                        // デフォルトのテンプレート(Joomlaタイプ)
751                                                                 if (version_compare($version, '1.6') >= 0){
752                                                                         $templType = 2;         // Joomla!v2.5テンプレート
753                                                                 } else if (version_compare($version, '1.5') >= 0){
754                                                                         $templType = 1;         // Joomla!v1.5テンプレート
755
756                                                                         // テンプレートをテスト
757                                                                         $cleanType = $this->checkTemplate($id);
758                                                                 }
759                                                         }
760                                                         
761                                                         // テンプレート情報リンク
762                                                         if (!empty($xml->infoUrl)) $infoUrl = $xml->infoUrl;
763                                                 }
764                                         }
765                                 } else {
766                                         // 設定ファイルがない場合はWordPressテンプレートかどうかチェック
767                                         $content = @file_get_contents($templateDir . '/header.php');
768                                         if (empty($content)) $content = @file_get_contents($templateDir . '/index.php');                // Themlerテンプレート対応
769                                         $ret = $this->isWordpressTemplate($content);
770                                         if ($ret) $templType = 100;             // WordPress型
771                                 }
772                                 // ##### テンプレート作成アプリケーションを取得 #####
773                                 // Artisteerテンプレートかどうか確認
774                                 $content = file_get_contents($templateDir . '/index.php');
775                                 $version = $this->getArtVersion($content);
776                                 if (!empty($version)){
777                                         $genarator = 'artisteer';               // テンプレート作成アプリケーション
778                                 } else {
779                                         // Themlerテンプレートかどうか確認
780                                         $ret = $this->isTemlerTemplate($templateDir, $version);
781                                         if ($ret){
782                                                 $genarator = 'themler';
783                                                 
784                                                 // Themlerテンプレートの修正処理を行う
785                                                 $this->fixThemlerTemplate($templateDir);
786                                         }
787                                 }
788                                 break;
789                 }
790                         
791                 // テンプレートを登録
792                 $ret = $this->db->addNewTemplate($id, $id, $templType, intval($type), $cleanType, $genarator, $version, $infoUrl);
793                 if ($ret){
794                         // テンプレート登録後、テンプレートを解析してCSSファイルを取得
795                         $templateInfoObj = $this->gPage->parseTemplate($id);
796                 
797                         // テンプレートの情報を更新
798                         $updateParam = array();
799                         $updateParam['tm_editor_param'] = serialize($templateInfoObj);
800                         $ret = $this->_db->updateTemplate($id, $updateParam);
801                 }
802                 return $ret;
803         }
804         /**
805          * テンプレートを初期化
806          *
807          * @param string $id            テンプレートID
808          * @return bool                         true=成功、false=失敗
809          */
810         function initializeTemplate($id)
811         {
812                 $templateDir = $this->gEnv->getTemplatesPath() . '/' . $id;             // テンプレートディレクトリ
813                 
814                 // テンプレートの情報を取得
815                 if ($this->_db->getTemplate($id, $row)){
816                         $genarator = $row['tm_generator'];                      // テンプレート作成アプリケーション
817                         
818                         // Themlerテンプレートの修正処理を行う
819                         switch ($genarator){
820                         case 'themler':
821                                 $this->fixThemlerTemplate($templateDir);
822                                 break;
823                         }
824                         
825                         // テンプレートを解析し、使用しているCSSファイルを取得
826                         $templateInfoObj = $this->gPage->parseTemplate($id);
827                         
828                         // テンプレートの情報を更新
829                         $updateParam = array();
830                         $updateParam['tm_editor_param'] = serialize($templateInfoObj);
831                         $ret = $this->_db->updateTemplate($id, $updateParam);
832                         return $ret;
833                 } else {
834                         return false;
835                 }
836         }
837         /**
838          * テンプレートIDを取得
839          *
840          * @param string $dir           テンプレートのディレクトリ
841          * @return string                       テンプレート(取得できないときは空を返す)
842          */
843         function getTemplateId($dir)
844         {
845                 // デフォルトはディレクトリ名
846                 $id = basename($dir);
847
848                 // 設定ファイルがあれば読み込む
849                 $configFile = $dir . '/' . self::JOOMLA_CONFIG_FILENAME;
850                 if (file_exists($configFile)){
851                         if (!function_exists('simplexml_load_file')){
852                                 $msg = $this->_('SimpleXML module not installed.');             // SimpleXML拡張モジュールがインストールされていません
853                                 $this->setAppErrorMsg($msg);
854                                 return '';
855                         }
856                         $xml = simplexml_load_file($configFile);
857                         if ($xml !== false){
858                                 $name = trim($xml->name);
859                                 if (!empty($name)) $id = $name;
860                         }
861                 }
862                 return $id;
863         }
864         /**
865          * CSS生成可能か判断
866          *
867          * @param string $id            テンプレートID
868          * @return bool                         true=CSS生成可能、false=CSS生成不可
869          */
870         function canGenerateCss($id)
871         {
872                 $canGenerate = false;           // 生成可否
873                 
874                 $configFile = $this->gEnv->getTemplatesPath() . '/' . $id . '/' . self::JOOMLA_CONFIG_FILENAME;
875                 if (file_exists($configFile)){
876                         if (!function_exists('simplexml_load_file')){
877                                 $msg = $this->_('SimpleXML module not installed.');             // SimpleXML拡張モジュールがインストールされていません
878                                 $this->setAppErrorMsg($msg);
879                                 return false;
880                         }
881                         $xml = simplexml_load_file($configFile);
882                         if ($xml !== false){
883                                 if ($xml->attributes()->type == 'template'){
884                                         $version = $xml->attributes()->version;
885                                         $format = $xml->attributes()->format;
886                                         
887                                         $less = $xml->develop->less;
888 //                                      $sass = $xml->develop->sass;
889 //                                      $scss = $xml->develop->scss;
890                                         if (!empty($less)) $canGenerate = true;
891                                 }
892                         }
893                 }
894                 return $canGenerate;
895         }
896         /**
897          * タイプ選択メニュー作成
898          *
899          * @return なし
900          */
901         function createTemplateTypeMenu()
902         {
903                 for ($i = 0; $i < count($this->templateTypeArray); $i++){
904                         $value = $this->templateTypeArray[$i]['value'];
905                         $name = $this->templateTypeArray[$i]['name'];
906                         
907                         $selected = '';
908                         if ($value == $this->templateType) $selected = 'selected';
909                         
910                         $row = array(
911                                 'value'    => $value,                   // ページID
912                                 'name'     => $name,                    // ページ名
913                                 'selected' => $selected                                                                                                         // 選択中かどうか
914                         );
915                         $this->tmpl->addVars('item_type_list', $row);
916                         $this->tmpl->parseTemplate('item_type_list', 'a');
917                 }
918         }
919         /**
920          * テンプレートの出力チェック
921          *
922          * @param string $templateId    テンプレートID
923          * @return int                                  クリーン処理タイプ
924          */
925         function checkTemplate($id)
926         {
927                 $cleanType = 0;
928                 
929                 // Joomla!テンプレート共通の設定
930                 define('_JEXEC', 1);
931                         
932                 // Joomla!v1.5用の設定
933                 define('JPATH_BASE', dirname(__FILE__));
934                 define('DS', DIRECTORY_SEPARATOR);
935                 
936                 // バッファ作成
937                 ob_start();
938                 
939                 $render = new JRender();
940                 $render->setTemplate($id);
941                 $contents = $render->getComponentContents('test', 'dummy contents', 'test');
942                 
943                 // 不要なタグをチェック
944                 $pos = strpos($contents, 'PostHeaderIcons');
945                 if ($pos !== false) $cleanType = 1;
946                 
947                 // バッファを破棄
948                 ob_end_clean();
949                 return $cleanType;
950         }
951         /**
952          * テンプレートのindex.phpファイルからArtisteerバージョンを取得
953          *
954          * @param string $src           検索するデータ
955          * @return string                       検出の場合はバージョン文字列、未検出の場合は空文字列。
956          */
957         function getArtVersion($src)
958         {
959                 $version = '';
960                 // <!-- Created by Artisteer v4.1.0.59688 -->
961                 $pattern = '/<!-- Created by Artisteer[^<]*?v([.\d]+)[^<]*?-->/i';
962         $ret = preg_match($pattern, $src, $matches);
963                 if ($ret) $version = $matches[1];
964                 return $version;
965         }
966         /**
967          * WordPressテンプレートかどうかチェック
968          *
969          * @param string $src           検索するデータ
970          * @return bool                         true=WordPressテンプレート、false=WordPressテンプレート以外
971          */
972         function isWordpressTemplate($src)
973         {
974                 $pos = strpos($src, 'wp_head()');
975                 if ($pos === false){
976                         return false;
977                 } else {
978                         return true;
979                 }
980         }
981         /**
982          * Themlerテンプレートかどうかを判断
983          *
984          * @param string $dir           テンプレートのディレクトリ
985          * @param string $version       Themlerテンプレートの場合、テンプレートのバージョンが返る
986          * @return bool                         true=Themlerテンプレート、false=Themlerテンプレート以外
987          */
988         function isTemlerTemplate($dir, &$version)
989         {
990                 // Themlerテンプレートを判断するファイル
991                 $appFile = $dir . '/' . self::THEMLER_APP_FILENAME;
992                 $ret = file_exists($appFile);
993                 
994                 if ($ret){
995                         @require_once($dir . '/functions.php');         // エラーメッセージ抑止
996                         $verSrc = addThemeVersion('');
997                         list($tmp, $version) = explode('=', $verSrc);
998                 }
999                 return $ret;
1000         }
1001         /**
1002          * Themlerテンプレートの修正
1003          *
1004          * @param string $templateDir           テンプレートのディレクトリ
1005          * @return bool                                         true=成功、false=失敗
1006          */
1007         function fixThemlerTemplate($templateDir)
1008         {
1009                 $searchDir = $templateDir . '/html/com_content';
1010                 $dir = dir($searchDir);
1011                 while (($file = $dir->read()) !== false){
1012                         $filePath = $searchDir . '/' . $file;
1013                         
1014                         // ディレクトリかどうかチェック
1015                         if (strncmp($file, '.', 1) != 0 && $file != '..' && is_dir($filePath)){
1016                                 $targetFile = $filePath . '/default.php';
1017                                 $this->fixThemlerTemplateDefaultFile($targetFile);
1018                         }
1019                 }
1020                 $dir->close();
1021         }
1022         /**
1023          * Themlerテンプレートのcom_contentディレクトリ以下のdefault.phpファイルの修正を行う
1024          *
1025          * @param string $filePath      対象ファイルのパス
1026          * @return bool                         true=成功、false=失敗
1027          */
1028         function fixThemlerTemplateDefaultFile($filePath)
1029         {
1030                 // ファイルが存在しない場合は終了
1031                 if (!file_exists($filePath)) return false;
1032
1033                 // 現在のファイルを読み込む
1034                 if (!($file = @fopen($filePath, "r"))){
1035                         $errMsg = 'ファイルのオープンに失敗しました ファイル=' . $filePath;
1036                         $this->gLog->error(__METHOD__, $errMsg);
1037                         $msg = $errMsg;
1038                         return false;
1039                 }
1040                 $content = @fread($file, filesize($filePath));
1041                 @fclose($file);
1042                 
1043                 // プログラム変更処理
1044                 $content = str_replace('require_once \'default_template.php\';', 'require \'default_template.php\';', $content);
1045                 
1046                 // ファイルに保存
1047                 $backupFilePath = dirname($filePath) . '/_' . basename($filePath);
1048                 $isOk = writeFile($backupFilePath, $content);
1049                 if (!$isOk) return false;
1050
1051                 // 新旧ファイル入れ替え
1052                 $tmpFilePath = $filePath . '_tmp';
1053                 if (!renameFile($filePath, $tmpFilePath)){
1054                         $errMsg = 'ファイルを移動できません';
1055                         $this->gLog->error(__METHOD__, $errMsg);
1056                         $msg = $errMsg;
1057                         
1058                         // 作成したファイルを削除
1059                         unlink($backupFilePath);
1060                         return false;
1061                 }
1062                 if (!renameFile($backupFilePath, $filePath)){
1063                         $errMsg = 'ファイルを移動できません';
1064                         $this->gLog->error(__METHOD__, $errMsg);
1065                         $msg = $errMsg;
1066                         
1067                         // 作成したファイルを削除
1068                         unlink($backupFilePath);
1069                         
1070                         // ファイルを戻す
1071                         renameFile($tmpFilePath, $filePath);
1072                         return false;
1073                 }
1074                 if (!renameFile($tmpFilePath, $backupFilePath)){
1075                         $errMsg = 'ファイルを移動できません';
1076                         $this->gLog->error(__METHOD__, $errMsg);
1077                         $msg = $errMsg;
1078                         
1079                         // 作成したファイルを削除
1080                         unlink($tmpFilePath);
1081                         return false;
1082                 }
1083                 return true;
1084         }
1085         /**
1086          * アクセスポイントが有効かどうか
1087          *
1088          * @param int   $deviceType デバイスタイプ(0=PC,1=携帯,2=スマートフォン)
1089          * @return bool                         true=有効、false=無効
1090          */
1091         function isActiveAccessPoint($deviceType)
1092         {
1093                 // ページID作成
1094                 switch ($deviceType){
1095                         case 0:         // PC
1096                                 $pageId = 'index';
1097                                 break;
1098                         case 1:         // 携帯
1099                                 $pageId = M3_DIR_NAME_MOBILE . '_index';
1100                                 break;
1101                         case 2:         // スマートフォン
1102                                 $pageId = M3_DIR_NAME_SMARTPHONE . '_index';
1103                                 break;
1104                 }
1105                 
1106                 $isActive = false;
1107                 $ret = $this->db->getPageIdRecord(0/*アクセスポイント*/, $pageId, $row);
1108                 if ($ret){
1109                         $isActive = $row['pg_active'];
1110                 }
1111                 return $isActive;
1112         }
1113 }
1114 ?>