Changeset 20847
- Timestamp:
- 2011/04/15 22:58:24 (13 years ago)
- bzr:base-revision:
- svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_11-dev:20846
- bzr:committer:
- Kentaro Ohkouchi <ohkouchi@loop-az.jp>
- bzr:file-ids:
data/Smarty/templates/admin/design/main_edit.tpl 15732@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2FSmarty%2Ftemplates%2Fdefault%2Fadmin%2Fdesign%2Fmain_edit.tpl
data/class/helper/SC_Helper_FileManager.php 16253@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fhelper%2FSC_Helper_FileManager.php
data/class/helper/SC_Helper_PageLayout.php 15078@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fhelper%2FSC_Helper_PageLayout.php
data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php 15682@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fpages%2Fadmin%2Fdesign%2FLC_Page_Admin_Design_MainEdit.php
data/class/util/SC_Utils.php 15078@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Futil%2FSC_Utils.php
test/class/util/SC_Utils_Test.php sc_utils_test.php-20100802013957-750m2yralg9cowkd-1- bzr:mapping-version:
- v4
- bzr:merge:
ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu- bzr:repository-uuid:
- 1e3b908f-19a9-db11-a64c-001125224ba8
- bzr:revision-id:
- ohkouchi@loop-az.jp-20110415135820-5xdfd57eknr425dj
- bzr:revno:
- 3558
- bzr:revprop:branch-nick:
- branches/version-2_11-dev
- bzr:root:
- branches/version-2_11-dev
- bzr:text-revisions:
data/Smarty/templates/admin/design/main_edit.tpl ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
data/class/helper/SC_Helper_FileManager.php ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
data/class/helper/SC_Helper_PageLayout.php ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu
test/class/util/SC_Utils_Test.php ohkouchi@loop-az.jp-20110415135459-j12posg14af2xtbu- bzr:timestamp:
- 2011-04-15 22:58:20.900000095 +0900
- bzr:user-agent:
- bzr2.2.1+bzr-svn1.0.4
- svn:original-date:
- 2011-04-15T13:58:20.900000Z
- Location:
- branches/version-2_11-dev
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/version-2_11-dev/data/Smarty/templates/admin/design/main_edit.tpl
r20813 r20847 27 27 document.form_edit.target = "_self"; 28 28 } 29 30 browser_type = 0;31 if(navigator.userAgent.indexOf("MSIE") >= 0){32 browser_type = 1;33 }34 else if(navigator.userAgent.indexOf("Mozilla") >= 0){35 browser_type = 2;36 }37 29 //--> 38 30 </script> … … 45 37 <input type="hidden" name="device_type_id" value="<!--{$device_type_id|h}-->" /> 46 38 47 <!--{if $arrErr. page_id_err != ""}-->39 <!--{if $arrErr.err != ""}--> 48 40 <div class="message"> 49 <span class="attention"><!--{$arrErr. page_id_err}--></span>41 <span class="attention"><!--{$arrErr.err}--></span> 50 42 </div> 51 43 <!--{/if}--> … … 54 46 <th>名称</th> 55 47 <td> 56 <!--{if $arrPageData.edit_flg == 2}--> 57 <!--{$arrPageData.page_name|h}--><input type="hidden" name="page_name" value="<!--{$arrPageData.page_name|h}-->" /> 48 <!--{assign var=key value="page_name"}--> 49 <!--{if $arrForm.edit_flg.value == 2}--> 50 <!--{$arrForm[$key].value|h}--><input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" /> 58 51 <!--{else}--> 59 <input type="text" name=" page_name" value="<!--{$arrPageData.page_name|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.page_name != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->" size="60" class="box60" /><span class="attention"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span>52 <input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" maxlength="<!--{$arrForm[$key].length|h}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" size="60" class="box60" /><span class="attention"> (上限<!--{$arrForm[$key].length|h}-->文字)</span> 60 53 <!--{/if}--> 61 <!--{if $arrErr .page_name!= ""}-->54 <!--{if $arrErr[$key] != ""}--> 62 55 <div class="message"> 63 <span class="attention"><!--{$arrErr .page_name}--></span>56 <span class="attention"><!--{$arrErr[$key]}--></span> 64 57 </div> 65 58 <!--{/if}--> … … 69 62 <th>URL</th> 70 63 <td> 71 <!--{if $arrPageData.edit_flg == 2}--> 72 <!--{$smarty.const.HTTP_URL|h}--><!--{$arrPageData.url|h}--> 73 <input type="hidden" name="url" value="<!--{$arrPageData.filename|h}-->" /> 64 <!--{assign var=key value="filename"}--> 65 <!--{if $arrForm.edit_flg.value == 2}--> 66 <!--{$smarty.const.HTTP_URL|h}--><!--{$arrForm[$key].value|h}-->.php 67 <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" /> 74 68 <!--{else}--> 75 <!--{$smarty.const.USER_URL|h}--><input type="text" name=" url" value="<!--{$arrPageData.filename|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.url != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}--> ime-mode: disabled;" size="40" class="box40" />.php<span class="attention"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span>69 <!--{$smarty.const.USER_URL|h}--><input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" maxlength="<!--{$arrForm[$key].length|h}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" ime-mode: disabled;" size="40" class="box40" />.php<span class="attention"> (上限<!--{$arrForm[$key].length|h}-->文字)</span> 76 70 <!--{/if}--> 77 <!--{if $arrErr .url!= ""}-->71 <!--{if $arrErr[$key] != ""}--> 78 72 <div class="attention"> 79 <span class="attention"><!--{$arrErr .url}--></span>73 <span class="attention"><!--{$arrErr[$key]}--></span> 80 74 </div> 81 75 <!--{/if}--> … … 84 78 <tr> 85 79 <td colspan="2"> 86 <label for="header-chk"><input type="checkbox" name="header_chk" id="header-chk" value="1" <!--{if $arr PageData.header_chk== "1"}-->checked="checked"<!--{/if}--> />共通のヘッダーを使用する</label> 87 <label for="footer-chk"><input type="checkbox" name="footer_chk" id="footer-chk" value="1" <!--{if $arr PageData.footer_chk== "1"}-->checked="checked"<!--{/if}--> />共通のフッターを使用する</label>80 <label for="header-chk"><input type="checkbox" name="header_chk" id="header-chk" value="1" <!--{if $arrForm.header_chk.value == "1"}-->checked="checked"<!--{/if}--> />共通のヘッダーを使用する</label> 81 <label for="footer-chk"><input type="checkbox" name="footer_chk" id="footer-chk" value="1" <!--{if $arrForm.footer_chk.value == "1"}-->checked="checked"<!--{/if}--> />共通のフッターを使用する</label> 88 82 <div> 89 <textarea id="tpl_data" class="top" name="tpl_data" rows=<!--{$text_row}--> style="width: 98%;"><!--{$arr PageData.tpl_data|h|smarty:nodefaults}--></textarea>83 <textarea id="tpl_data" class="top" name="tpl_data" rows=<!--{$text_row}--> style="width: 98%;"><!--{$arrForm.tpl_data.value|h|smarty:nodefaults}--></textarea> 90 84 <input type="hidden" name="html_area_row" value="<!--{$text_row}-->" /><br /> 91 85 <a id="resize-btn" class="btn-normal" href="javascript:;" onclick="ChangeSize('#resize-btn', '#tpl_data', 50, 13); return false;"><span>拡大</span></a> … … 102 96 103 97 <h2>編集可能ページ一覧</h2> 98 <div class="btn addnew"> 99 <a class="btn-normal" href="?device_type_id=<!--{$device_type_id|u}-->"><span>ページを新規入力</span></a> 100 </div> 104 101 <table class="list"> 105 102 <colgroup width="70%"> … … 134 131 <!--{/foreach}--> 135 132 </table> 136 <div class="btn addnew">137 <a class="btn-normal" href="?device_type_id=<!--{$device_type_id|u}-->"><span>ページを新規入力</span></a>138 </div>139 133 </form> -
branches/version-2_11-dev/data/class/helper/SC_Helper_FileManager.php
r20764 r20847 345 345 * @param string $filename ファイルパス 346 346 * @param string $value 書き込み内容 347 * @return boolean ファイルの書き込みに成功した場合 true 347 348 */ 348 349 function sfWriteFile($filename, $value) { 349 $fp = @fopen($filename, 'w'); 350 // ファイルに書き込む 351 if($fp) { 352 fwrite($fp, $value); 353 } 354 @fclose($fp); 350 if (!is_dir(dirname($filename))) { 351 SC_Utils_Ex::recursiveMkdir(dirname($filename), 0777); 352 } 353 $fp = fopen($filename,'w'); 354 if ($fp === false) { 355 return false; 356 } 357 if (fwrite($fp, $value) === false) { 358 return false; 359 } 360 return fclose($fp);; 355 361 } 356 362 -
branches/version-2_11-dev/data/class/helper/SC_Helper_PageLayout.php
r20830 r20847 58 58 $arrPageData = $this->getPageProperties($device_type_id, 0); 59 59 } 60 60 61 $objPage->tpl_mainpage = $this->getTemplatePath($device_type_id) . $arrPageData[0]['filename'] . ".tpl"; 61 62 $objPage->arrPageLayout =& $arrPageData[0]; … … 185 186 if ($page_id != '') { 186 187 $arrPageData = $this->getPageProperties($device_type_id, $page_id); 187 // SQL実行188 188 $ret = $objQuery->delete("dtb_pagelayout", "page_id = ? AND device_type_id = ?", array($page_id, $device_type_id)); 189 190 189 // ファイルの削除 191 190 $this->lfDelFile($arrPageData[0]['filename'], $device_type_id); … … 207 206 $objQuery =& SC_Query_Ex::getSingletonInstance(); 208 207 209 // 同名ファイルの使用件数 208 /* 209 * 同名ファイルの使用件数 210 * PHP ファイルは, 複数のデバイスで共有するため, device_type_id を条件に入れない 211 */ 210 212 $count = $objQuery->count('dtb_pagelayout', 'filename = ?', array($filename)); 211 213 -
branches/version-2_11-dev/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php
r20841 r20847 24 24 // {{{ requires 25 25 require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php'; 26 require_once CLASS_EX_REALDIR . 'helper_extends/SC_Helper_FileManager_Ex.php'; 26 27 27 28 /** … … 70 71 */ 71 72 function action() { 72 $objView = new SC_AdminView_Ex(); 73 $this->objLayout = new SC_Helper_PageLayout_Ex(); 74 75 // ページIDを取得 76 if (isset($_REQUEST['page_id']) && is_numeric($_REQUEST['page_id'])) { 77 $page_id = $_REQUEST['page_id']; 78 } 79 80 $this->page_id = $page_id; 81 82 // 端末種別IDを取得 83 if (isset($_REQUEST['device_type_id']) 84 && is_numeric($_REQUEST['device_type_id'])) { 85 $device_type_id = $_REQUEST['device_type_id']; 86 } else { 87 $device_type_id = DEVICE_TYPE_PC; 88 } 89 90 //サブタイトルの追加 91 $this->tpl_subtitle .= ' - ' . $this->arrDeviceType[$device_type_id]; 92 93 // ページ一覧を取得 94 $this->arrPageList = $this->objLayout->getPageProperties($device_type_id, null); 95 96 // メッセージ表示 97 if (isset($_GET['msg']) && $_GET['msg'] == 'on'){ 98 $this->tpl_onload="alert('登録が完了しました。');"; 99 } 100 101 // page_id が指定されている場合にはテンプレートデータの取得 102 if (is_numeric($page_id) && $page_id != '') { 103 $this->arrPageData = $this->lfGetPageData($page_id, $device_type_id, $objView); 104 } 73 $objLayout = new SC_Helper_PageLayout_Ex(); 74 $objFormParam = new SC_FormParam_Ex(); 75 $this->lfInitParam($objFormParam); 76 $objFormParam->setParam($_REQUEST); 77 $objFormParam->convParam(); 78 $this->arrErr = $objFormParam->checkError(); 79 $is_error = (!SC_Utils_Ex::isBlank($this->arrErr)); 80 81 $this->device_type_id = $objFormParam->getValue('device_type_id', DEVICE_TYPE_PC); 82 $this->page_id = $objFormParam->getValue('page_id'); 105 83 106 84 switch ($this->getMode()) { 107 85 case 'delete': 108 if ($this->objLayout->isEditablePage($device_type_id, $page_id)) { 109 $this->lfDeletePageData($page_id, $device_type_id); 110 exit; 86 if (!$is_error) { 87 if ($objLayout->isEditablePage($this->device_type_id, $this->page_id)) { 88 $objLayout->lfDelPageData($this->page_id, $this->device_type_id); 89 SC_Response_Ex::reload(array("device_type_id" => $this->device_type_id, 90 "msg" => "on"), true); 91 exit; 92 } 111 93 } 112 94 break; 113 95 114 96 case 'confirm': 115 $this->lfConfirmPageData($page_id, $device_type_id); 97 if (!$is_error) { 98 $this->arrErr = $this->lfCheckError($objFormParam, $this->arrErr); 99 if (SC_Utils_Ex::isBlank($this->arrErr)) { 100 $result = $this->doRegister($objFormParam, $objLayout); 101 if ($result !== false) { 102 SC_Response_Ex::reload(array("device_type_id" => $this->device_type_id, 103 "page_id" => $result, 104 "msg" => "on"), true); 105 exit; 106 } 107 } 108 } 116 109 default: 117 } 118 $this->device_type_id = $device_type_id; 110 if (isset($_GET['msg']) && $_GET['msg'] == 'on'){ 111 $this->tpl_onload = "alert('登録が完了しました。');"; 112 } 113 } 114 115 if (!$is_error) { 116 $this->arrPageList = $objLayout->getPageProperties($this->device_type_id, null); 117 // page_id が指定されている場合にはテンプレートデータの取得 118 if (!SC_Utils_Ex::isBlank($this->page_id)) { 119 $arrPageData = $this->getTplMainpage($this->device_type_id, $this->page_id, $objLayout); 120 $objFormParam->setParam($arrPageData); 121 } 122 } else { 123 // 画面にエラー表示しないため, ログ出力 124 GC_Utils_Ex::gfPrintLog('Error: ' . print_r($this->arrErr, true)); 125 } 126 $this->tpl_subtitle .= ' - ' . $this->arrDeviceType[$this->device_type_id]; 127 $this->arrForm = $objFormParam->getFormParamList(); 119 128 } 120 129 … … 129 138 130 139 /** 140 * パラメータ情報の初期化 141 * 142 * XXX URL のフィールドは, 実際は filename なので注意 143 * 144 * @param object $objFormParam SC_FormParamインスタンス 145 * @return void 146 */ 147 function lfInitParam(&$objFormParam) { 148 $objFormParam->addParam("ページID", "page_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 149 $objFormParam->addParam("端末種別ID", "device_type_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 150 $objFormParam->addParam("名称", "page_name", STEXT_LEN, 'KVa', array("SPTAB_CHECK", "MAX_LENGTH_CHECK")); 151 $objFormParam->addParam("URL", "filename", STEXT_LEN, 'a', array("SPTAB_CHECK", "MAX_LENGTH_CHECK")); 152 $objFormParam->addParam("ヘッダチェック", "header_chk", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 153 $objFormParam->addParam("フッタチェック", "footer_chk", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 154 $objFormParam->addParam("修正フラグ", "edit_flg", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK")); 155 $objFormParam->addParam("TPLデータ", "tpl_data"); 156 } 157 158 /** 131 159 * ページデータを取得する. 132 160 * 161 * @param integer $device_type_id 端末種別ID 133 162 * @param integer $page_id ページID 134 * @param integer $device_type_id 端末種別ID 135 * @param object $objView ビューオブジェクト 136 * @return void 137 */ 138 function lfGetPageData($page_id, $device_type_id, $objView){ 139 $arrPageData = $this->objLayout->getPageProperties($device_type_id, $page_id); 140 141 if (strlen($arrPageData[0]['filename']) == 0) { 142 $this->arrErr['page_id_err'] = "※ 指定されたページは編集できません。"; 143 // 画面の表示 144 $objView->assignobj($this); 145 $objView->display(MAIN_FRAME); 146 exit; 147 } 148 149 // テンプレートを読み込む 150 $templatePath = $this->objLayout->getTemplatePath($device_type_id); 151 $arrPageData[0]['tpl_data'] = file_get_contents($templatePath . $arrPageData[0]['filename'] . ".tpl"); 152 153 // ディレクトリを画面表示用に編集 163 * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス 164 * @return array ページデータの配列 165 */ 166 function getTplMainpage($device_type_id, $page_id, &$objLayout){ 167 $arrPageData = $objLayout->getPageProperties($device_type_id, $page_id); 168 169 $templatePath = $objLayout->getTemplatePath($device_type_id); 170 $filename = $templatePath . $arrPageData[0]['filename'] . ".tpl"; 171 if (file_exists($filename)) { 172 $arrPageData[0]['tpl_data'] = file_get_contents($filename); 173 } 174 // ファイル名を画面表示用に加工しておく 154 175 $arrPageData[0]['filename'] = preg_replace('|^' . preg_quote(USER_DIR) . '|', '', $arrPageData[0]['filename']); 155 156 176 return $arrPageData[0]; 157 177 } 158 178 159 179 /** 160 * データ登録処理. 161 * 162 * @param integer $page_id ページID 163 * @param integer $device_type_id 端末種別ID 164 * @return void 165 */ 166 function lfConfirmPageData($page_id, $device_type_id) { 167 // エラーチェック 168 $this->arrErr = $this->lfErrorCheck($_POST, $device_type_id); 169 170 // エラーがなければ更新処理を行う 171 if (count($this->arrErr) == 0) { 172 // DBへデータを更新する 173 $arrTmp = $this->lfEntryPageData( 174 $device_type_id, 175 $page_id, 176 $_POST['page_name'], 177 USER_DIR . $_POST['url'], 178 intval($_POST['header_chk']) === 1 ? 1 : 2, 179 intval($_POST['footer_chk']) === 1 ? 1 : 2 180 ); 181 $page_id = $arrTmp['page_id']; 182 183 $arrTmp = $this->objLayout->getPageProperties($device_type_id, $page_id); 184 $arrData = $arrTmp[0]; 185 186 // ベースデータでなければファイルを削除し、PHPファイルを作成する 187 if ($this->objLayout->isEditablePage($device_type_id, $arrData['page_id'])) { 188 // PHPファイル作成 189 $this->lfCreatePHPFile($_POST['url'], $device_type_id); 190 } 191 192 // TPLファイル作成 193 $cre_tpl = $this->objLayout->getTemplatePath($device_type_id) . $arrData['filename'] . '.tpl'; 194 $this->lfCreateFile($cre_tpl, $_POST['tpl_data']); 195 196 $arrQueryString = array( 197 "page_id" => $arrData['page_id'], 198 "device_type_id" => $device_type_id, 199 'msg' => 'on', 200 ); 201 $this->objDisplay->reload($arrQueryString, true); 202 exit; 180 * 登録を実行する. 181 * 182 * ファイルの作成に失敗した場合は, エラーメッセージを出力し, 183 * データベースをロールバックする. 184 * 185 * @param SC_FormParam $objFormParam SC_FormParam インスタンス 186 * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス 187 * @return integer|boolean 登録が成功した場合, 登録したページID; 188 * 失敗した場合 false 189 */ 190 function doRegister($objFormParam, &$objLayout) { 191 $filename = $objFormParam->getValue('filename'); 192 $arrParams['device_type_id'] = $objFormParam->getValue('device_type_id'); 193 $arrParams['page_id'] = $objFormParam->getValue('page_id'); 194 $arrParams['header_chk'] = intval($objFormParam->getValue('header_chk')) === 1 ? 1 : 2; 195 $arrParams['footer_chk'] = intval($objFormParam->getValue('footer_chk')) === 1 ? 1 : 2; 196 $arrParams['tpl_data'] = $objFormParam->getValue('tpl_data'); 197 $arrParams['page_name'] = $objFormParam->getValue('page_name'); 198 $arrParams['url'] = USER_DIR . $filename . '.php'; 199 $arrParams['filename'] = USER_DIR . $filename; 200 201 $objQuery =& SC_Query_Ex::getSingletonInstance(); 202 $objQuery->begin(); 203 204 $page_id = $this->registerPage($arrParams, $objLayout); 205 206 /* 207 * 新規登録時 208 * or 編集可能な既存ページ編集時かつ, PHP ファイルが存在しない場合に, 209 * PHP ファイルを作成する. 210 */ 211 if (SC_Utils_Ex::isBlank($arrParams['page_id']) 212 || $objLayout->isEditablePage($arrParams['device_type_id'], $arrParams['page_id'])) { 213 if (!$this->createPHPFile($filename)) { 214 $this->arrErr['err'] = '※ PHPファイルの作成に失敗しました<br />'; 215 $objQuery->rollback(); 216 return false; 217 } 218 // 新規登録時のみ $page_id を代入 219 $arrParams['page_id'] = $page_id; 220 } 221 222 if ($objLayout->isEditablePage($arrParams['device_type_id'], $page_id)) { 223 $tpl_path = $objLayout->getTemplatePath($arrParams['device_type_id']) . $arrParams['filename'] . '.tpl'; 203 224 } else { 204 // エラーがあれば入力時のデータを表示する 205 $this->arrPageData = $_POST; 206 $this->arrPageData['directory'] = ''; 207 $this->arrPageData['filename'] = $_POST['url']; 208 } 209 } 210 211 /** 212 * ブロック情報を更新する. 213 * 214 * @param integer $device_type_id 215 * @param integer $page_id 216 * @param string $page_name 217 * @param string $filename 218 * @param integer $header_chk 219 * @param integer $footer_chk 220 * @return array 実際に使用した更新データ 221 */ 222 function lfEntryPageData($device_type_id, $page_id, $page_name, $filename, $header_chk, $footer_chk) { 223 $objQuery = new SC_Query_Ex(); 224 $arrChk = array(); // 排他チェック用 225 226 // 更新用データの変換 227 $sqlval = $this->lfGetUpdData($device_type_id, $page_id, $page_name, $filename, $header_chk, $footer_chk); 228 229 // データが存在しているかチェックを行う 230 if ($page_id !== ''){ 231 $arrChk = $this->objLayout->getPageProperties($device_type_id, $page_id); 232 } 233 234 // page_id が空 若しくは データが存在していない場合にはINSERTを行う 235 if ($page_id === '' || !isset($arrChk[0])) { 236 // FIXME device_type_id ごとの連番にする 237 $sqlval['page_id'] = $objQuery->nextVal('dtb_pagelayout_page_id'); 238 $sqlval['device_type_id'] = $device_type_id; 239 $sqlval['create_date'] = 'now()'; 240 $objQuery->insert('dtb_pagelayout', $sqlval); 241 } 242 // データが存在してる場合にはアップデートを行う 225 $tpl_path = $objLayout->getTemplatePath($arrParams['device_type_id']) . $filename . '.tpl'; 226 } 227 228 if (!SC_Helper_FileManager_Ex::sfWriteFile($tpl_path, $arrParams['tpl_data'])) { 229 $this->arrErr['err'] = '※ TPLファイルの書き込みに失敗しました<br />'; 230 $objQuery->rollback(); 231 return false; 232 } 233 234 $objQuery->commit(); 235 return $arrParams['page_id']; 236 } 237 238 /** 239 * 入力内容をデータベースに登録する. 240 * 241 * @param array $arrParams フォームパラメータの配列 242 * @param SC_Helper_PageLayout $objLayout SC_Helper_PageLayout インスタンス 243 * @return integer ページID 244 */ 245 function registerPage($arrParams, &$objLayout) { 246 $objQuery =& SC_Query_Ex::getSingletonInstance(); 247 248 // ページIDが空の場合は新規登録 249 $is_new = SC_Utils_Ex::isBlank($arrParams['page_id']); 250 // 既存ページの存在チェック 251 if (!$is_new) { 252 $arrExists = $objLayout->getPageProperties($arrParams['device_type_id'], $arrParams['page_id']); 253 } 254 255 $table = 'dtb_pagelayout'; 256 $arrValues = $objQuery->extractOnlyColsOf($table, $arrParams); 257 $arrValues['update_url'] = $_SERVER['HTTP_REFERER']; 258 $arrValues['update_date'] = 'now()'; 259 260 // 新規登録 261 if ($is_new || SC_Utils_Ex::isBlank($arrExists)) { 262 $objQuery->setOrder(''); 263 $arrValues['page_id'] = 1 + $objQuery->max('page_id', $table, 'device_type_id = ?', 264 array($arrValues['device_type_id'])); 265 $arrValues['create_date'] = 'now()'; 266 $objQuery->insert($table, $arrValues); 267 } 268 // 更新 243 269 else { 244 $objQuery->update('dtb_pagelayout', $sqlval, 'page_id = ? AND device_type_id = ?', 245 array($page_id, $device_type_id)); 246 // 戻り値用 247 $sqlval['page_id'] = $page_id; 248 } 249 return $sqlval; 250 } 251 252 /** 253 * DBへ更新を行うデータを生成する. 254 * 255 * @param integer $device_type_id 256 * @param integer $page_id 257 * @param string $page_name 258 * @param string $filename 259 * @param integer $header_chk 260 * @param integer $footer_chk 261 * @return array 更新データ 262 */ 263 function lfGetUpdData($device_type_id, $page_id, $page_name, $filename, $header_chk, $footer_chk) { 264 $arrUpdData = array( 265 'header_chk' => $header_chk, // ヘッダー使用 266 'footer_chk' => $footer_chk, // フッター使用 267 'update_url' => $_SERVER['HTTP_REFERER'], // 更新URL 268 'update_date' => 'now()', 269 ); 270 271 // ベースデータの場合には変更しない。 272 if ($this->objLayout->isEditablePage($device_type_id, $page_id)) { 273 $arrUpdData['page_name'] = $page_name; 274 $arrUpdData['url'] = $filename . '.php'; 275 $arrUpdData['filename'] = $filename; // 拡張子を付加しない 276 } 277 278 return $arrUpdData; 279 } 280 281 /** 282 * ページデータを削除する. 283 * 284 * @param integer $page_id ページID 285 * @return void 286 */ 287 function lfDeletePageData($page_id, $device_type_id){ 288 $this->objLayout->lfDelPageData($page_id, $device_type_id); 289 $this->objDisplay->reload(array("device_type_id" => $device_type_id), true); 290 } 291 292 /** 293 * 入力項目のエラーチェックを行う. 294 * 295 * XXX $device_type_id が dtb_pagelayout の検索条件に入ってない 296 * 297 * @param array $arrData 入力データ 298 * @param integer $device_type_id 端末種別ID 299 * @return array エラー情報 300 */ 301 function lfErrorCheck($array, $device_type_id) { 302 $objErr = new SC_CheckError_Ex($array); 270 // 編集不可ページは更新しない 271 if (!$objLayout->isEditablePage($arrValues['device_type_id'], $arrValues['page_id'])) { 272 unset($arrValues['page_name']); 273 unset($arrValues['filename']); 274 unset($arrValues['url']); 275 } 276 277 $objQuery->update('dtb_pagelayout', $arrValues, 'page_id = ? AND device_type_id = ?', 278 array($arrValues['page_id'], $arrValues['device_type_id'])); 279 } 280 return $arrValues['page_id']; 281 } 282 283 /** 284 * エラーチェックを行う. 285 * 286 * @param SC_FormParam $objFormParam SC_FormParam インスタンス 287 * @return array エラーメッセージの配列 288 */ 289 function lfCheckError(&$objFormParam, &$arrErr) { 290 $arrParams = $objFormParam->getHashArray(); 291 $objErr = new SC_CheckError_Ex($arrParams); 292 $objErr->arrErr =& $arrErr; 303 293 $objErr->doFunc(array("名称", "page_name", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 304 $objErr->doFunc(array('URL', 'url', STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 305 306 // URLチェック 307 $okUrl = true; 308 foreach (explode('/', $array['url']) as $url_part) { 309 if (!ereg( '^[a-zA-Z0-9:_~\.-]+$', $url_part)) { 310 $okUrl = false; 311 } 312 if ($url_part == '.' || $url_part == '..') { 313 $okUrl = false; 314 } 315 } 316 if (!$okUrl) { 317 $objErr->arrErr['url'] = "※ URLを正しく入力してください。<br />"; 318 } 319 320 // 同一のURLが存在している場合にはエラー 321 $params = array(); 322 323 $sqlWhere = 'url = ?'; 324 $params[] = $this->objLayout->getUserDir($device_type_id) . $array['url'] . '.php'; 325 326 // プレビュー用のレコードは除外 327 $sqlWhere .= ' AND page_id <> 0'; 328 329 // 変更の場合、自身のレコードは除外 330 if (strlen($array['page_id']) != 0) { 331 $sqlWhere .= ' AND page_id <> ?'; 332 $params[] = $array['page_id']; 294 $objErr->doFunc(array('URL', 'filename', STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 295 296 /* 297 * URL チェック 298 * ここでチェックするのは, パスのみなので SC_CheckError::URL_CHECK() 299 * は使用しない 300 */ 301 $valid_url = true; 302 foreach (explode('/', $arrParams['filename']) as $val) { 303 if (!preg_match('/^[a-zA-Z0-9:_~\.\-]+$/', $val)) { 304 $valid_url = false; 305 } 306 if ($val == '.' || $val == '..') { 307 $valid_url = false; 308 } 309 } 310 if (!$valid_url) { 311 $objErr->arrErr['filename'] = "※ URLを正しく入力してください。<br />"; 312 } 313 // 同一URLの存在チェック 314 $where = 'page_id <> 0 AND device_type_id = ? AND filename = ?'; 315 $arrValues = array($arrParams['device_type_id'], 316 SC_Helper_PageLayout_Ex::getUserDir($arrParams['device_type_id']) . $arrParams['filename'] . '.php'); 317 // 変更の場合は自 URL を除外 318 if (!SC_Utils_Ex::isBlank($arrParams['page_id'])) { 319 $where .= ' AND page_id <> ?'; 320 $arrValues[] = $arrParams['page_id']; 333 321 } 334 322 335 323 $objQuery =& SC_Query_Ex::getSingletonInstance(); 336 $arrChk = $objQuery->select('*', 'dtb_pagelayout', $sqlWhere, $params); 337 338 if (count($arrChk) >= 1) { 339 $objErr->arrErr['url'] = '※ 同じURLのデータが存在しています。別のURLを付けてください。<br />'; 340 } 341 324 $count = $objQuery->count('dtb_pagelayout', $where, $arrValues); 325 if ($count > 0) { 326 $objErr->arrErr['filename'] = '※ 同じURLのデータが存在しています。別のURLを入力してください。<br />'; 327 } 342 328 return $objErr->arrErr; 343 329 } 344 330 345 331 /** 346 * ファイルを作成する. 347 * 348 * @param string $path テンプレートファイルのパス 349 * @param string $data テンプレートの内容 350 * @return void 351 */ 352 function lfCreateFile($path, $data){ 353 354 // ディレクトリが存在していなければ作成する 355 if (!is_dir(dirname($path))) { 356 mkdir(dirname($path), 0777, true); // FIXME (PHP4) 357 } 358 359 // ファイル作成 360 $fp = fopen($path,'w'); 361 if ($fp === false) { 362 SC_Utils_Ex::sfDispException(); 363 } 364 $ret = fwrite($fp, $data); 365 if ($ret === false) { 366 SC_Utils_Ex::sfDispException(); 367 } 368 fclose($fp); 369 } 370 371 /** 372 * PHPファイルを作成する. 373 * 374 * @param string $path PHPファイルのパス 375 * @return void 376 */ 377 function lfCreatePHPFile($url, $device_type_id){ 378 379 $path = USER_REALDIR . $url . ".php"; 380 381 // カスタマイズを考慮し、上書きしない。(#831) 332 * PHP ファイルを生成する. 333 * 334 * 既に同名の PHP ファイルが存在する場合は何もせず true を返す.(#831) 335 * 336 * @param string $filename フォームパラメータの filename 337 * @return boolean 作成に成功した場合 true 338 */ 339 function createPHPFile($filename) { 340 $path = USER_REALDIR . $filename . '.php'; 341 382 342 if (file_exists($path)) { 383 return; 384 } 385 386 // php保存先ディレクトリが存在していなければ作成する 387 if (!is_dir(dirname($path))) { 388 mkdir(dirname($path), 0777, true); // FIXME (PHP4) 389 } 390 391 // ベースとなるPHPファイルの読み込み 392 if (file_exists(USER_DEF_PHP_REALFILE)){ 393 $php_data = file_get_contents(USER_DEF_PHP_REALFILE); 394 } 395 396 // require.phpの場所を書き換える 343 return true; 344 } 345 346 if (file_exists(USER_DEF_PHP_REALFILE)) { 347 $php_contents = file_get_contents(USER_DEF_PHP_REALFILE); 348 } else { 349 return false; 350 } 351 352 // require.php の PATH を書き換える 397 353 $defaultStrings = "exit; // Don't rewrite. This line is rewritten by EC-CUBE."; 398 $replaceStrings = "require_once '" . str_repeat('../', substr_count($url, '/')) . "../require.php';"; 399 $php_data = str_replace($defaultStrings, $replaceStrings, $php_data); 400 401 // phpファイルの作成 402 $fp = fopen($path,'w'); 403 fwrite($fp, $php_data); 404 fclose($fp); 405 } 406 354 $replaceStrings = "require_once '" . str_repeat('../', substr_count($filename, '/')) . "../require.php';"; 355 $php_contents = str_replace($defaultStrings, $replaceStrings, $php_contents); 356 357 return SC_Helper_FileManager_Ex::sfWriteFile($path, $php_contents); 358 } 407 359 } 408 360 ?> -
branches/version-2_11-dev/data/class/util/SC_Utils.php
r20845 r20847 2049 2049 * 自クラスへ再帰する. 2050 2050 */ 2051 if (!SC_Utils _Ex::isBlank($in, $greedy)) {2051 if (!SC_Utils::isBlank($in, $greedy)) { 2052 2052 return false; 2053 2053 } … … 2216 2216 } 2217 2217 } 2218 2219 /** 2220 * ディレクトリを再帰的に作成する. 2221 * 2222 * mkdir 関数の $recursive パラメータを PHP4 でサポートする. 2223 * 2224 * @param string $pathname ディレクトリのパス 2225 * @param integer $mode 作成するディレクトリのパーミッション 2226 * @return boolean 作成に成功した場合 true; 失敗した場合 false 2227 * @see http://jp.php.net/mkdir 2228 */ 2229 function recursiveMkdir($pathname, $mode) { 2230 /* 2231 * SC_Utils_Ex への再帰は無限ループやメモリリークの懸念 2232 * 自クラスへ再帰する. 2233 */ 2234 is_dir(dirname($pathname)) || SC_Utils::recursiveMkdir(dirname($pathname), $mode); 2235 return is_dir($pathname) || @mkdir($pathname, $mode); 2236 } 2218 2237 } 2219 2238 ?> -
branches/version-2_11-dev/test/class/util/SC_Utils_Test.php
r20841 r20847 144 144 $this->assertFalse(SC_Utils::isAbsoluteRealPath($empty)); 145 145 } 146 147 function testRecursiveMkdir() { 148 $tmp_dir = sys_get_temp_dir(); 149 $dir = 'foo/bar'; 150 $results = false; 151 if (is_dir($tmp_dir . $dir)) { 152 rmdir($tmp_dir . '/foo/bar'); 153 rmdir($tmp_dir . '/foo'); 154 } 155 $results = SC_Utils::recursiveMkdir($tmp_dir . $dir, 0777); 156 $this->assertTrue($results); 157 } 146 158 } 147 159 ?>
Note: See TracChangeset
for help on using the changeset viewer.