| 1 | <?php |
|---|
| 2 | /* |
|---|
| 3 | * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. |
|---|
| 4 | * |
|---|
| 5 | * http://www.lockon.co.jp/ |
|---|
| 6 | */ |
|---|
| 7 | |
|---|
| 8 | /** |
|---|
| 9 | * 各種ユーティリティクラス. |
|---|
| 10 | * |
|---|
| 11 | * 主に static 参照するユーティリティ系の関数群 |
|---|
| 12 | * |
|---|
| 13 | * :XXX: 内部でインスタンスを生成している関数は, Helper クラスへ移動するべき... |
|---|
| 14 | * |
|---|
| 15 | * @package Util |
|---|
| 16 | * @author LOCKON CO.,LTD. |
|---|
| 17 | * @version $Id:SC_Utils.php 15532 2007-08-31 14:39:46Z nanasess $ |
|---|
| 18 | */ |
|---|
| 19 | class SC_Utils { |
|---|
| 20 | |
|---|
| 21 | /** |
|---|
| 22 | * サイト管理情報から値を取得する。 |
|---|
| 23 | * データが存在する場合、必ず1以上の数値が設定されている。 |
|---|
| 24 | * 0を返した場合は、呼び出し元で対応すること。 |
|---|
| 25 | * |
|---|
| 26 | * @param $control_id 管理ID |
|---|
| 27 | * @param $dsn DataSource |
|---|
| 28 | * @return $control_flg フラグ |
|---|
| 29 | */ |
|---|
| 30 | function sfGetSiteControlFlg($control_id, $dsn = "") { |
|---|
| 31 | |
|---|
| 32 | // データソース |
|---|
| 33 | if($dsn == "") { |
|---|
| 34 | if(defined('DEFAULT_DSN')) { |
|---|
| 35 | $dsn = DEFAULT_DSN; |
|---|
| 36 | } else { |
|---|
| 37 | return; |
|---|
| 38 | } |
|---|
| 39 | } |
|---|
| 40 | |
|---|
| 41 | // クエリ生成 |
|---|
| 42 | $target_column = "control_flg"; |
|---|
| 43 | $table_name = "dtb_site_control"; |
|---|
| 44 | $where = "control_id = ?"; |
|---|
| 45 | $arrval = array($control_id); |
|---|
| 46 | $control_flg = 0; |
|---|
| 47 | |
|---|
| 48 | // クエリ発行 |
|---|
| 49 | $objQuery = new SC_Query($dsn, true, true); |
|---|
| 50 | $arrSiteControl = $objQuery->select($target_column, $table_name, $where, $arrval); |
|---|
| 51 | |
|---|
| 52 | // データが存在すればフラグを取得する |
|---|
| 53 | if (count($arrSiteControl) > 0) { |
|---|
| 54 | $control_flg = $arrSiteControl[0]["control_flg"]; |
|---|
| 55 | } |
|---|
| 56 | |
|---|
| 57 | return $control_flg; |
|---|
| 58 | } |
|---|
| 59 | |
|---|
| 60 | // インストール初期処理 |
|---|
| 61 | function sfInitInstall() { |
|---|
| 62 | // インストール済みが定義されていない。 |
|---|
| 63 | if(!defined('ECCUBE_INSTALL')) { |
|---|
| 64 | if(!ereg("/install/", $_SERVER['PHP_SELF'])) { |
|---|
| 65 | header("Location: ". SITE_URL . "install/"); |
|---|
| 66 | } |
|---|
| 67 | } else { |
|---|
| 68 | $path = HTML_PATH . "install/index.php"; |
|---|
| 69 | if(file_exists($path)) { |
|---|
| 70 | SC_Utils::sfErrorHeader(">> /install/index.phpは、インストール完了後にファイルを削除してください。"); |
|---|
| 71 | } |
|---|
| 72 | |
|---|
| 73 | // 旧バージョンのinstall.phpのチェック |
|---|
| 74 | $path = HTML_PATH . "install.php"; |
|---|
| 75 | if(file_exists($path)) { |
|---|
| 76 | SC_Utils::sfErrorHeader(">> /install.phpはセキュリティーホールとなります。削除してください。"); |
|---|
| 77 | } |
|---|
| 78 | } |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | // アップデートで生成されたPHPを読み出し |
|---|
| 82 | function sfLoadUpdateModule() { |
|---|
| 83 | // URL設定ディレクトリを削除 |
|---|
| 84 | $main_php = ereg_replace(URL_DIR, "", $_SERVER['PHP_SELF']); |
|---|
| 85 | $extern_php = UPDATE_PATH . $main_php; |
|---|
| 86 | if(file_exists($extern_php)) { |
|---|
| 87 | require_once($extern_php); |
|---|
| 88 | } |
|---|
| 89 | } |
|---|
| 90 | |
|---|
| 91 | // 装飾付きエラーメッセージの表示 |
|---|
| 92 | function sfErrorHeader($mess, $print = false) { |
|---|
| 93 | global $GLOBAL_ERR; |
|---|
| 94 | if($GLOBAL_ERR == "") { |
|---|
| 95 | $GLOBAL_ERR = "<meta http-equiv='Content-Type' content='text/html; charset=" . CHAR_CODE . "'>\n"; |
|---|
| 96 | } |
|---|
| 97 | $GLOBAL_ERR.= "<table width='100%' border='0' cellspacing='0' cellpadding='0' summary=' '>\n"; |
|---|
| 98 | $GLOBAL_ERR.= "<tr>\n"; |
|---|
| 99 | $GLOBAL_ERR.= "<td bgcolor='#ffeebb' height='25' colspan='2' align='center'>\n"; |
|---|
| 100 | $GLOBAL_ERR.= "<SPAN style='color:red; font-size:12px'><strong>" . $mess . "</strong></span>\n"; |
|---|
| 101 | $GLOBAL_ERR.= "</td>\n"; |
|---|
| 102 | $GLOBAL_ERR.= " </tr>\n"; |
|---|
| 103 | $GLOBAL_ERR.= "</table>\n"; |
|---|
| 104 | |
|---|
| 105 | if($print) { |
|---|
| 106 | print($GLOBAL_ERR); |
|---|
| 107 | } |
|---|
| 108 | } |
|---|
| 109 | |
|---|
| 110 | /* エラーページの表示 */ |
|---|
| 111 | function sfDispError($type) { |
|---|
| 112 | |
|---|
| 113 | require_once(CLASS_PATH . "page_extends/error/LC_Page_Error_DispError_Ex.php"); |
|---|
| 114 | |
|---|
| 115 | $objPage = new LC_Page_Error_DispError_Ex(); |
|---|
| 116 | $objPage->init(); |
|---|
| 117 | $objView = new SC_AdminView(); |
|---|
| 118 | |
|---|
| 119 | switch ($type) { |
|---|
| 120 | case LOGIN_ERROR: |
|---|
| 121 | $objPage->tpl_error="IDまたはパスワードが正しくありません。<br />もう一度ご確認のうえ、再度入力してください。"; |
|---|
| 122 | break; |
|---|
| 123 | case ACCESS_ERROR: |
|---|
| 124 | $objPage->tpl_error="ログイン認証の有効期限切れの可能性があります。<br />もう一度ご確認のうえ、再度ログインしてください。"; |
|---|
| 125 | break; |
|---|
| 126 | case AUTH_ERROR: |
|---|
| 127 | $objPage->tpl_error="このファイルにはアクセス権限がありません。<br />もう一度ご確認のうえ、再度ログインしてください。"; |
|---|
| 128 | break; |
|---|
| 129 | case INVALID_MOVE_ERRORR: |
|---|
| 130 | $objPage->tpl_error="不正なページ移動です。<br />もう一度ご確認のうえ、再度入力してください。"; |
|---|
| 131 | break; |
|---|
| 132 | default: |
|---|
| 133 | $objPage->tpl_error="エラーが発生しました。<br />もう一度ご確認のうえ、再度ログインしてください。"; |
|---|
| 134 | break; |
|---|
| 135 | } |
|---|
| 136 | |
|---|
| 137 | $objView->assignobj($objPage); |
|---|
| 138 | $objView->display(LOGIN_FRAME); |
|---|
| 139 | exit; |
|---|
| 140 | } |
|---|
| 141 | |
|---|
| 142 | /* サイトエラーページの表示 */ |
|---|
| 143 | function sfDispSiteError($type, $objSiteSess = "", $return_top = false, $err_msg = "", $is_mobile = false) { |
|---|
| 144 | |
|---|
| 145 | require_once(CLASS_PATH . "page_extends/error/LC_Page_Error_Ex.php"); |
|---|
| 146 | |
|---|
| 147 | // FIXME |
|---|
| 148 | global $objCampaignSess; |
|---|
| 149 | |
|---|
| 150 | if ($objSiteSess != "") { |
|---|
| 151 | $objSiteSess->setNowPage('error'); |
|---|
| 152 | } |
|---|
| 153 | |
|---|
| 154 | $objPage = new LC_Page_Error_Ex(); |
|---|
| 155 | $objPage->init(); |
|---|
| 156 | |
|---|
| 157 | |
|---|
| 158 | if($is_mobile === true) { |
|---|
| 159 | $objView = new SC_MobileView(); |
|---|
| 160 | } else { |
|---|
| 161 | $objView = new SC_SiteView(); |
|---|
| 162 | } |
|---|
| 163 | |
|---|
| 164 | switch ($type) { |
|---|
| 165 | case PRODUCT_NOT_FOUND: |
|---|
| 166 | $objPage->tpl_error="ご指定のページはございません。"; |
|---|
| 167 | break; |
|---|
| 168 | case PAGE_ERROR: |
|---|
| 169 | $objPage->tpl_error="不正なページ移動です。"; |
|---|
| 170 | break; |
|---|
| 171 | case CART_EMPTY: |
|---|
| 172 | $objPage->tpl_error="カートに商品ががありません。"; |
|---|
| 173 | break; |
|---|
| 174 | case CART_ADD_ERROR: |
|---|
| 175 | $objPage->tpl_error="購入処理中は、カートに商品を追加することはできません。"; |
|---|
| 176 | break; |
|---|
| 177 | case CANCEL_PURCHASE: |
|---|
| 178 | $objPage->tpl_error="この手続きは無効となりました。以下の要因が考えられます。<br />・セッション情報の有効期限が切れてる場合<br />・購入手続き中に新しい購入手続きを実行した場合<br />・すでに購入手続きを完了している場合"; |
|---|
| 179 | break; |
|---|
| 180 | case CATEGORY_NOT_FOUND: |
|---|
| 181 | $objPage->tpl_error="ご指定のカテゴリは存在しません。"; |
|---|
| 182 | break; |
|---|
| 183 | case SITE_LOGIN_ERROR: |
|---|
| 184 | $objPage->tpl_error="メールアドレスもしくはパスワードが正しくありません。"; |
|---|
| 185 | break; |
|---|
| 186 | case TEMP_LOGIN_ERROR: |
|---|
| 187 | $objPage->tpl_error="メールアドレスもしくはパスワードが正しくありません。<br />本登録がお済みでない場合は、仮登録メールに記載されている<br />URLより本登録を行ってください。"; |
|---|
| 188 | break; |
|---|
| 189 | case CUSTOMER_ERROR: |
|---|
| 190 | $objPage->tpl_error="不正なアクセスです。"; |
|---|
| 191 | break; |
|---|
| 192 | case SOLD_OUT: |
|---|
| 193 | $objPage->tpl_error="申し訳ございませんが、ご購入の直前で売り切れた商品があります。この手続きは無効となりました。"; |
|---|
| 194 | break; |
|---|
| 195 | case CART_NOT_FOUND: |
|---|
| 196 | $objPage->tpl_error="申し訳ございませんが、カート内の商品情報の取得に失敗しました。この手続きは無効となりました。"; |
|---|
| 197 | break; |
|---|
| 198 | case LACK_POINT: |
|---|
| 199 | $objPage->tpl_error="申し訳ございませんが、ポイントが不足しております。この手続きは無効となりました。"; |
|---|
| 200 | break; |
|---|
| 201 | case FAVORITE_ERROR: |
|---|
| 202 | $objPage->tpl_error="既にお気に入りに追加されている商品です。"; |
|---|
| 203 | break; |
|---|
| 204 | case EXTRACT_ERROR: |
|---|
| 205 | $objPage->tpl_error="ファイルの解凍に失敗しました。\n指定のディレクトリに書き込み権限が与えられていない可能性があります。"; |
|---|
| 206 | break; |
|---|
| 207 | case FTP_DOWNLOAD_ERROR: |
|---|
| 208 | $objPage->tpl_error="ファイルのFTPダウンロードに失敗しました。"; |
|---|
| 209 | break; |
|---|
| 210 | case FTP_LOGIN_ERROR: |
|---|
| 211 | $objPage->tpl_error="FTPログインに失敗しました。"; |
|---|
| 212 | break; |
|---|
| 213 | case FTP_CONNECT_ERROR: |
|---|
| 214 | $objPage->tpl_error="FTPログインに失敗しました。"; |
|---|
| 215 | break; |
|---|
| 216 | case CREATE_DB_ERROR: |
|---|
| 217 | $objPage->tpl_error="DBの作成に失敗しました。\n指定のユーザーには、DB作成の権限が与えられていない可能性があります。"; |
|---|
| 218 | break; |
|---|
| 219 | case DB_IMPORT_ERROR: |
|---|
| 220 | $objPage->tpl_error="データベース構造のインポートに失敗しました。\nsqlファイルが壊れている可能性があります。"; |
|---|
| 221 | break; |
|---|
| 222 | case FILE_NOT_FOUND: |
|---|
| 223 | $objPage->tpl_error="指定のパスに、設定ファイルが存在しません。"; |
|---|
| 224 | break; |
|---|
| 225 | case WRITE_FILE_ERROR: |
|---|
| 226 | $objPage->tpl_error="設定ファイルに書き込めません。\n設定ファイルに書き込み権限を与えてください。"; |
|---|
| 227 | break; |
|---|
| 228 | case FREE_ERROR_MSG: |
|---|
| 229 | $objPage->tpl_error=$err_msg; |
|---|
| 230 | break; |
|---|
| 231 | default: |
|---|
| 232 | $objPage->tpl_error="エラーが発生しました。"; |
|---|
| 233 | break; |
|---|
| 234 | } |
|---|
| 235 | |
|---|
| 236 | $objPage->return_top = $return_top; |
|---|
| 237 | |
|---|
| 238 | $objView->assignobj($objPage); |
|---|
| 239 | |
|---|
| 240 | if(is_object($objCampaignSess)) { |
|---|
| 241 | // フレームを選択(キャンペーンページから遷移なら変更) |
|---|
| 242 | $objCampaignSess->pageView($objView); |
|---|
| 243 | } else { |
|---|
| 244 | $objView->display(SITE_FRAME); |
|---|
| 245 | } |
|---|
| 246 | register_shutdown_function(array($objPage, "destroy")); |
|---|
| 247 | exit; |
|---|
| 248 | } |
|---|
| 249 | |
|---|
| 250 | /* 認証の可否判定 */ |
|---|
| 251 | function sfIsSuccess($objSess, $disp_error = true) { |
|---|
| 252 | $ret = $objSess->IsSuccess(); |
|---|
| 253 | if($ret != SUCCESS) { |
|---|
| 254 | if($disp_error) { |
|---|
| 255 | // エラーページの表示 |
|---|
| 256 | SC_Utils::sfDispError($ret); |
|---|
| 257 | } |
|---|
| 258 | return false; |
|---|
| 259 | } |
|---|
| 260 | // リファラーチェック(CSRFの暫定的な対策) |
|---|
| 261 | // 「リファラ無」 の場合はスルー |
|---|
| 262 | // 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する |
|---|
| 263 | if ( empty($_SERVER['HTTP_REFERER']) ) { |
|---|
| 264 | // TODO 警告表示させる? |
|---|
| 265 | // sfErrorHeader('>> referrerが無効になっています。'); |
|---|
| 266 | } else { |
|---|
| 267 | $domain = SC_Utils::sfIsHTTPS() ? SSL_URL : SITE_URL; |
|---|
| 268 | $pattern = sprintf('|^%s.*|', $domain); |
|---|
| 269 | $referer = $_SERVER['HTTP_REFERER']; |
|---|
| 270 | |
|---|
| 271 | // 管理画面から以外の遷移の場合はエラー画面を表示 |
|---|
| 272 | if (!preg_match($pattern, $referer)) { |
|---|
| 273 | if ($disp_error) SC_Utils::sfDispError(INVALID_MOVE_ERRORR); |
|---|
| 274 | return false; |
|---|
| 275 | } |
|---|
| 276 | } |
|---|
| 277 | return true; |
|---|
| 278 | } |
|---|
| 279 | |
|---|
| 280 | /** |
|---|
| 281 | * 文字列をアスタリスクへ変換する. |
|---|
| 282 | * |
|---|
| 283 | * @param string $passlen 変換する文字列 |
|---|
| 284 | * @return string アスタリスクへ変換した文字列 |
|---|
| 285 | */ |
|---|
| 286 | function lfPassLen($passlen){ |
|---|
| 287 | $ret = ""; |
|---|
| 288 | for ($i=0;$i<$passlen;true){ |
|---|
| 289 | $ret.="*"; |
|---|
| 290 | $i++; |
|---|
| 291 | } |
|---|
| 292 | return $ret; |
|---|
| 293 | } |
|---|
| 294 | |
|---|
| 295 | /** |
|---|
| 296 | * HTTPSかどうかを判定 |
|---|
| 297 | * |
|---|
| 298 | * @return bool |
|---|
| 299 | */ |
|---|
| 300 | function sfIsHTTPS () { |
|---|
| 301 | // HTTPS時には$_SERVER['HTTPS']には空でない値が入る |
|---|
| 302 | // $_SERVER['HTTPS'] != 'off' はIIS用 |
|---|
| 303 | if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { |
|---|
| 304 | return true; |
|---|
| 305 | } else { |
|---|
| 306 | return false; |
|---|
| 307 | } |
|---|
| 308 | } |
|---|
| 309 | |
|---|
| 310 | /** |
|---|
| 311 | * 正規の遷移がされているかを判定 |
|---|
| 312 | * 前画面でuniqidを埋め込んでおく必要がある |
|---|
| 313 | * @param obj SC_Session, SC_SiteSession |
|---|
| 314 | * @return bool |
|---|
| 315 | */ |
|---|
| 316 | function sfIsValidTransition($objSess) { |
|---|
| 317 | // 前画面からPOSTされるuniqidが正しいものかどうかをチェック |
|---|
| 318 | $uniqid = $objSess->getUniqId(); |
|---|
| 319 | if ( !empty($_POST['uniqid']) && ($_POST['uniqid'] === $uniqid) ) { |
|---|
| 320 | return true; |
|---|
| 321 | } else { |
|---|
| 322 | return false; |
|---|
| 323 | } |
|---|
| 324 | } |
|---|
| 325 | |
|---|
| 326 | /* 前のページで正しく登録が行われたか判定 */ |
|---|
| 327 | function sfIsPrePage(&$objSiteSess, $is_mobile = false) { |
|---|
| 328 | $ret = $objSiteSess->isPrePage(); |
|---|
| 329 | if($ret != true) { |
|---|
| 330 | // エラーページの表示 |
|---|
| 331 | SC_Utils::sfDispSiteError(PAGE_ERROR, $objSiteSess, false, "", $is_mobile); |
|---|
| 332 | } |
|---|
| 333 | } |
|---|
| 334 | |
|---|
| 335 | function sfCheckNormalAccess(&$objSiteSess, &$objCartSess) { |
|---|
| 336 | // ユーザユニークIDの取得 |
|---|
| 337 | $uniqid = $objSiteSess->getUniqId(); |
|---|
| 338 | // 購入ボタンを押した時のカート内容がコピーされていない場合のみコピーする。 |
|---|
| 339 | $objCartSess->saveCurrentCart($uniqid); |
|---|
| 340 | // POSTのユニークIDとセッションのユニークIDを比較(ユニークIDがPOSTされていない場合はスルー) |
|---|
| 341 | $ret = $objSiteSess->checkUniqId(); |
|---|
| 342 | if($ret != true) { |
|---|
| 343 | // エラーページの表示 |
|---|
| 344 | SC_Utils_Ex::sfDispSiteError(CANCEL_PURCHASE, $objSiteSess); |
|---|
| 345 | } |
|---|
| 346 | |
|---|
| 347 | // カート内が空でないか || 購入ボタンを押してから変化がないか |
|---|
| 348 | $quantity = $objCartSess->getTotalQuantity(); |
|---|
| 349 | $ret = $objCartSess->checkChangeCart(); |
|---|
| 350 | if($ret == true || !($quantity > 0)) { |
|---|
| 351 | // カート情報表示に強制移動する |
|---|
| 352 | header("Location: ".URL_CART_TOP); // FIXME |
|---|
| 353 | exit; |
|---|
| 354 | } |
|---|
| 355 | return $uniqid; |
|---|
| 356 | } |
|---|
| 357 | |
|---|
| 358 | /* DB用日付文字列取得 */ |
|---|
| 359 | function sfGetTimestamp($year, $month, $day, $last = false) { |
|---|
| 360 | if($year != "" && $month != "" && $day != "") { |
|---|
| 361 | if($last) { |
|---|
| 362 | $time = "23:59:59"; |
|---|
| 363 | } else { |
|---|
| 364 | $time = "00:00:00"; |
|---|
| 365 | } |
|---|
| 366 | $date = $year."-".$month."-".$day." ".$time; |
|---|
| 367 | } else { |
|---|
| 368 | $date = ""; |
|---|
| 369 | } |
|---|
| 370 | return $date; |
|---|
| 371 | } |
|---|
| 372 | |
|---|
| 373 | // INT型の数値チェック |
|---|
| 374 | function sfIsInt($value) { |
|---|
| 375 | if($value != "" && strlen($value) <= INT_LEN && is_numeric($value)) { |
|---|
| 376 | return true; |
|---|
| 377 | } |
|---|
| 378 | return false; |
|---|
| 379 | } |
|---|
| 380 | |
|---|
| 381 | function sfCSVDownload($data, $prefix = ""){ |
|---|
| 382 | |
|---|
| 383 | if($prefix == "") { |
|---|
| 384 | $dir_name = SC_Utils::sfUpDirName(); |
|---|
| 385 | $file_name = $dir_name . date("ymdHis") .".csv"; |
|---|
| 386 | } else { |
|---|
| 387 | $file_name = $prefix . date("ymdHis") .".csv"; |
|---|
| 388 | } |
|---|
| 389 | |
|---|
| 390 | /* HTTPヘッダの出力 */ |
|---|
| 391 | Header("Content-disposition: attachment; filename=${file_name}"); |
|---|
| 392 | Header("Content-type: application/octet-stream; name=${file_name}"); |
|---|
| 393 | Header("Cache-Control: "); |
|---|
| 394 | Header("Pragma: "); |
|---|
| 395 | |
|---|
| 396 | if (mb_internal_encoding() == CHAR_CODE){ |
|---|
| 397 | $data = mb_convert_encoding($data,'SJIS',CHAR_CODE); |
|---|
| 398 | } |
|---|
| 399 | |
|---|
| 400 | /* データを出力 */ |
|---|
| 401 | echo $data; |
|---|
| 402 | } |
|---|
| 403 | |
|---|
| 404 | /* 1階層上のディレクトリ名を取得する */ |
|---|
| 405 | function sfUpDirName() { |
|---|
| 406 | $path = $_SERVER['PHP_SELF']; |
|---|
| 407 | $arrVal = split("/", $path); |
|---|
| 408 | $cnt = count($arrVal); |
|---|
| 409 | return $arrVal[($cnt - 2)]; |
|---|
| 410 | } |
|---|
| 411 | |
|---|
| 412 | |
|---|
| 413 | |
|---|
| 414 | |
|---|
| 415 | /** |
|---|
| 416 | * 現在のサイトを更新(ただしポストは行わない) |
|---|
| 417 | * |
|---|
| 418 | * @deprecated LC_Page::reload() を使用して下さい. |
|---|
| 419 | */ |
|---|
| 420 | function sfReload($get = "") { |
|---|
| 421 | if ($_SERVER["SERVER_PORT"] == "443" ){ |
|---|
| 422 | $url = ereg_replace(URL_DIR . "$", "", SSL_URL); |
|---|
| 423 | } else { |
|---|
| 424 | $url = ereg_replace(URL_DIR . "$", "", SITE_URL); |
|---|
| 425 | } |
|---|
| 426 | |
|---|
| 427 | if($get != "") { |
|---|
| 428 | header("Location: ". $url . $_SERVER['PHP_SELF'] . "?" . $get); |
|---|
| 429 | } else { |
|---|
| 430 | header("Location: ". $url . $_SERVER['PHP_SELF']); |
|---|
| 431 | } |
|---|
| 432 | exit; |
|---|
| 433 | } |
|---|
| 434 | |
|---|
| 435 | // チェックボックスの値をマージ |
|---|
| 436 | function sfMergeCBValue($keyname, $max) { |
|---|
| 437 | $conv = ""; |
|---|
| 438 | $cnt = 1; |
|---|
| 439 | for($cnt = 1; $cnt <= $max; $cnt++) { |
|---|
| 440 | if ($_POST[$keyname . $cnt] == "1") { |
|---|
| 441 | $conv.= "1"; |
|---|
| 442 | } else { |
|---|
| 443 | $conv.= "0"; |
|---|
| 444 | } |
|---|
| 445 | } |
|---|
| 446 | return $conv; |
|---|
| 447 | } |
|---|
| 448 | |
|---|
| 449 | // html_checkboxesの値をマージして2進数形式に変更する。 |
|---|
| 450 | function sfMergeCheckBoxes($array, $max) { |
|---|
| 451 | $ret = ""; |
|---|
| 452 | if(is_array($array)) { |
|---|
| 453 | foreach($array as $val) { |
|---|
| 454 | $arrTmp[$val] = "1"; |
|---|
| 455 | } |
|---|
| 456 | } |
|---|
| 457 | for($i = 1; $i <= $max; $i++) { |
|---|
| 458 | if(isset($arrTmp[$i]) && $arrTmp[$i] == "1") { |
|---|
| 459 | $ret.= "1"; |
|---|
| 460 | } else { |
|---|
| 461 | $ret.= "0"; |
|---|
| 462 | } |
|---|
| 463 | } |
|---|
| 464 | return $ret; |
|---|
| 465 | } |
|---|
| 466 | |
|---|
| 467 | |
|---|
| 468 | // html_checkboxesの値をマージして「-」でつなげる。 |
|---|
| 469 | function sfMergeParamCheckBoxes($array) { |
|---|
| 470 | $ret = ''; |
|---|
| 471 | if(is_array($array)) { |
|---|
| 472 | foreach($array as $val) { |
|---|
| 473 | if($ret != "") { |
|---|
| 474 | $ret.= "-$val"; |
|---|
| 475 | } else { |
|---|
| 476 | $ret = $val; |
|---|
| 477 | } |
|---|
| 478 | } |
|---|
| 479 | } else { |
|---|
| 480 | $ret = $array; |
|---|
| 481 | } |
|---|
| 482 | return $ret; |
|---|
| 483 | } |
|---|
| 484 | |
|---|
| 485 | // html_checkboxesの値をマージしてSQL検索用に変更する。 |
|---|
| 486 | function sfSearchCheckBoxes($array) { |
|---|
| 487 | $max = 0; |
|---|
| 488 | $ret = ""; |
|---|
| 489 | foreach($array as $val) { |
|---|
| 490 | $arrTmp[$val] = "1"; |
|---|
| 491 | if($val > $max) { |
|---|
| 492 | $max = $val; |
|---|
| 493 | } |
|---|
| 494 | } |
|---|
| 495 | for($i = 1; $i <= $max; $i++) { |
|---|
| 496 | if($arrTmp[$i] == "1") { |
|---|
| 497 | $ret.= "1"; |
|---|
| 498 | } else { |
|---|
| 499 | $ret.= "_"; |
|---|
| 500 | } |
|---|
| 501 | } |
|---|
| 502 | |
|---|
| 503 | if($ret != "") { |
|---|
| 504 | $ret.= "%"; |
|---|
| 505 | } |
|---|
| 506 | return $ret; |
|---|
| 507 | } |
|---|
| 508 | |
|---|
| 509 | // 2進数形式の値をhtml_checkboxes対応の値に切り替える |
|---|
| 510 | function sfSplitCheckBoxes($val) { |
|---|
| 511 | $arrRet = array(); |
|---|
| 512 | $len = strlen($val); |
|---|
| 513 | for($i = 0; $i < $len; $i++) { |
|---|
| 514 | if(substr($val, $i, 1) == "1") { |
|---|
| 515 | $arrRet[] = ($i + 1); |
|---|
| 516 | } |
|---|
| 517 | } |
|---|
| 518 | return $arrRet; |
|---|
| 519 | } |
|---|
| 520 | |
|---|
| 521 | // チェックボックスの値をマージ |
|---|
| 522 | function sfMergeCBSearchValue($keyname, $max) { |
|---|
| 523 | $conv = ""; |
|---|
| 524 | $cnt = 1; |
|---|
| 525 | for($cnt = 1; $cnt <= $max; $cnt++) { |
|---|
| 526 | if ($_POST[$keyname . $cnt] == "1") { |
|---|
| 527 | $conv.= "1"; |
|---|
| 528 | } else { |
|---|
| 529 | $conv.= "_"; |
|---|
| 530 | } |
|---|
| 531 | } |
|---|
| 532 | return $conv; |
|---|
| 533 | } |
|---|
| 534 | |
|---|
| 535 | // チェックボックスの値を分解 |
|---|
| 536 | function sfSplitCBValue($val, $keyname = "") { |
|---|
| 537 | $len = strlen($val); |
|---|
| 538 | $no = 1; |
|---|
| 539 | for ($cnt = 0; $cnt < $len; $cnt++) { |
|---|
| 540 | if($keyname != "") { |
|---|
| 541 | $arr[$keyname . $no] = substr($val, $cnt, 1); |
|---|
| 542 | } else { |
|---|
| 543 | $arr[] = substr($val, $cnt, 1); |
|---|
| 544 | } |
|---|
| 545 | $no++; |
|---|
| 546 | } |
|---|
| 547 | return $arr; |
|---|
| 548 | } |
|---|
| 549 | |
|---|
| 550 | // キーと値をセットした配列を取得 |
|---|
| 551 | function sfArrKeyValue($arrList, $keyname, $valname, $len_max = "", $keysize = "") { |
|---|
| 552 | $arrRet = array(); |
|---|
| 553 | $max = count($arrList); |
|---|
| 554 | |
|---|
| 555 | if($len_max != "" && $max > $len_max) { |
|---|
| 556 | $max = $len_max; |
|---|
| 557 | } |
|---|
| 558 | |
|---|
| 559 | for($cnt = 0; $cnt < $max; $cnt++) { |
|---|
| 560 | if($keysize != "") { |
|---|
| 561 | $key = SC_Utils::sfCutString($arrList[$cnt][$keyname], $keysize); |
|---|
| 562 | } else { |
|---|
| 563 | $key = $arrList[$cnt][$keyname]; |
|---|
| 564 | } |
|---|
| 565 | $val = $arrList[$cnt][$valname]; |
|---|
| 566 | |
|---|
| 567 | if(!isset($arrRet[$key])) { |
|---|
| 568 | $arrRet[$key] = $val; |
|---|
| 569 | } |
|---|
| 570 | |
|---|
| 571 | } |
|---|
| 572 | return $arrRet; |
|---|
| 573 | } |
|---|
| 574 | |
|---|
| 575 | // キーと値をセットした配列を取得(値が複数の場合) |
|---|
| 576 | function sfArrKeyValues($arrList, $keyname, $valname, $len_max = "", $keysize = "", $connect = "") { |
|---|
| 577 | |
|---|
| 578 | $max = count($arrList); |
|---|
| 579 | |
|---|
| 580 | if($len_max != "" && $max > $len_max) { |
|---|
| 581 | $max = $len_max; |
|---|
| 582 | } |
|---|
| 583 | |
|---|
| 584 | for($cnt = 0; $cnt < $max; $cnt++) { |
|---|
| 585 | if($keysize != "") { |
|---|
| 586 | $key = SC_Utils::sfCutString($arrList[$cnt][$keyname], $keysize); |
|---|
| 587 | } else { |
|---|
| 588 | $key = $arrList[$cnt][$keyname]; |
|---|
| 589 | } |
|---|
| 590 | $val = $arrList[$cnt][$valname]; |
|---|
| 591 | |
|---|
| 592 | if($connect != "") { |
|---|
| 593 | $arrRet[$key].= "$val".$connect; |
|---|
| 594 | } else { |
|---|
| 595 | $arrRet[$key][] = $val; |
|---|
| 596 | } |
|---|
| 597 | } |
|---|
| 598 | return $arrRet; |
|---|
| 599 | } |
|---|
| 600 | |
|---|
| 601 | // 配列の値をカンマ区切りで返す。 |
|---|
| 602 | function sfGetCommaList($array, $space=true) { |
|---|
| 603 | if (count($array) > 0) { |
|---|
| 604 | $line = ""; |
|---|
| 605 | foreach($array as $val) { |
|---|
| 606 | if ($space) { |
|---|
| 607 | $line .= $val . ", "; |
|---|
| 608 | }else{ |
|---|
| 609 | $line .= $val . ","; |
|---|
| 610 | } |
|---|
| 611 | } |
|---|
| 612 | if ($space) { |
|---|
| 613 | $line = ereg_replace(", $", "", $line); |
|---|
| 614 | }else{ |
|---|
| 615 | $line = ereg_replace(",$", "", $line); |
|---|
| 616 | } |
|---|
| 617 | return $line; |
|---|
| 618 | }else{ |
|---|
| 619 | return false; |
|---|
| 620 | } |
|---|
| 621 | |
|---|
| 622 | } |
|---|
| 623 | |
|---|
| 624 | /* 配列の要素をCSVフォーマットで出力する。*/ |
|---|
| 625 | function sfGetCSVList($array) { |
|---|
| 626 | $line = ""; |
|---|
| 627 | if (count($array) > 0) { |
|---|
| 628 | foreach($array as $key => $val) { |
|---|
| 629 | $val = mb_convert_encoding($val, CHAR_CODE, CHAR_CODE); |
|---|
| 630 | $line .= "\"".$val."\","; |
|---|
| 631 | } |
|---|
| 632 | $line = ereg_replace(",$", "\r\n", $line); |
|---|
| 633 | }else{ |
|---|
| 634 | return false; |
|---|
| 635 | } |
|---|
| 636 | return $line; |
|---|
| 637 | } |
|---|
| 638 | |
|---|
| 639 | /* 配列の要素をPDFフォーマットで出力する。*/ |
|---|
| 640 | function sfGetPDFList($array) { |
|---|
| 641 | foreach($array as $key => $val) { |
|---|
| 642 | $line .= "\t".$val; |
|---|
| 643 | } |
|---|
| 644 | $line.="\n"; |
|---|
| 645 | return $line; |
|---|
| 646 | } |
|---|
| 647 | |
|---|
| 648 | |
|---|
| 649 | |
|---|
| 650 | /*-----------------------------------------------------------------*/ |
|---|
| 651 | /* check_set_term |
|---|
| 652 | /* 年月日に別れた2つの期間の妥当性をチェックし、整合性と期間を返す |
|---|
| 653 | /* 引数 (開始年,開始月,開始日,終了年,終了月,終了日) |
|---|
| 654 | /* 戻値 array(1,2,3) |
|---|
| 655 | /* 1.開始年月日 (YYYY/MM/DD 000000) |
|---|
| 656 | /* 2.終了年月日 (YYYY/MM/DD 235959) |
|---|
| 657 | /* 3.エラー ( 0 = OK, 1 = NG ) |
|---|
| 658 | /*-----------------------------------------------------------------*/ |
|---|
| 659 | function sfCheckSetTerm ( $start_year, $start_month, $start_day, $end_year, $end_month, $end_day ) { |
|---|
| 660 | |
|---|
| 661 | // 期間指定 |
|---|
| 662 | $error = 0; |
|---|
| 663 | if ( $start_month || $start_day || $start_year){ |
|---|
| 664 | if ( ! checkdate($start_month, $start_day , $start_year) ) $error = 1; |
|---|
| 665 | } else { |
|---|
| 666 | $error = 1; |
|---|
| 667 | } |
|---|
| 668 | if ( $end_month || $end_day || $end_year){ |
|---|
| 669 | if ( ! checkdate($end_month ,$end_day ,$end_year) ) $error = 2; |
|---|
| 670 | } |
|---|
| 671 | if ( ! $error ){ |
|---|
| 672 | $date1 = $start_year ."/".sprintf("%02d",$start_month) ."/".sprintf("%02d",$start_day) ." 000000"; |
|---|
| 673 | $date2 = $end_year ."/".sprintf("%02d",$end_month) ."/".sprintf("%02d",$end_day) ." 235959"; |
|---|
| 674 | if ($date1 > $date2) $error = 3; |
|---|
| 675 | } else { |
|---|
| 676 | $error = 1; |
|---|
| 677 | } |
|---|
| 678 | return array($date1, $date2, $error); |
|---|
| 679 | } |
|---|
| 680 | |
|---|
| 681 | // エラー箇所の背景色を変更するためのfunction SC_Viewで読み込む |
|---|
| 682 | function sfSetErrorStyle(){ |
|---|
| 683 | return 'style="background-color:'.ERR_COLOR.'"'; |
|---|
| 684 | } |
|---|
| 685 | |
|---|
| 686 | /* DBに渡す数値のチェック |
|---|
| 687 | * 10桁以上はオーバーフローエラーを起こすので。 |
|---|
| 688 | */ |
|---|
| 689 | function sfCheckNumLength( $value ){ |
|---|
| 690 | if ( ! is_numeric($value) ){ |
|---|
| 691 | return false; |
|---|
| 692 | } |
|---|
| 693 | |
|---|
| 694 | if ( strlen($value) > 9 ) { |
|---|
| 695 | return false; |
|---|
| 696 | } |
|---|
| 697 | |
|---|
| 698 | return true; |
|---|
| 699 | } |
|---|
| 700 | |
|---|
| 701 | // 一致した値のキー名を取得 |
|---|
| 702 | function sfSearchKey($array, $word, $default) { |
|---|
| 703 | foreach($array as $key => $val) { |
|---|
| 704 | if($val == $word) { |
|---|
| 705 | return $key; |
|---|
| 706 | } |
|---|
| 707 | } |
|---|
| 708 | return $default; |
|---|
| 709 | } |
|---|
| 710 | |
|---|
| 711 | function sfGetErrorColor($val) { |
|---|
| 712 | if($val != "") { |
|---|
| 713 | return "background-color:" . ERR_COLOR; |
|---|
| 714 | } |
|---|
| 715 | return ""; |
|---|
| 716 | } |
|---|
| 717 | |
|---|
| 718 | function sfGetEnabled($val) { |
|---|
| 719 | if( ! $val ) { |
|---|
| 720 | return " disabled=\"disabled\""; |
|---|
| 721 | } |
|---|
| 722 | return ""; |
|---|
| 723 | } |
|---|
| 724 | |
|---|
| 725 | function sfGetChecked($param, $value) { |
|---|
| 726 | if($param == $value) { |
|---|
| 727 | return "checked=\"checked\""; |
|---|
| 728 | } |
|---|
| 729 | return ""; |
|---|
| 730 | } |
|---|
| 731 | |
|---|
| 732 | function sfTrim($str) { |
|---|
| 733 | $ret = ereg_replace("^[ \n\r]*", "", $str); |
|---|
| 734 | $ret = ereg_replace("[ \n\r]*$", "", $ret); |
|---|
| 735 | return $ret; |
|---|
| 736 | } |
|---|
| 737 | |
|---|
| 738 | /* 税金計算 */ |
|---|
| 739 | function sfTax($price, $tax, $tax_rule) { |
|---|
| 740 | $real_tax = $tax / 100; |
|---|
| 741 | $ret = $price * $real_tax; |
|---|
| 742 | switch($tax_rule) { |
|---|
| 743 | // 四捨五入 |
|---|
| 744 | case 1: |
|---|
| 745 | $ret = round($ret); |
|---|
| 746 | break; |
|---|
| 747 | // 切り捨て |
|---|
| 748 | case 2: |
|---|
| 749 | $ret = floor($ret); |
|---|
| 750 | break; |
|---|
| 751 | // 切り上げ |
|---|
| 752 | case 3: |
|---|
| 753 | $ret = ceil($ret); |
|---|
| 754 | break; |
|---|
| 755 | // デフォルト:切り上げ |
|---|
| 756 | default: |
|---|
| 757 | $ret = ceil($ret); |
|---|
| 758 | break; |
|---|
| 759 | } |
|---|
| 760 | return $ret; |
|---|
| 761 | } |
|---|
| 762 | |
|---|
| 763 | /* 税金付与 */ |
|---|
| 764 | function sfPreTax($price, $tax, $tax_rule) { |
|---|
| 765 | $real_tax = $tax / 100; |
|---|
| 766 | $ret = $price * (1 + $real_tax); |
|---|
| 767 | |
|---|
| 768 | switch($tax_rule) { |
|---|
| 769 | // 四捨五入 |
|---|
| 770 | case 1: |
|---|
| 771 | $ret = round($ret); |
|---|
| 772 | break; |
|---|
| 773 | // 切り捨て |
|---|
| 774 | case 2: |
|---|
| 775 | $ret = floor($ret); |
|---|
| 776 | break; |
|---|
| 777 | // 切り上げ |
|---|
| 778 | case 3: |
|---|
| 779 | $ret = ceil($ret); |
|---|
| 780 | break; |
|---|
| 781 | // デフォルト:切り上げ |
|---|
| 782 | default: |
|---|
| 783 | $ret = ceil($ret); |
|---|
| 784 | break; |
|---|
| 785 | } |
|---|
| 786 | return $ret; |
|---|
| 787 | } |
|---|
| 788 | |
|---|
| 789 | // 桁数を指定して四捨五入 |
|---|
| 790 | function sfRound($value, $pow = 0){ |
|---|
| 791 | $adjust = pow(10 ,$pow-1); |
|---|
| 792 | |
|---|
| 793 | // 整数且つ0出なければ桁数指定を行う |
|---|
| 794 | if(SC_Utils::sfIsInt($adjust) and $pow > 1){ |
|---|
| 795 | $ret = (round($value * $adjust)/$adjust); |
|---|
| 796 | } |
|---|
| 797 | |
|---|
| 798 | $ret = round($ret); |
|---|
| 799 | |
|---|
| 800 | return $ret; |
|---|
| 801 | } |
|---|
| 802 | |
|---|
| 803 | /* ポイント付与 */ |
|---|
| 804 | function sfPrePoint($price, $point_rate, $rule = POINT_RULE, $product_id = "") { |
|---|
| 805 | if(SC_Utils::sfIsInt($product_id)) { |
|---|
| 806 | $objQuery = new SC_Query(); |
|---|
| 807 | $where = "now() >= cast(start_date as date) AND "; |
|---|
| 808 | $where .= "now() < cast(end_date as date) AND "; |
|---|
| 809 | |
|---|
| 810 | $where .= "del_flg = 0 AND campaign_id IN (SELECT campaign_id FROM dtb_campaign_detail where product_id = ? )"; |
|---|
| 811 | //登録(更新)日付順 |
|---|
| 812 | $objQuery->setorder('update_date DESC'); |
|---|
| 813 | //キャンペーンポイントの取得 |
|---|
| 814 | $arrRet = $objQuery->select("campaign_name, campaign_point_rate", "dtb_campaign", $where, array($product_id)); |
|---|
| 815 | } |
|---|
| 816 | //複数のキャンペーンに登録されている商品は、最新のキャンペーンからポイントを取得 |
|---|
| 817 | if(isset($arrRet[0]['campaign_point_rate']) |
|---|
| 818 | && $arrRet[0]['campaign_point_rate'] != "") { |
|---|
| 819 | |
|---|
| 820 | $campaign_point_rate = $arrRet[0]['campaign_point_rate']; |
|---|
| 821 | $real_point = $campaign_point_rate / 100; |
|---|
| 822 | } else { |
|---|
| 823 | $real_point = $point_rate / 100; |
|---|
| 824 | } |
|---|
| 825 | $ret = $price * $real_point; |
|---|
| 826 | switch($rule) { |
|---|
| 827 | // 四捨五入 |
|---|
| 828 | case 1: |
|---|
| 829 | $ret = round($ret); |
|---|
| 830 | break; |
|---|
| 831 | // 切り捨て |
|---|
| 832 | case 2: |
|---|
| 833 | $ret = floor($ret); |
|---|
| 834 | break; |
|---|
| 835 | // 切り上げ |
|---|
| 836 | case 3: |
|---|
| 837 | $ret = ceil($ret); |
|---|
| 838 | break; |
|---|
| 839 | // デフォルト:切り上げ |
|---|
| 840 | default: |
|---|
| 841 | $ret = ceil($ret); |
|---|
| 842 | break; |
|---|
| 843 | } |
|---|
| 844 | //キャンペーン商品の場合 |
|---|
| 845 | if(isset($campaign_point_rate) && $campaign_point_rate != "") { |
|---|
| 846 | $ret = "(".$arrRet[0]['campaign_name']."ポイント率".$campaign_point_rate."%)".$ret; |
|---|
| 847 | } |
|---|
| 848 | return $ret; |
|---|
| 849 | } |
|---|
| 850 | |
|---|
| 851 | /* 規格分類の件数取得 */ |
|---|
| 852 | function sfGetClassCatCount() { |
|---|
| 853 | $sql = "select count(dtb_class.class_id) as count, dtb_class.class_id "; |
|---|
| 854 | $sql.= "from dtb_class inner join dtb_classcategory on dtb_class.class_id = dtb_classcategory.class_id "; |
|---|
| 855 | $sql.= "where dtb_class.del_flg = 0 AND dtb_classcategory.del_flg = 0 "; |
|---|
| 856 | $sql.= "group by dtb_class.class_id, dtb_class.name"; |
|---|
| 857 | $objQuery = new SC_Query(); |
|---|
| 858 | $arrList = $objQuery->getall($sql); |
|---|
| 859 | // キーと値をセットした配列を取得 |
|---|
| 860 | $arrRet = SC_Utils::sfArrKeyValue($arrList, 'class_id', 'count'); |
|---|
| 861 | |
|---|
| 862 | return $arrRet; |
|---|
| 863 | } |
|---|
| 864 | |
|---|
| 865 | /* 規格の登録 */ |
|---|
| 866 | function sfInsertProductClass($objQuery, $arrList, $product_id) { |
|---|
| 867 | // すでに規格登録があるかどうかをチェックする。 |
|---|
| 868 | $where = "product_id = ? AND classcategory_id1 <> 0 AND classcategory_id1 <> 0"; |
|---|
| 869 | $count = $objQuery->count("dtb_products_class", $where, array($product_id)); |
|---|
| 870 | |
|---|
| 871 | // すでに規格登録がない場合 |
|---|
| 872 | if($count == 0) { |
|---|
| 873 | // 既存規格の削除 |
|---|
| 874 | $where = "product_id = ?"; |
|---|
| 875 | $objQuery->delete("dtb_products_class", $where, array($product_id)); |
|---|
| 876 | |
|---|
| 877 | // 配列の添字を定義 |
|---|
| 878 | $checkArray = array("product_code", "stock", "stock_unlimited", "price01", "price02"); |
|---|
| 879 | $arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray); |
|---|
| 880 | |
|---|
| 881 | $sqlval['product_id'] = $product_id; |
|---|
| 882 | $sqlval['classcategory_id1'] = '0'; |
|---|
| 883 | $sqlval['classcategory_id2'] = '0'; |
|---|
| 884 | $sqlval['product_code'] = $arrList["product_code"]; |
|---|
| 885 | $sqlval['stock'] = $arrList["stock"]; |
|---|
| 886 | $sqlval['stock_unlimited'] = $arrList["stock_unlimited"]; |
|---|
| 887 | $sqlval['price01'] = $arrList['price01']; |
|---|
| 888 | $sqlval['price02'] = $arrList['price02']; |
|---|
| 889 | $sqlval['creator_id'] = $_SESSION['member_id']; |
|---|
| 890 | $sqlval['create_date'] = "now()"; |
|---|
| 891 | |
|---|
| 892 | if($_SESSION['member_id'] == "") { |
|---|
| 893 | $sqlval['creator_id'] = '0'; |
|---|
| 894 | } |
|---|
| 895 | |
|---|
| 896 | // INSERTの実行 |
|---|
| 897 | $objQuery->insert("dtb_products_class", $sqlval); |
|---|
| 898 | } |
|---|
| 899 | } |
|---|
| 900 | |
|---|
| 901 | function sfGetProductClassId($product_id, $classcategory_id1, $classcategory_id2) { |
|---|
| 902 | $where = "product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?"; |
|---|
| 903 | $objQuery = new SC_Query(); |
|---|
| 904 | $ret = $objQuery->get("dtb_products_class", "product_class_id", $where, Array($product_id, $classcategory_id1, $classcategory_id2)); |
|---|
| 905 | return $ret; |
|---|
| 906 | } |
|---|
| 907 | |
|---|
| 908 | /* 文末の「/」をなくす */ |
|---|
| 909 | function sfTrimURL($url) { |
|---|
| 910 | $ret = ereg_replace("[/]+$", "", $url); |
|---|
| 911 | return $ret; |
|---|
| 912 | } |
|---|
| 913 | |
|---|
| 914 | /* DBから取り出した日付の文字列を調整する。*/ |
|---|
| 915 | function sfDispDBDate($dbdate, $time = true) { |
|---|
| 916 | list($y, $m, $d, $H, $M) = split("[- :]", $dbdate); |
|---|
| 917 | |
|---|
| 918 | if(strlen($y) > 0 && strlen($m) > 0 && strlen($d) > 0) { |
|---|
| 919 | if ($time) { |
|---|
| 920 | $str = sprintf("%04d/%02d/%02d %02d:%02d", $y, $m, $d, $H, $M); |
|---|
| 921 | } else { |
|---|
| 922 | $str = sprintf("%04d/%02d/%02d", $y, $m, $d, $H, $M); |
|---|
| 923 | } |
|---|
| 924 | } else { |
|---|
| 925 | $str = ""; |
|---|
| 926 | } |
|---|
| 927 | return $str; |
|---|
| 928 | } |
|---|
| 929 | |
|---|
| 930 | /* 配列をキー名ごとの配列に変更する */ |
|---|
| 931 | function sfSwapArray($array, $isColumnName = true) { |
|---|
| 932 | $arrRet = array(); |
|---|
| 933 | $max = count($array); |
|---|
| 934 | for($i = 0; $i < $max; $i++) { |
|---|
| 935 | $j = 0; |
|---|
| 936 | foreach($array[$i] as $key => $val) { |
|---|
| 937 | if ($isColumnName) { |
|---|
| 938 | $arrRet[$key][] = $val; |
|---|
| 939 | } else { |
|---|
| 940 | $arrRet[$j][] = $val; |
|---|
| 941 | } |
|---|
| 942 | $j++; |
|---|
| 943 | } |
|---|
| 944 | } |
|---|
| 945 | return $arrRet; |
|---|
| 946 | } |
|---|
| 947 | |
|---|
| 948 | /** |
|---|
| 949 | * 連想配列から新たな配列を生成して返す. |
|---|
| 950 | * |
|---|
| 951 | * $requires が指定された場合, $requires に含まれるキーの値のみを返す. |
|---|
| 952 | * |
|---|
| 953 | * @param array 連想配列 |
|---|
| 954 | * @param array 必須キーの配列 |
|---|
| 955 | * @return array 連想配列の値のみの配列 |
|---|
| 956 | */ |
|---|
| 957 | function getHash2Array($hash, $requires = array()) { |
|---|
| 958 | $array = array(); |
|---|
| 959 | $i = 0; |
|---|
| 960 | foreach ($hash as $key => $val) { |
|---|
| 961 | if (!empty($requires)) { |
|---|
| 962 | if (in_array($key, $requires)) { |
|---|
| 963 | $array[$i] = $val; |
|---|
| 964 | $i++; |
|---|
| 965 | } |
|---|
| 966 | } else { |
|---|
| 967 | $array[$i] = $val; |
|---|
| 968 | $i++; |
|---|
| 969 | } |
|---|
| 970 | } |
|---|
| 971 | return $array; |
|---|
| 972 | } |
|---|
| 973 | |
|---|
| 974 | /* かけ算をする(Smarty用) */ |
|---|
| 975 | function sfMultiply($num1, $num2) { |
|---|
| 976 | return ($num1 * $num2); |
|---|
| 977 | } |
|---|
| 978 | |
|---|
| 979 | // カードの処理結果を返す |
|---|
| 980 | function sfGetAuthonlyResult($dir, $file_name, $name01, $name02, $card_no, $card_exp, $amount, $order_id, $jpo_info = "10"){ |
|---|
| 981 | |
|---|
| 982 | $path = $dir .$file_name; // cgiファイルのフルパス生成 |
|---|
| 983 | $now_dir = getcwd(); // requireがうまくいかないので、cgi実行ディレクトリに移動する |
|---|
| 984 | chdir($dir); |
|---|
| 985 | |
|---|
| 986 | // パイプ渡しでコマンドラインからcgi起動 |
|---|
| 987 | $cmd = "$path card_no=$card_no name01=$name01 name02=$name02 card_exp=$card_exp amount=$amount order_id=$order_id jpo_info=$jpo_info"; |
|---|
| 988 | |
|---|
| 989 | $tmpResult = popen($cmd, "r"); |
|---|
| 990 | |
|---|
| 991 | // 結果取得 |
|---|
| 992 | while( ! FEOF ( $tmpResult ) ) { |
|---|
| 993 | $result .= FGETS($tmpResult); |
|---|
| 994 | } |
|---|
| 995 | pclose($tmpResult); // パイプを閉じる |
|---|
| 996 | chdir($now_dir); // 元にいたディレクトリに帰る |
|---|
| 997 | |
|---|
| 998 | // 結果を連想配列へ格納 |
|---|
| 999 | $result = ereg_replace("&$", "", $result); |
|---|
| 1000 | foreach (explode("&",$result) as $data) { |
|---|
| 1001 | list($key, $val) = explode("=", $data, 2); |
|---|
| 1002 | $return[$key] = $val; |
|---|
| 1003 | } |
|---|
| 1004 | |
|---|
| 1005 | return $return; |
|---|
| 1006 | } |
|---|
| 1007 | |
|---|
| 1008 | /* 加算ポイントの計算式 */ |
|---|
| 1009 | function sfGetAddPoint($totalpoint, $use_point, $arrInfo) { |
|---|
| 1010 | // 購入商品の合計ポイントから利用したポイントのポイント換算価値を引く方式 |
|---|
| 1011 | $add_point = $totalpoint - intval($use_point * ($arrInfo['point_rate'] / 100)); |
|---|
| 1012 | |
|---|
| 1013 | if($add_point < 0) { |
|---|
| 1014 | $add_point = '0'; |
|---|
| 1015 | } |
|---|
| 1016 | return $add_point; |
|---|
| 1017 | } |
|---|
| 1018 | |
|---|
| 1019 | /* 一意かつ予測されにくいID */ |
|---|
| 1020 | function sfGetUniqRandomId($head = "") { |
|---|
| 1021 | // 予測されないようにランダム文字列を付与する。 |
|---|
| 1022 | $random = GC_Utils_Ex::gfMakePassword(8); |
|---|
| 1023 | // 同一ホスト内で一意なIDを生成 |
|---|
| 1024 | $id = uniqid($head); |
|---|
| 1025 | return ($id . $random); |
|---|
| 1026 | } |
|---|
| 1027 | |
|---|
| 1028 | // カテゴリ別オススメ品の取得 |
|---|
| 1029 | function sfGetBestProducts( $conn, $category_id = 0){ |
|---|
| 1030 | // 既に登録されている内容を取得する |
|---|
| 1031 | $sql = "SELECT name, main_image, main_list_image, price01_min, price01_max, price02_min, price02_max, point_rate, |
|---|
| 1032 | A.product_id, A.comment FROM dtb_best_products as A LEFT JOIN vw_products_allclass AS allcls |
|---|
| 1033 | USING (product_id) WHERE A.category_id = ? AND A.del_flg = 0 AND status = 1 ORDER BY A.rank"; |
|---|
| 1034 | $arrItems = $conn->getAll($sql, array($category_id)); |
|---|
| 1035 | |
|---|
| 1036 | return $arrItems; |
|---|
| 1037 | } |
|---|
| 1038 | |
|---|
| 1039 | // 特殊制御文字の手動エスケープ |
|---|
| 1040 | function sfManualEscape($data) { |
|---|
| 1041 | // 配列でない場合 |
|---|
| 1042 | if(!is_array($data)) { |
|---|
| 1043 | if (DB_TYPE == "pgsql") { |
|---|
| 1044 | $ret = pg_escape_string($data); |
|---|
| 1045 | }else if(DB_TYPE == "mysql"){ |
|---|
| 1046 | $ret = mysql_real_escape_string($data); |
|---|
| 1047 | } |
|---|
| 1048 | $ret = ereg_replace("%", "\\%", $ret); |
|---|
| 1049 | $ret = ereg_replace("_", "\\_", $ret); |
|---|
| 1050 | return $ret; |
|---|
| 1051 | } |
|---|
| 1052 | |
|---|
| 1053 | // 配列の場合 |
|---|
| 1054 | foreach($data as $val) { |
|---|
| 1055 | if (DB_TYPE == "pgsql") { |
|---|
| 1056 | $ret = pg_escape_string($val); |
|---|
| 1057 | }else if(DB_TYPE == "mysql"){ |
|---|
| 1058 | $ret = mysql_real_escape_string($val); |
|---|
| 1059 | } |
|---|
| 1060 | |
|---|
| 1061 | $ret = ereg_replace("%", "\\%", $ret); |
|---|
| 1062 | $ret = ereg_replace("_", "\\_", $ret); |
|---|
| 1063 | $arrRet[] = $ret; |
|---|
| 1064 | } |
|---|
| 1065 | |
|---|
| 1066 | return $arrRet; |
|---|
| 1067 | } |
|---|
| 1068 | |
|---|
| 1069 | /* ドメイン間で有効なセッションのスタート */ |
|---|
| 1070 | function sfDomainSessionStart() { |
|---|
| 1071 | $ret = session_id(); |
|---|
| 1072 | /* |
|---|
| 1073 | ヘッダーを送信していてもsession_start()が必要なページがあるので |
|---|
| 1074 | コメントアウトしておく |
|---|
| 1075 | if($ret == "" && !headers_sent()) { |
|---|
| 1076 | */ |
|---|
| 1077 | if($ret == "") { |
|---|
| 1078 | /* セッションパラメータの指定 |
|---|
| 1079 | ・ブラウザを閉じるまで有効 |
|---|
| 1080 | ・すべてのパスで有効 |
|---|
| 1081 | ・同じドメイン間で共有 */ |
|---|
| 1082 | session_set_cookie_params (0, "/", DOMAIN_NAME); |
|---|
| 1083 | |
|---|
| 1084 | if(!ini_get("session.auto_start")){ |
|---|
| 1085 | // セッション開始 |
|---|
| 1086 | session_start(); |
|---|
| 1087 | } |
|---|
| 1088 | } |
|---|
| 1089 | } |
|---|
| 1090 | |
|---|
| 1091 | /* 文字列に強制的に改行を入れる */ |
|---|
| 1092 | function sfPutBR($str, $size) { |
|---|
| 1093 | $i = 0; |
|---|
| 1094 | $cnt = 0; |
|---|
| 1095 | $line = array(); |
|---|
| 1096 | $ret = ""; |
|---|
| 1097 | |
|---|
| 1098 | while($str[$i] != "") { |
|---|
| 1099 | $line[$cnt].=$str[$i]; |
|---|
| 1100 | $i++; |
|---|
| 1101 | if(strlen($line[$cnt]) > $size) { |
|---|
| 1102 | $line[$cnt].="<br />"; |
|---|
| 1103 | $cnt++; |
|---|
| 1104 | } |
|---|
| 1105 | } |
|---|
| 1106 | |
|---|
| 1107 | foreach($line as $val) { |
|---|
| 1108 | $ret.=$val; |
|---|
| 1109 | } |
|---|
| 1110 | return $ret; |
|---|
| 1111 | } |
|---|
| 1112 | |
|---|
| 1113 | // 二回以上繰り返されているスラッシュ[/]を一つに変換する。 |
|---|
| 1114 | function sfRmDupSlash($istr){ |
|---|
| 1115 | if(ereg("^http://", $istr)) { |
|---|
| 1116 | $str = substr($istr, 7); |
|---|
| 1117 | $head = "http://"; |
|---|
| 1118 | } else if(ereg("^https://", $istr)) { |
|---|
| 1119 | $str = substr($istr, 8); |
|---|
| 1120 | $head = "https://"; |
|---|
| 1121 | } else { |
|---|
| 1122 | $str = $istr; |
|---|
| 1123 | } |
|---|
| 1124 | $str = ereg_replace("[/]+", "/", $str); |
|---|
| 1125 | $ret = $head . $str; |
|---|
| 1126 | return $ret; |
|---|
| 1127 | } |
|---|
| 1128 | |
|---|
| 1129 | function sfEncodeFile($filepath, $enc_type, $out_dir) { |
|---|
| 1130 | $ifp = fopen($filepath, "r"); |
|---|
| 1131 | |
|---|
| 1132 | $basename = basename($filepath); |
|---|
| 1133 | $outpath = $out_dir . "enc_" . $basename; |
|---|
| 1134 | |
|---|
| 1135 | $ofp = fopen($outpath, "w+"); |
|---|
| 1136 | |
|---|
| 1137 | while(!feof($ifp)) { |
|---|
| 1138 | $line = fgets($ifp); |
|---|
| 1139 | $line = mb_convert_encoding($line, $enc_type, "auto"); |
|---|
| 1140 | fwrite($ofp, $line); |
|---|
| 1141 | } |
|---|
| 1142 | |
|---|
| 1143 | fclose($ofp); |
|---|
| 1144 | fclose($ifp); |
|---|
| 1145 | |
|---|
| 1146 | return $outpath; |
|---|
| 1147 | } |
|---|
| 1148 | |
|---|
| 1149 | function sfCutString($str, $len, $byte = true, $commadisp = true) { |
|---|
| 1150 | if($byte) { |
|---|
| 1151 | if(strlen($str) > ($len + 2)) { |
|---|
| 1152 | $ret =substr($str, 0, $len); |
|---|
| 1153 | $cut = substr($str, $len); |
|---|
| 1154 | } else { |
|---|
| 1155 | $ret = $str; |
|---|
| 1156 | $commadisp = false; |
|---|
| 1157 | } |
|---|
| 1158 | } else { |
|---|
| 1159 | if(mb_strlen($str) > ($len + 1)) { |
|---|
| 1160 | $ret = mb_substr($str, 0, $len); |
|---|
| 1161 | $cut = mb_substr($str, $len); |
|---|
| 1162 | } else { |
|---|
| 1163 | $ret = $str; |
|---|
| 1164 | $commadisp = false; |
|---|
| 1165 | } |
|---|
| 1166 | } |
|---|
| 1167 | |
|---|
| 1168 | // 絵文字タグの途中で分断されないようにする。 |
|---|
| 1169 | if (isset($cut)) { |
|---|
| 1170 | // 分割位置より前の最後の [ 以降を取得する。 |
|---|
| 1171 | $head = strrchr($ret, '['); |
|---|
| 1172 | |
|---|
| 1173 | // 分割位置より後の最初の ] 以前を取得する。 |
|---|
| 1174 | $tail_pos = strpos($cut, ']'); |
|---|
| 1175 | if ($tail_pos !== false) { |
|---|
| 1176 | $tail = substr($cut, 0, $tail_pos + 1); |
|---|
| 1177 | } |
|---|
| 1178 | |
|---|
| 1179 | // 分割位置より前に [、後に ] が見つかった場合は、[ から ] までを |
|---|
| 1180 | // 接続して絵文字タグ1個分になるかどうかをチェックする。 |
|---|
| 1181 | if ($head !== false && $tail_pos !== false) { |
|---|
| 1182 | $subject = $head . $tail; |
|---|
| 1183 | if (preg_match('/^\[emoji:e?\d+\]$/', $subject)) { |
|---|
| 1184 | // 絵文字タグが見つかったので削除する。 |
|---|
| 1185 | $ret = substr($ret, 0, -strlen($head)); |
|---|
| 1186 | } |
|---|
| 1187 | } |
|---|
| 1188 | } |
|---|
| 1189 | |
|---|
| 1190 | if($commadisp){ |
|---|
| 1191 | $ret = $ret . "..."; |
|---|
| 1192 | } |
|---|
| 1193 | return $ret; |
|---|
| 1194 | } |
|---|
| 1195 | |
|---|
| 1196 | // 年、月、締め日から、先月の締め日+1、今月の締め日を求める。 |
|---|
| 1197 | function sfTermMonth($year, $month, $close_day) { |
|---|
| 1198 | $end_year = $year; |
|---|
| 1199 | $end_month = $month; |
|---|
| 1200 | |
|---|
| 1201 | // 開始月が終了月と同じか否か |
|---|
| 1202 | $same_month = false; |
|---|
| 1203 | |
|---|
| 1204 | // 該当月の末日を求める。 |
|---|
| 1205 | $end_last_day = date("d", mktime(0, 0, 0, $month + 1, 0, $year)); |
|---|
| 1206 | |
|---|
| 1207 | // 月の末日が締め日より少ない場合 |
|---|
| 1208 | if($end_last_day < $close_day) { |
|---|
| 1209 | // 締め日を月末日に合わせる |
|---|
| 1210 | $end_day = $end_last_day; |
|---|
| 1211 | } else { |
|---|
| 1212 | $end_day = $close_day; |
|---|
| 1213 | } |
|---|
| 1214 | |
|---|
| 1215 | // 前月の取得 |
|---|
| 1216 | $tmp_year = date("Y", mktime(0, 0, 0, $month, 0, $year)); |
|---|
| 1217 | $tmp_month = date("m", mktime(0, 0, 0, $month, 0, $year)); |
|---|
| 1218 | // 前月の末日を求める。 |
|---|
| 1219 | $start_last_day = date("d", mktime(0, 0, 0, $month, 0, $year)); |
|---|
| 1220 | |
|---|
| 1221 | // 前月の末日が締め日より少ない場合 |
|---|
| 1222 | if ($start_last_day < $close_day) { |
|---|
| 1223 | // 月末日に合わせる |
|---|
| 1224 | $tmp_day = $start_last_day; |
|---|
| 1225 | } else { |
|---|
| 1226 | $tmp_day = $close_day; |
|---|
| 1227 | } |
|---|
| 1228 | |
|---|
| 1229 | // 先月の末日の翌日を取得する |
|---|
| 1230 | $start_year = date("Y", mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year)); |
|---|
| 1231 | $start_month = date("m", mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year)); |
|---|
| 1232 | $start_day = date("d", mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year)); |
|---|
| 1233 | |
|---|
| 1234 | // 日付の作成 |
|---|
| 1235 | $start_date = sprintf("%d/%d/%d 00:00:00", $start_year, $start_month, $start_day); |
|---|
| 1236 | $end_date = sprintf("%d/%d/%d 23:59:59", $end_year, $end_month, $end_day); |
|---|
| 1237 | |
|---|
| 1238 | return array($start_date, $end_date); |
|---|
| 1239 | } |
|---|
| 1240 | |
|---|
| 1241 | // PDF用のRGBカラーを返す |
|---|
| 1242 | function sfGetPdfRgb($hexrgb) { |
|---|
| 1243 | $hex = substr($hexrgb, 0, 2); |
|---|
| 1244 | $r = hexdec($hex) / 255; |
|---|
| 1245 | |
|---|
| 1246 | $hex = substr($hexrgb, 2, 2); |
|---|
| 1247 | $g = hexdec($hex) / 255; |
|---|
| 1248 | |
|---|
| 1249 | $hex = substr($hexrgb, 4, 2); |
|---|
| 1250 | $b = hexdec($hex) / 255; |
|---|
| 1251 | |
|---|
| 1252 | return array($r, $g, $b); |
|---|
| 1253 | } |
|---|
| 1254 | |
|---|
| 1255 | //メルマガ仮登録とメール配信 |
|---|
| 1256 | /* |
|---|
| 1257 | * FIXME |
|---|
| 1258 | */ |
|---|
| 1259 | function sfRegistTmpMailData($mail_flag, $email){ |
|---|
| 1260 | $objQuery = new SC_Query(); |
|---|
| 1261 | $objConn = new SC_DBConn(); |
|---|
| 1262 | $objPage = new LC_Page(); |
|---|
| 1263 | |
|---|
| 1264 | $random_id = sfGetUniqRandomId(); |
|---|
| 1265 | $arrRegistMailMagazine["mail_flag"] = $mail_flag; |
|---|
| 1266 | $arrRegistMailMagazine["email"] = $email; |
|---|
| 1267 | $arrRegistMailMagazine["temp_id"] =$random_id; |
|---|
| 1268 | $arrRegistMailMagazine["end_flag"]='0'; |
|---|
| 1269 | $arrRegistMailMagazine["update_date"] = 'now()'; |
|---|
| 1270 | |
|---|
| 1271 | //メルマガ仮登録用フラグ |
|---|
| 1272 | $flag = $objQuery->count("dtb_customer_mail_temp", "email=?", array($email)); |
|---|
| 1273 | $objConn->query("BEGIN"); |
|---|
| 1274 | switch ($flag){ |
|---|
| 1275 | case '0': |
|---|
| 1276 | $objConn->autoExecute("dtb_customer_mail_temp",$arrRegistMailMagazine); |
|---|
| 1277 | break; |
|---|
| 1278 | |
|---|
| 1279 | case '1': |
|---|
| 1280 | $objConn->autoExecute("dtb_customer_mail_temp",$arrRegistMailMagazine, "email = '" .addslashes($email). "'"); |
|---|
| 1281 | break; |
|---|
| 1282 | } |
|---|
| 1283 | $objConn->query("COMMIT"); |
|---|
| 1284 | $subject = sfMakeSubject('メルマガ仮登録が完了しました。'); |
|---|
| 1285 | $objPage->tpl_url = SSL_URL."mailmagazine/regist.php?temp_id=".$arrRegistMailMagazine['temp_id']; |
|---|
| 1286 | switch ($mail_flag){ |
|---|
| 1287 | case '1': |
|---|
| 1288 | $objPage->tpl_name = "登録"; |
|---|
| 1289 | $objPage->tpl_kindname = "HTML"; |
|---|
| 1290 | break; |
|---|
| 1291 | |
|---|
| 1292 | case '2': |
|---|
| 1293 | $objPage->tpl_name = "登録"; |
|---|
| 1294 | $objPage->tpl_kindname = "テキスト"; |
|---|
| 1295 | break; |
|---|
| 1296 | |
|---|
| 1297 | case '3': |
|---|
| 1298 | $objPage->tpl_name = "解除"; |
|---|
| 1299 | break; |
|---|
| 1300 | } |
|---|
| 1301 | $objPage->tpl_email = $email; |
|---|
| 1302 | sfSendTplMail($email, $subject, 'mail_templates/mailmagazine_temp.tpl', $objPage); |
|---|
| 1303 | } |
|---|
| 1304 | |
|---|
| 1305 | // 再帰的に多段配列を検索して一次元配列(Hidden引渡し用配列)に変換する。 |
|---|
| 1306 | function sfMakeHiddenArray($arrSrc, $arrDst = array(), $parent_key = "") { |
|---|
| 1307 | if(is_array($arrSrc)) { |
|---|
| 1308 | foreach($arrSrc as $key => $val) { |
|---|
| 1309 | if($parent_key != "") { |
|---|
| 1310 | $keyname = $parent_key . "[". $key . "]"; |
|---|
| 1311 | } else { |
|---|
| 1312 | $keyname = $key; |
|---|
| 1313 | } |
|---|
| 1314 | if(is_array($val)) { |
|---|
| 1315 | $arrDst = SC_Utils::sfMakeHiddenArray($val, $arrDst, $keyname); |
|---|
| 1316 | } else { |
|---|
| 1317 | $arrDst[$keyname] = $val; |
|---|
| 1318 | } |
|---|
| 1319 | } |
|---|
| 1320 | } |
|---|
| 1321 | return $arrDst; |
|---|
| 1322 | } |
|---|
| 1323 | |
|---|
| 1324 | // DB取得日時をタイムに変換 |
|---|
| 1325 | function sfDBDatetoTime($db_date) { |
|---|
| 1326 | $date = ereg_replace("\..*$","",$db_date); |
|---|
| 1327 | $time = strtotime($date); |
|---|
| 1328 | return $time; |
|---|
| 1329 | } |
|---|
| 1330 | |
|---|
| 1331 | // 出力の際にテンプレートを切り替えられる |
|---|
| 1332 | /* |
|---|
| 1333 | index.php?tpl=test.tpl |
|---|
| 1334 | */ |
|---|
| 1335 | function sfCustomDisplay(&$objPage, $is_mobile = false) { |
|---|
| 1336 | $basename = basename($_SERVER["REQUEST_URI"]); |
|---|
| 1337 | |
|---|
| 1338 | if($basename == "") { |
|---|
| 1339 | $path = $_SERVER["REQUEST_URI"] . "index.php"; |
|---|
| 1340 | } else { |
|---|
| 1341 | $path = $_SERVER["REQUEST_URI"]; |
|---|
| 1342 | } |
|---|
| 1343 | |
|---|
| 1344 | if(isset($_GET['tpl']) && $_GET['tpl'] != "") { |
|---|
| 1345 | $tpl_name = $_GET['tpl']; |
|---|
| 1346 | } else { |
|---|
| 1347 | $tpl_name = ereg_replace("^/", "", $path); |
|---|
| 1348 | $tpl_name = ereg_replace("/", "_", $tpl_name); |
|---|
| 1349 | $tpl_name = ereg_replace("(\.php$|\.html$)", ".tpl", $tpl_name); |
|---|
| 1350 | } |
|---|
| 1351 | |
|---|
| 1352 | $template_path = TEMPLATE_FTP_DIR . $tpl_name; |
|---|
| 1353 | |
|---|
| 1354 | if($is_mobile === true) { |
|---|
| 1355 | $objView = new SC_MobileView(); |
|---|
| 1356 | $objView->assignobj($objPage); |
|---|
| 1357 | $objView->display(SITE_FRAME); |
|---|
| 1358 | } else if(file_exists($template_path)) { |
|---|
| 1359 | $objView = new SC_UserView(TEMPLATE_FTP_DIR, COMPILE_FTP_DIR); |
|---|
| 1360 | $objView->assignobj($objPage); |
|---|
| 1361 | $objView->display($tpl_name); |
|---|
| 1362 | } else { |
|---|
| 1363 | $objView = new SC_SiteView(); |
|---|
| 1364 | $objView->assignobj($objPage); |
|---|
| 1365 | $objView->display(SITE_FRAME); |
|---|
| 1366 | } |
|---|
| 1367 | } |
|---|
| 1368 | |
|---|
| 1369 | // PHPのmb_convert_encoding関数をSmartyでも使えるようにする |
|---|
| 1370 | function sf_mb_convert_encoding($str, $encode = 'CHAR_CODE') { |
|---|
| 1371 | return mb_convert_encoding($str, $encode); |
|---|
| 1372 | } |
|---|
| 1373 | |
|---|
| 1374 | // PHPのmktime関数をSmartyでも使えるようにする |
|---|
| 1375 | function sf_mktime($format, $hour=0, $minute=0, $second=0, $month=1, $day=1, $year=1999) { |
|---|
| 1376 | return date($format,mktime($hour, $minute, $second, $month, $day, $year)); |
|---|
| 1377 | } |
|---|
| 1378 | |
|---|
| 1379 | // PHPのdate関数をSmartyでも使えるようにする |
|---|
| 1380 | function sf_date($format, $timestamp = '') { |
|---|
| 1381 | return date( $format, $timestamp); |
|---|
| 1382 | } |
|---|
| 1383 | |
|---|
| 1384 | // チェックボックスの型を変換する |
|---|
| 1385 | function sfChangeCheckBox($data , $tpl = false){ |
|---|
| 1386 | if ($tpl) { |
|---|
| 1387 | if ($data == 1){ |
|---|
| 1388 | return 'checked'; |
|---|
| 1389 | }else{ |
|---|
| 1390 | return ""; |
|---|
| 1391 | } |
|---|
| 1392 | }else{ |
|---|
| 1393 | if ($data == "on"){ |
|---|
| 1394 | return 1; |
|---|
| 1395 | }else{ |
|---|
| 1396 | return 2; |
|---|
| 1397 | } |
|---|
| 1398 | } |
|---|
| 1399 | } |
|---|
| 1400 | |
|---|
| 1401 | // 2つの配列を用いて連想配列を作成する |
|---|
| 1402 | function sfarrCombine($arrKeys, $arrValues) { |
|---|
| 1403 | |
|---|
| 1404 | if(count($arrKeys) <= 0 and count($arrValues) <= 0) return array(); |
|---|
| 1405 | |
|---|
| 1406 | $keys = array_values($arrKeys); |
|---|
| 1407 | $vals = array_values($arrValues); |
|---|
| 1408 | |
|---|
| 1409 | $max = max( count( $keys ), count( $vals ) ); |
|---|
| 1410 | $combine_ary = array(); |
|---|
| 1411 | for($i=0; $i<$max; $i++) { |
|---|
| 1412 | $combine_ary[$keys[$i]] = $vals[$i]; |
|---|
| 1413 | } |
|---|
| 1414 | if(is_array($combine_ary)) return $combine_ary; |
|---|
| 1415 | |
|---|
| 1416 | return false; |
|---|
| 1417 | } |
|---|
| 1418 | |
|---|
| 1419 | /* 子ID所属する親IDを取得する */ |
|---|
| 1420 | function sfGetParentsArraySub($arrData, $pid_name, $id_name, $child) { |
|---|
| 1421 | $max = count($arrData); |
|---|
| 1422 | $parent = ""; |
|---|
| 1423 | for($i = 0; $i < $max; $i++) { |
|---|
| 1424 | if($arrData[$i][$id_name] == $child) { |
|---|
| 1425 | $parent = $arrData[$i][$pid_name]; |
|---|
| 1426 | break; |
|---|
| 1427 | } |
|---|
| 1428 | } |
|---|
| 1429 | return $parent; |
|---|
| 1430 | } |
|---|
| 1431 | |
|---|
| 1432 | /* 階層構造のテーブルから与えられたIDの兄弟を取得する */ |
|---|
| 1433 | function sfGetBrothersArray($arrData, $pid_name, $id_name, $arrPID) { |
|---|
| 1434 | $max = count($arrData); |
|---|
| 1435 | |
|---|
| 1436 | $arrBrothers = array(); |
|---|
| 1437 | foreach($arrPID as $id) { |
|---|
| 1438 | // 親IDを検索する |
|---|
| 1439 | for($i = 0; $i < $max; $i++) { |
|---|
| 1440 | if($arrData[$i][$id_name] == $id) { |
|---|
| 1441 | $parent = $arrData[$i][$pid_name]; |
|---|
| 1442 | break; |
|---|
| 1443 | } |
|---|
| 1444 | } |
|---|
| 1445 | // 兄弟IDを検索する |
|---|
| 1446 | for($i = 0; $i < $max; $i++) { |
|---|
| 1447 | if($arrData[$i][$pid_name] == $parent) { |
|---|
| 1448 | $arrBrothers[] = $arrData[$i][$id_name]; |
|---|
| 1449 | } |
|---|
| 1450 | } |
|---|
| 1451 | } |
|---|
| 1452 | return $arrBrothers; |
|---|
| 1453 | } |
|---|
| 1454 | |
|---|
| 1455 | /* 階層構造のテーブルから与えられたIDの直属の子を取得する */ |
|---|
| 1456 | function sfGetUnderChildrenArray($arrData, $pid_name, $id_name, $parent) { |
|---|
| 1457 | $max = count($arrData); |
|---|
| 1458 | |
|---|
| 1459 | $arrChildren = array(); |
|---|
| 1460 | // 子IDを検索する |
|---|
| 1461 | for($i = 0; $i < $max; $i++) { |
|---|
| 1462 | if($arrData[$i][$pid_name] == $parent) { |
|---|
| 1463 | $arrChildren[] = $arrData[$i][$id_name]; |
|---|
| 1464 | } |
|---|
| 1465 | } |
|---|
| 1466 | return $arrChildren; |
|---|
| 1467 | } |
|---|
| 1468 | |
|---|
| 1469 | // SQLシングルクォート対応 |
|---|
| 1470 | function sfQuoteSmart($in){ |
|---|
| 1471 | |
|---|
| 1472 | if (is_int($in) || is_double($in)) { |
|---|
| 1473 | return $in; |
|---|
| 1474 | } elseif (is_bool($in)) { |
|---|
| 1475 | return $in ? 1 : 0; |
|---|
| 1476 | } elseif (is_null($in)) { |
|---|
| 1477 | return 'NULL'; |
|---|
| 1478 | } else { |
|---|
| 1479 | return "'" . str_replace("'", "''", $in) . "'"; |
|---|
| 1480 | } |
|---|
| 1481 | } |
|---|
| 1482 | |
|---|
| 1483 | // ディレクトリ以下のファイルを再帰的にコピー |
|---|
| 1484 | function sfCopyDir($src, $des, $mess, $override = false){ |
|---|
| 1485 | if(!is_dir($src)){ |
|---|
| 1486 | return false; |
|---|
| 1487 | } |
|---|
| 1488 | |
|---|
| 1489 | $oldmask = umask(0); |
|---|
| 1490 | $mod= stat($src); |
|---|
| 1491 | |
|---|
| 1492 | // ディレクトリがなければ作成する |
|---|
| 1493 | if(!file_exists($des)) { |
|---|
| 1494 | if(!mkdir($des, $mod[2])) { |
|---|
| 1495 | print("path:" . $des); |
|---|
| 1496 | } |
|---|
| 1497 | } |
|---|
| 1498 | |
|---|
| 1499 | $fileArray=glob( $src."*" ); |
|---|
| 1500 | foreach( $fileArray as $key => $data_ ){ |
|---|
| 1501 | // CVS管理ファイルはコピーしない |
|---|
| 1502 | if(ereg("/CVS/Entries", $data_)) { |
|---|
| 1503 | break; |
|---|
| 1504 | } |
|---|
| 1505 | if(ereg("/CVS/Repository", $data_)) { |
|---|
| 1506 | break; |
|---|
| 1507 | } |
|---|
| 1508 | if(ereg("/CVS/Root", $data_)) { |
|---|
| 1509 | break; |
|---|
| 1510 | } |
|---|
| 1511 | |
|---|
| 1512 | mb_ereg("^(.*[\/])(.*)",$data_, $matches); |
|---|
| 1513 | $data=$matches[2]; |
|---|
| 1514 | if( is_dir( $data_ ) ){ |
|---|
| 1515 | $mess = SC_Utils::sfCopyDir( $data_.'/', $des.$data.'/', $mess); |
|---|
| 1516 | }else{ |
|---|
| 1517 | if(!$override && file_exists($des.$data)) { |
|---|
| 1518 | $mess.= $des.$data . ":ファイルが存在します\n"; |
|---|
| 1519 | } else { |
|---|
| 1520 | if(@copy( $data_, $des.$data)) { |
|---|
| 1521 | $mess.= $des.$data . ":コピー成功\n"; |
|---|
| 1522 | } else { |
|---|
| 1523 | $mess.= $des.$data . ":コピー失敗\n"; |
|---|
| 1524 | } |
|---|
| 1525 | } |
|---|
| 1526 | $mod=stat($data_ ); |
|---|
| 1527 | } |
|---|
| 1528 | } |
|---|
| 1529 | umask($oldmask); |
|---|
| 1530 | return $mess; |
|---|
| 1531 | } |
|---|
| 1532 | |
|---|
| 1533 | // 指定したフォルダ内のファイルを全て削除する |
|---|
| 1534 | function sfDelFile($dir){ |
|---|
| 1535 | $dh = opendir($dir); |
|---|
| 1536 | // フォルダ内のファイルを削除 |
|---|
| 1537 | while($file = readdir($dh)){ |
|---|
| 1538 | if ($file == "." or $file == "..") continue; |
|---|
| 1539 | $del_file = $dir . "/" . $file; |
|---|
| 1540 | if(is_file($del_file)){ |
|---|
| 1541 | $ret = unlink($dir . "/" . $file); |
|---|
| 1542 | }else if (is_dir($del_file)){ |
|---|
| 1543 | $ret = SC_Utils::sfDelFile($del_file); |
|---|
| 1544 | } |
|---|
| 1545 | |
|---|
| 1546 | if(!$ret){ |
|---|
| 1547 | return $ret; |
|---|
| 1548 | } |
|---|
| 1549 | } |
|---|
| 1550 | |
|---|
| 1551 | // 閉じる |
|---|
| 1552 | closedir($dh); |
|---|
| 1553 | |
|---|
| 1554 | // フォルダを削除 |
|---|
| 1555 | return rmdir($dir); |
|---|
| 1556 | } |
|---|
| 1557 | |
|---|
| 1558 | /* |
|---|
| 1559 | * 関数名:sfWriteFile |
|---|
| 1560 | * 引数1 :書き込むデータ |
|---|
| 1561 | * 引数2 :ファイルパス |
|---|
| 1562 | * 引数3 :書き込みタイプ |
|---|
| 1563 | * 引数4 :パーミッション |
|---|
| 1564 | * 戻り値:結果フラグ 成功なら true 失敗なら false |
|---|
| 1565 | * 説明 :ファイル書き出し |
|---|
| 1566 | */ |
|---|
| 1567 | function sfWriteFile($str, $path, $type, $permission = "") { |
|---|
| 1568 | //ファイルを開く |
|---|
| 1569 | if (!($file = fopen ($path, $type))) { |
|---|
| 1570 | return false; |
|---|
| 1571 | } |
|---|
| 1572 | |
|---|
| 1573 | //ファイルロック |
|---|
| 1574 | flock ($file, LOCK_EX); |
|---|
| 1575 | //ファイルの書き込み |
|---|
| 1576 | fputs ($file, $str); |
|---|
| 1577 | //ファイルロックの解除 |
|---|
| 1578 | flock ($file, LOCK_UN); |
|---|
| 1579 | //ファイルを閉じる |
|---|
| 1580 | fclose ($file); |
|---|
| 1581 | // 権限を指定 |
|---|
| 1582 | if($permission != "") { |
|---|
| 1583 | chmod($path, $permission); |
|---|
| 1584 | } |
|---|
| 1585 | |
|---|
| 1586 | return true; |
|---|
| 1587 | } |
|---|
| 1588 | |
|---|
| 1589 | function sfFlush($output = " ", $sleep = 0){ |
|---|
| 1590 | // 実行時間を制限しない |
|---|
| 1591 | set_time_limit(0); |
|---|
| 1592 | // 出力をバッファリングしない(==日本語自動変換もしない) |
|---|
| 1593 | ob_end_clean(); |
|---|
| 1594 | |
|---|
| 1595 | // IEのために256バイト空文字出力 |
|---|
| 1596 | echo str_pad('',256); |
|---|
| 1597 | |
|---|
| 1598 | // 出力はブランクだけでもいいと思う |
|---|
| 1599 | echo $output; |
|---|
| 1600 | // 出力をフラッシュする |
|---|
| 1601 | flush(); |
|---|
| 1602 | |
|---|
| 1603 | ob_end_flush(); |
|---|
| 1604 | ob_start(); |
|---|
| 1605 | |
|---|
| 1606 | // 時間のかかる処理 |
|---|
| 1607 | sleep($sleep); |
|---|
| 1608 | } |
|---|
| 1609 | |
|---|
| 1610 | // @versionの記載があるファイルからバージョンを取得する。 |
|---|
| 1611 | function sfGetFileVersion($path) { |
|---|
| 1612 | if(file_exists($path)) { |
|---|
| 1613 | $src_fp = fopen($path, "rb"); |
|---|
| 1614 | if($src_fp) { |
|---|
| 1615 | while (!feof($src_fp)) { |
|---|
| 1616 | $line = fgets($src_fp); |
|---|
| 1617 | if(ereg("@version", $line)) { |
|---|
| 1618 | $arrLine = split(" ", $line); |
|---|
| 1619 | $version = $arrLine[5]; |
|---|
| 1620 | } |
|---|
| 1621 | } |
|---|
| 1622 | fclose($src_fp); |
|---|
| 1623 | } |
|---|
| 1624 | } |
|---|
| 1625 | return $version; |
|---|
| 1626 | } |
|---|
| 1627 | |
|---|
| 1628 | // 指定したURLに対してPOSTでデータを送信する |
|---|
| 1629 | function sfSendPostData($url, $arrData, $arrOkCode = array()){ |
|---|
| 1630 | require_once(DATA_PATH . "module/Request.php"); |
|---|
| 1631 | |
|---|
| 1632 | // 送信インスタンス生成 |
|---|
| 1633 | $req = new HTTP_Request($url); |
|---|
| 1634 | |
|---|
| 1635 | $req->addHeader('User-Agent', 'DoCoMo/2.0 P2101V(c100)'); |
|---|
| 1636 | $req->setMethod(HTTP_REQUEST_METHOD_POST); |
|---|
| 1637 | |
|---|
| 1638 | // POSTデータ送信 |
|---|
| 1639 | $req->addPostDataArray($arrData); |
|---|
| 1640 | |
|---|
| 1641 | // エラーが無ければ、応答情報を取得する |
|---|
| 1642 | if (!PEAR::isError($req->sendRequest())) { |
|---|
| 1643 | |
|---|
| 1644 | // レスポンスコードがエラー判定なら、空を返す |
|---|
| 1645 | $res_code = $req->getResponseCode(); |
|---|
| 1646 | |
|---|
| 1647 | if(!in_array($res_code, $arrOkCode)){ |
|---|
| 1648 | $response = ""; |
|---|
| 1649 | }else{ |
|---|
| 1650 | $response = $req->getResponseBody(); |
|---|
| 1651 | } |
|---|
| 1652 | |
|---|
| 1653 | } else { |
|---|
| 1654 | $response = ""; |
|---|
| 1655 | } |
|---|
| 1656 | |
|---|
| 1657 | // POSTデータクリア |
|---|
| 1658 | $req->clearPostData(); |
|---|
| 1659 | |
|---|
| 1660 | return $response; |
|---|
| 1661 | } |
|---|
| 1662 | |
|---|
| 1663 | /** |
|---|
| 1664 | * $array の要素を $arrConvList で指定した方式で mb_convert_kana を適用する. |
|---|
| 1665 | * |
|---|
| 1666 | * @param array $array 変換する文字列の配列 |
|---|
| 1667 | * @param array $arrConvList mb_convert_kana の適用ルール |
|---|
| 1668 | * @return array 変換後の配列 |
|---|
| 1669 | * @see mb_convert_kana |
|---|
| 1670 | */ |
|---|
| 1671 | function mbConvertKanaWithArray($array, $arrConvList) { |
|---|
| 1672 | foreach ($arrConvList as $key => $val) { |
|---|
| 1673 | if(isset($array[$key])) { |
|---|
| 1674 | $array[$key] = mb_convert_kana($array[$key] ,$val); |
|---|
| 1675 | } |
|---|
| 1676 | } |
|---|
| 1677 | return $array; |
|---|
| 1678 | } |
|---|
| 1679 | |
|---|
| 1680 | /** |
|---|
| 1681 | * 配列の添字が未定義の場合は空文字を代入して定義する. |
|---|
| 1682 | * |
|---|
| 1683 | * @param array $array 添字をチェックする配列 |
|---|
| 1684 | * @param array $defineIndexes チェックする添字 |
|---|
| 1685 | * @return array 添字を定義した配列 |
|---|
| 1686 | */ |
|---|
| 1687 | function arrayDefineIndexes($array, $defineIndexes) { |
|---|
| 1688 | foreach ($defineIndexes as $key) { |
|---|
| 1689 | if (!isset($array[$key])) $array[$key] = ""; |
|---|
| 1690 | } |
|---|
| 1691 | return $array; |
|---|
| 1692 | } |
|---|
| 1693 | |
|---|
| 1694 | /** |
|---|
| 1695 | * XML宣言を出力する. |
|---|
| 1696 | * |
|---|
| 1697 | * XML宣言があると問題が発生する UA は出力しない. |
|---|
| 1698 | * |
|---|
| 1699 | * @return string XML宣言の文字列 |
|---|
| 1700 | */ |
|---|
| 1701 | function printXMLDeclaration() { |
|---|
| 1702 | $ua = $_SERVER['HTTP_USER_AGENT']; |
|---|
| 1703 | if (!preg_match("/MSIE/", $ua) || preg_match("/MSIE 7/", $ua)) { |
|---|
| 1704 | print("<?xml version='1.0' encoding='" . CHAR_CODE . "'?>\n"); |
|---|
| 1705 | } |
|---|
| 1706 | } |
|---|
| 1707 | |
|---|
| 1708 | /* デバッグ用 ------------------------------------------------------------------------------------------------*/ |
|---|
| 1709 | function sfPrintR($obj) { |
|---|
| 1710 | print("<div style='font-size: 12px;color: #00FF00;'>\n"); |
|---|
| 1711 | print("<strong>**デバッグ中**</strong><br />\n"); |
|---|
| 1712 | print("<pre>\n"); |
|---|
| 1713 | //print_r($obj); |
|---|
| 1714 | var_dump($obj); |
|---|
| 1715 | print("</pre>\n"); |
|---|
| 1716 | print("<strong>**デバッグ中**</strong></div>\n"); |
|---|
| 1717 | } |
|---|
| 1718 | } |
|---|
| 1719 | ?> |
|---|