tpl_mainpage = 'design/template.tpl'; $this->tpl_subno = 'template'; $this->tpl_mainno = 'design'; $this->tpl_maintitle = t('TPL_MAINTITLE_003'); $this->tpl_subtitle = t('LC_Page_Admin_Design_Template_002'); $this->arrErr = array(); $this->arrForm = array(); ini_set('max_execution_time', 300); $masterData = new SC_DB_MasterData_Ex(); $this->arrDeviceType = $masterData->getMasterData('mtb_device_type'); } /** * Page のプロセス. * * @return void */ function process() { $this->action(); $this->sendResponse(); } /** * Page のアクション. * * @return void */ function action() { $objFormParam = new SC_FormParam_Ex(); $this->lfInitParam($objFormParam); $objFormParam->setParam($_REQUEST); $objFormParam->convParam(); $this->device_type_id = $objFormParam->getValue('device_type_id', DEVICE_TYPE_PC); $this->tpl_select = $this->getTemplateName($this->device_type_id); $template_code = $objFormParam->getValue('template_code'); switch ($this->getMode()) { // 登録ボタン押下時 case 'register': $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { if ($this->doRegister($template_code, $this->device_type_id)) { $this->tpl_select = $template_code; $this->tpl_onload = "alert('" . t('ALERT_004') . "');"; } } break; // 削除ボタン押下時 case 'delete': if ($objFormParam->checkError()) { SC_Utils_Ex::sfDispError(''); } $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { if ($this->doDelete($template_code, $this->device_type_id)) { $this->tpl_onload = "alert('" . t('ALERT_011') . "');"; } } break; // downloadボタン押下時 case 'download': $this->arrErr = $objFormParam->checkError(); if (SC_Utils_Ex::isBlank($this->arrErr)) { if ($this->doDownload($template_code) !== false) { // ブラウザに出力し, 終了する SC_Response_Ex::actionExit(); } } break; default: break; } if (!$is_error) { $this->templates = $this->getAllTemplates($this->device_type_id); } else { // 画面にエラー表示しないため, ログ出力 GC_Utils_Ex::gfPrintLog('Error: ' . print_r($this->arrErr, true)); } $this->tpl_subtitle = $this->arrDeviceType[$this->device_type_id] . '>' . $this->tpl_subtitle; } /** * デストラクタ. * * @return void */ function destroy() { parent::destroy(); } /** * パラメーター情報の初期化 * * @param object $objFormParam SC_FormParamインスタンス * @return void */ function lfInitParam(&$objFormParam) { $objFormParam->addParam(t('PARAM_LABEL_DEVICE_TYPE_ID'), 'device_type_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK')); $objFormParam->addParam(t('PARAM_LABEL_TPL_CODE'), 'template_code', STEXT_LEN, 'a', array('EXIST_CHECK', 'SPTAB_CHECK','MAX_LENGTH_CHECK', 'ALNUM_CHECK')); } /** * 使用するテンプレートを設定する. * * テンプレートをマスターデータに登録する. * * @param string $template_code テンプレートコード * @param integer $device_type_id 端末種別ID * @return void */ function doUpdateMasterData($template_code, $device_type_id) { $masterData = new SC_DB_MasterData_Ex(); $defineName = 'TEMPLATE_NAME'; switch ($device_type_id) { case DEVICE_TYPE_MOBILE: $defineName = 'MOBILE_' . $defineName; break; case DEVICE_TYPE_SMARTPHONE: $defineName = 'SMARTPHONE_' . $defineName; break; case DEVICE_TYPE_PC: default: break; } // DBのデータを更新 $arrData = array($defineName => var_export($template_code, true)); $masterData->updateMasterData('mtb_constants', array(), $arrData); // キャッシュを生成 $masterData->createCache('mtb_constants', array(), true, array('id', 'remarks')); } /** * ブロック位置の更新. * * ブロック位置を更新する SQL を実行する. * この SQL は, 各端末に合わせて実行する必要がある * * @param string $filepath SQLのファイルパス * @return void */ function updateBloc($filepath) { $sql = file_get_contents($filepath); if ($sql !== false) { // 改行、タブを1スペースに変換 $sql = preg_replace("/[\r\n\t]/", ' ' ,$sql); $sql_split = explode(';', $sql); $objQuery =& SC_Query_Ex::getSingletonInstance(); foreach ($sql_split as $val) { if (trim($val) != '') { $objQuery->query($val); } } } } /** * テンプレートパッケージの削除. * * @param string $template_code テンプレートコード * @param integer $device_type_id 端末種別ID * @return boolean 成功した場合 true; 失敗した場合 false */ function doDelete($template_code, $device_type_id) { if ($template_code == $this->getTemplateName($device_type_id) || $template_code == $this->getTemplateName($device_type_id, true)) { $this->arrErr['err'] = t('LC_Page_Admin_Design_Template_003'); return false; } else { $objQuery =& SC_Query_Ex::getSingletonInstance(); $objQuery->begin(); $objQuery->delete('dtb_templates', 'template_code = ? AND device_type_id = ?', array($template_code, $device_type_id)); $error = t('LC_Page_Admin_Design_Template_004'); // テンプレート削除 $templates_dir = SMARTY_TEMPLATES_REALDIR . $template_code. '/'; if (SC_Helper_FileManager_Ex::deleteFile($templates_dir) === false) { $this->arrErr['err'] = $error; $objQuery->rollback(); return false; } // ユーザーデータ削除 $user_dir = USER_TEMPLATE_REALDIR. $template_code. '/'; if (SC_Helper_FileManager_Ex::deleteFile($user_dir) === false) { $this->arrErr['err'] = $error; $objQuery->rollback(); return false; } // コンパイル削除 $templates_c_dir = DATA_REALDIR. 'Smarty/templates_c/'. $template_code. '/'; if (SC_Helper_FileManager_Ex::deleteFile($templates_c_dir) === false) { $this->arrErr['err'] = $error; $objQuery->rollback(); return false; } $objQuery->commit(); return true; } } /** * 登録を実行する. * * 失敗した場合は, エラーメッセージを出力し, false を返す. * * @param string $template_code テンプレートコード * @param integer $device_type_id 端末種別ID * @return boolean 成功した場合 true; 失敗した場合 false */ function doRegister($template_code, $device_type_id) { $tpl_dir = USER_TEMPLATE_REALDIR . $template_code . '/'; if (!is_dir($tpl_dir)) { $this->arrErr['err'] = t('LC_Page_Admin_Design_Template_005', array('T_FIELD' => $tpl_dir)); return false; } // 更新SQLファイルが存在する場合はブロック位置を更新 $sql_file = $tpl_dir . 'sql/update_bloc.sql'; if (file_exists($sql_file)) { $this->updateBloc($sql_file); } $this->doUpdateMasterData($template_code, $device_type_id); // コンパイルファイルのクリア処理 $objView = new SC_AdminView_Ex(); $objView->_smarty->clear_compiled_tpl(); return true; } /** * ダウンロードを実行する. * * 指定のテンプレートをアーカイブし, ブラウザに出力する. * 失敗した場合は, エラーメッセージを出力し, false を返す. * * @param string $template_code テンプレートコード * @return boolean 成功した場合 true; 失敗した場合 false */ function doDownload($template_code) { $from_dir = USER_TEMPLATE_REALDIR . $template_code . '/'; $to_dir = SMARTY_TEMPLATES_REALDIR . $template_code . '/_packages/'; if (SC_Utils_Ex::recursiveMkdir($to_dir) === false) { $this->arrErr['err'] = t('LC_Page_Admin_Design_Template_006'); return false; } SC_Utils_Ex::sfCopyDir($from_dir, $to_dir); if (SC_Helper_FileManager_Ex::downloadArchiveFiles(SMARTY_TEMPLATES_REALDIR . $template_code, $template_code) === false) { $this->arrErr['err'] = t('LC_Page_Admin_Design_Template_007'); return false; } return true; } /** * テンプレート情報を取得する. * * @param integer $device_type_id 端末種別ID * @return array テンプレート情報の配列 */ function getAllTemplates($device_type_id) { $objQuery =& SC_Query_Ex::getSingletonInstance(); return $objQuery->select('*', 'dtb_templates', 'device_type_id = ?', array($device_type_id)); } /** * テンプレート名を返す. * * @param integer $device_type_id 端末種別ID * @param boolean $isDefault デフォルトテンプレート名を返す場合 true * @return string テンプレート名 */ function getTemplateName($device_type_id, $isDefault = false) { switch ($device_type_id) { case DEVICE_TYPE_MOBILE: return $isDefault ? MOBILE_DEFAULT_TEMPLATE_NAME : MOBILE_TEMPLATE_NAME; case DEVICE_TYPE_SMARTPHONE: return $isDefault ? SMARTPHONE_DEFAULT_TEMPLATE_NAME : SMARTPHONE_TEMPLATE_NAME; case DEVICE_TYPE_PC: default: break; } return $isDefault ? DEFAULT_TEMPLATE_NAME : TEMPLATE_NAME; } }