'; $GLOBAL_ERR.= $mess; $GLOBAL_ERR.= ''; if ($print) { echo $GLOBAL_ERR; } } /* エラーページの表示 */ public function sfDispError($type) { require_once CLASS_EX_REALDIR . 'page_extends/error/LC_Page_Error_DispError_Ex.php'; $objPage = new LC_Page_Error_DispError_Ex(); $objPage->init(); $objPage->type = $type; $objPage->process(); exit; } /* サイトエラーページの表示 */ public function sfDispSiteError($type, $objSiteSess = '', $return_top = false, $err_msg = '') { require_once CLASS_EX_REALDIR . 'page_extends/error/LC_Page_Error_Ex.php'; $objPage = new LC_Page_Error_Ex(); $objPage->init(); $objPage->type = $type; $objPage->objSiteSess = $objSiteSess; $objPage->return_top = $return_top; $objPage->err_msg = $err_msg; $objPage->is_mobile = SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE; $objPage->process(); exit; } /** * 前方互換用 * * @deprecated 2.12.0 trigger_error($debugMsg, E_USER_ERROR) を使用すること */ public function sfDispException($debugMsg = null) { trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING); trigger_error($debugMsg, E_USER_ERROR); } /** * 認証の可否判定 * * @param SC_Session $objSess * @param bool $disp_error * @return bool */ public static function sfIsSuccess(SC_Session $objSess, $disp_error = true) { $ret = $objSess->IsSuccess(); if ($ret != SUCCESS) { if ($disp_error) { // エラーページの表示 SC_Utils_Ex::sfDispError($ret); } return false; } // リファラーチェック(CSRFの暫定的な対策) // 「リファラ無」 の場合はスルー // 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する if (empty($_SERVER['HTTP_REFERER'])) { // TODO 警告表示させる? // sfErrorHeader('>> referrerが無効になっています。'); } else { $domain = SC_Utils_Ex::sfIsHTTPS() ? HTTPS_URL : HTTP_URL; $pattern = sprintf('|^%s.*|', $domain); $referer = $_SERVER['HTTP_REFERER']; // 管理画面から以外の遷移の場合はエラー画面を表示 if (!preg_match($pattern, $referer)) { if ($disp_error) SC_Utils_Ex::sfDispError(INVALID_MOVE_ERRORR); return false; } } return true; } /** * 文字列をアスタリスクへ変換する. * * @param string $passlen 変換する文字列 * @return string アスタリスクへ変換した文字列 */ public function sfPassLen($passlen) { $ret = ''; for ($i=0;$i<$passlen;true) { $ret.='*'; $i++; } return $ret; } /** * HTTPSかどうかを判定 * * @return bool */ public function sfIsHTTPS() { // HTTPS時には$_SERVER['HTTPS']には空でない値が入る // $_SERVER['HTTPS'] != 'off' はIIS用 if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { return true; } else { return false; } } /** * 正規の遷移がされているかを判定 * 前画面でuniqidを埋め込んでおく必要がある * @param obj SC_Session, SC_SiteSession * @return bool */ public function sfIsValidTransition($objSess) { // 前画面からPOSTされるuniqidが正しいものかどうかをチェック $uniqid = $objSess->getUniqId(); if (!empty($_POST['uniqid']) && ($_POST['uniqid'] === $uniqid)) { return true; } else { return false; } } /* DB用日付文字列取得 */ public static function sfGetTimestamp($year, $month, $day, $last = false) { if ($year != '' && $month != '' && $day != '') { if ($last) { $time = '23:59:59'; } else { $time = '00:00:00'; } $date = $year.'-'.$month.'-'.$day.' '.$time; } else { $date = ''; } return $date; } /* DB用日付日時文字列取得 */ public function sfGetTimestampistime($year, $month, $day, $hour, $minutes, $last = false) { if ($year != '' && $month != '' && $day != '' && $hour != '' && $minutes != '') { if ($last) { $time = $hour.':'.$minutes.':59'; } else { $time = $hour.':'.$minutes.':00'; } $date = $year.'-'.$month.'-'.$day.' '.$time; } else { $date = ''; } return $date; } /** * INT型の数値チェック * ・FIXME: マイナス値の扱いが不明確 * ・XXX: INT_LENには収まるが、INT型の範囲を超えるケースに対応できないのでは? * * @param mixed $value * @return bool */ public static function sfIsInt($value) { if (strlen($value) >= 1 && strlen($value) <= INT_LEN && is_numeric($value)) { return true; } return false; } /** * 桁が0で埋められているかを判定する * * @param string $value 検査対象 * @return boolean 0で埋められている */ public static function sfIsZeroFilling($value) { if (strlen($value) > 1 && $value{0} === '0') return true; return false; } public function sfGetCSVData($data, $prefix = '') { if ($prefix == '') { $dir_name = SC_Utils_Ex::sfUpDirName(); $file_name = $dir_name . date('ymdHis') .'.csv'; } else { $file_name = $prefix . date('ymdHis') .'.csv'; } if (mb_internal_encoding() == CHAR_CODE) { $data = mb_convert_encoding($data,'SJIS-Win',CHAR_CODE); } /* データを出力 */ return array($file_name, $data); } /* 1階層上のディレクトリ名を取得する */ public function sfUpDirName() { $path = $_SERVER['SCRIPT_NAME']; $arrVal = explode('/', $path); $cnt = count($arrVal); return $arrVal[($cnt - 2)]; } // チェックボックスの値をマージ /** * @deprecated */ public function sfMergeCBValue($keyname, $max) { $conv = ''; $cnt = 1; for ($cnt = 1; $cnt <= $max; $cnt++) { if ($_POST[$keyname . $cnt] == '1') { $conv.= '1'; } else { $conv.= '0'; } } return $conv; } // html_checkboxesの値をマージして2進数形式に変更する。 /** * @deprecated */ public function sfMergeCheckBoxes($array, $max) { $ret = ''; $arrTmp = array(); if (is_array($array)) { foreach ($array as $val) { $arrTmp[$val] = '1'; } } for ($i = 1; $i <= $max; $i++) { if (isset($arrTmp[$i]) && $arrTmp[$i] == '1') { $ret.= '1'; } else { $ret.= '0'; } } return $ret; } // html_checkboxesの値をマージして「-」でつなげる。 /** * @deprecated */ public function sfMergeParamCheckBoxes($array) { $ret = ''; if (is_array($array)) { foreach ($array as $val) { if ($ret != '') { $ret.= "-$val"; } else { $ret = $val; } } } else { $ret = $array; } return $ret; } // html_checkboxesの値をマージしてSQL検索用に変更する。 /** * @deprecated */ public function sfSearchCheckBoxes($array) { $max = max($array); $ret = ''; for ($i = 1; $i <= $max; $i++) { $ret .= in_array($i, $array) ? '1' : '_'; } if (strlen($ret) != 0) { $ret .= '%'; } return $ret; } // 2進数形式の値をhtml_checkboxes対応の値に切り替える /** * @deprecated */ public function sfSplitCheckBoxes($val) { $arrRet = array(); $len = strlen($val); for ($i = 0; $i < $len; $i++) { if (substr($val, $i, 1) == '1') { $arrRet[] = ($i + 1); } } return $arrRet; } // チェックボックスの値をマージ /** * @deprecated */ public function sfMergeCBSearchValue($keyname, $max) { $conv = ''; $cnt = 1; for ($cnt = 1; $cnt <= $max; $cnt++) { if ($_POST[$keyname . $cnt] == '1') { $conv.= '1'; } else { $conv.= '_'; } } return $conv; } // チェックボックスの値を分解 /** * @deprecated */ public function sfSplitCBValue($val, $keyname = '') { $arr = array(); $len = strlen($val); $no = 1; for ($cnt = 0; $cnt < $len; $cnt++) { if ($keyname != '') { $arr[$keyname . $no] = substr($val, $cnt, 1); } else { $arr[] = substr($val, $cnt, 1); } $no++; } return $arr; } // キーと値をセットした配列を取得 public function sfArrKeyValue($arrList, $keyname, $valname, $len_max = '', $keysize = '') { $arrRet = array(); $max = count($arrList); if ($len_max != '' && $max > $len_max) { $max = $len_max; } for ($cnt = 0; $cnt < $max; $cnt++) { if ($keysize != '') { $key = SC_Utils_Ex::sfCutString($arrList[$cnt][$keyname], $keysize); } else { $key = $arrList[$cnt][$keyname]; } $val = $arrList[$cnt][$valname]; if (!isset($arrRet[$key])) { $arrRet[$key] = $val; } } return $arrRet; } // キーと値をセットした配列を取得(値が複数の場合) public function sfArrKeyValues($arrList, $keyname, $valname, $len_max = '', $keysize = '', $connect = '') { $max = count($arrList); if ($len_max != '' && $max > $len_max) { $max = $len_max; } $keyValues = array(); for ($cnt = 0; $cnt < $max; $cnt++) { if ($keysize != '') { $key = SC_Utils_Ex::sfCutString($arrList[$cnt][$keyname], $keysize); } else { $key = $arrList[$cnt][$keyname]; } $val = $arrList[$cnt][$valname]; if ($connect != '') { $keyValues[$key].= "$val".$connect; } else { $keyValues[$key][] = $val; } } return $keyValues; } // 配列の値をカンマ区切りで返す。 public static function sfGetCommaList($array, $space=true, $arrPop = array()) { if (count($array) > 0) { $line = ''; foreach ($array as $val) { if (!in_array($val, $arrPop)) { if ($space) { $line .= $val . ', '; } else { $line .= $val . ','; } } } if ($space) { $line = preg_replace("/, $/", '', $line); } else { $line = preg_replace("/,$/", '', $line); } return $line; } else { return false; } } /* 配列の要素をCSVフォーマットで出力する。*/ public function sfGetCSVList($array) { $line = ''; if (count($array) > 0) { foreach ($array as $val) { $val = mb_convert_encoding($val, CHAR_CODE, CHAR_CODE); $line .= '"' .$val. '",'; } $line = preg_replace("/,$/", "\r\n", $line); } else { return false; } return $line; } /*-----------------------------------------------------------------*/ /* check_set_term /* 年月日に別れた2つの期間の妥当性をチェックし、整合性と期間を返す /* 引数 (開始年,開始月,開始日,終了年,終了月,終了日) /* 戻値 array(1,2,3) /* 1.開始年月日 (YYYY/MM/DD 000000) /* 2.終了年月日 (YYYY/MM/DD 235959) /* 3.エラー (0 = OK, 1 = NG) /*-----------------------------------------------------------------*/ public function sfCheckSetTerm($start_year, $start_month, $start_day, $end_year, $end_month, $end_day) { // 期間指定 $error = 0; if ($start_month || $start_day || $start_year) { if (! checkdate($start_month, $start_day , $start_year)) $error = 1; } else { $error = 1; } if ($end_month || $end_day || $end_year) { if (! checkdate($end_month ,$end_day ,$end_year)) $error = 2; } if (! $error) { $date1 = $start_year .'/'.sprintf('%02d',$start_month) .'/'.sprintf('%02d',$start_day) .' 000000'; $date2 = $end_year .'/'.sprintf('%02d',$end_month) .'/'.sprintf('%02d',$end_day) .' 235959'; if ($date1 > $date2) $error = 3; } else { $error = 1; } return array($date1, $date2, $error); } // エラー箇所の背景色を変更するためのfunction SC_Viewで読み込む public function sfSetErrorStyle() { return 'style="background-color:'.ERR_COLOR.'"'; } // 一致した値のキー名を取得 public function sfSearchKey($array, $word, $default) { foreach ($array as $key => $val) { if ($val == $word) { return $key; } } return $default; } public function sfGetErrorColor($val) { if ($val != '') { return 'background-color:' . ERR_COLOR; } return ''; } public function sfGetEnabled($val) { if (! $val) { return ' disabled="disabled"'; } return ''; } public function sfGetChecked($param, $value) { if ((string) $param === (string) $value) { return 'checked="checked"'; } return ''; } public function sfTrim($str) { $ret = preg_replace("/^[ \n\r]*/u", '', $str); $ret = preg_replace("/[ \n\r]*$/u", '', $ret); return $ret; } /** * 税金額を返す * * ・店舗基本情報に基づいた計算は SC_Helper_DB::sfTax() を使用する * * @param integer $price 計算対象の金額 * @param integer $tax 税率(%単位) * XXX integer のみか不明 * @param integer $tax_rule 端数処理 * @return integer 税金額 */ public function sfTax($price, $tax, $tax_rule) { $real_tax = $tax / 100; $ret = $price * $real_tax; switch ($tax_rule) { // 四捨五入 case 1: $ret = round($ret); break; // 切り捨て case 2: $ret = floor($ret); break; // 切り上げ case 3: $ret = ceil($ret); break; // デフォルト:切り上げ default: $ret = ceil($ret); break; } return $ret; } /** * 税金付与した金額を返す * * ・店舗基本情報に基づいた計算は SC_Helper_DB::sfTax() を使用する * * @param integer $price 計算対象の金額 * @param integer $tax 税率(%単位) * XXX integer のみか不明 * @param integer $tax_rule 端数処理 * @return integer 税金付与した金額 */ public function sfCalcIncTax($price, $tax, $tax_rule) { return $price + SC_Utils_Ex::sfTax($price, $tax, $tax_rule); } // 桁数を指定して四捨五入 public function sfRound($value, $pow = 0) { $adjust = pow(10 ,$pow-1); // 整数且つ0出なければ桁数指定を行う if (SC_Utils_Ex::sfIsInt($adjust) and $pow > 1) { $ret = (round($value * $adjust)/$adjust); } $ret = round($ret); return $ret; } /** * ポイント付与 * $product_id が使われていない。 * @param int $price * @param float $point_rate * @param int $rule * @return int */ public function sfPrePoint($price, $point_rate, $rule = POINT_RULE) { $real_point = $point_rate / 100; $ret = $price * $real_point; switch ($rule) { // 四捨五入 case 1: $ret = round($ret); break; // 切り捨て case 2: $ret = floor($ret); break; // 切り上げ case 3: $ret = ceil($ret); break; // デフォルト:切り上げ default: $ret = ceil($ret); break; } return $ret; } /* 規格分類の件数取得 */ public function sfGetClassCatCount() { $sql = 'select count(dtb_class.class_id) as count, dtb_class.class_id '; $sql.= 'from dtb_class inner join dtb_classcategory on dtb_class.class_id = dtb_classcategory.class_id '; $sql.= 'where dtb_class.del_flg = 0 AND dtb_classcategory.del_flg = 0 '; $sql.= 'group by dtb_class.class_id, dtb_class.name'; $objQuery =& SC_Query_Ex::getSingletonInstance(); $arrList = $objQuery->getAll($sql); // キーと値をセットした配列を取得 $arrRet = SC_Utils_Ex::sfArrKeyValue($arrList, 'class_id', 'count'); return $arrRet; } /** * 商品IDとカテゴリIDから商品規格IDを取得する * @param int $product_id * @param int $classcategory_id1 デフォルト値0 * @param int $classcategory_id2 デフォルト値0 * @return int */ public function sfGetProductClassId($product_id, $classcategory_id1=0, $classcategory_id2=0) { $where = 'product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?'; if (!$classcategory_id1) { //NULLが入ってきた場合への対策 $classcategory_id1 = 0; } if (!$classcategory_id2) { $classcategory_id2 = 0; } $objQuery =& SC_Query_Ex::getSingletonInstance(); $ret = $objQuery->get('product_class_id', 'dtb_products_class', $where, Array($product_id, $classcategory_id1, $classcategory_id2)); return $ret; } /* 文末の「/」をなくす */ public function sfTrimURL($url) { $ret = rtrim($url, '/'); return $ret; } /* DBから取り出した日付の文字列を調整する。*/ public function sfDispDBDate($dbdate, $time = true) { list($y, $m, $d, $H, $M) = preg_split('/[- :]/', $dbdate); if (strlen($y) > 0 && strlen($m) > 0 && strlen($d) > 0) { if ($time) { $str = sprintf('%04d/%02d/%02d %02d:%02d', $y, $m, $d, $H, $M); } else { $str = sprintf('%04d/%02d/%02d', $y, $m, $d, $H, $M); } } else { $str = ''; } return $str; } /* 配列をキー名ごとの配列に変更する */ public function sfSwapArray($array, $isColumnName = true) { $arrRet = array(); foreach ($array as $key1 => $arr1) { if (!is_array($arr1)) continue 1; $index = 0; foreach ($arr1 as $key2 => $val) { if ($isColumnName) { $arrRet[$key2][$key1] = $val; } else { $arrRet[$index++][$key1] = $val; } } } return $arrRet; } /** * 連想配列から新たな配列を生成して返す. * * $requires が指定された場合, $requires に含まれるキーの値のみを返す. * * @param array 連想配列 * @param array 必須キーの配列 * @return array 連想配列の値のみの配列 */ public function getHash2Array($hash, $requires = array()) { $array = array(); $i = 0; foreach ($hash as $key => $val) { if (!empty($requires)) { if (in_array($key, $requires)) { $array[$i] = $val; $i++; } } else { $array[$i] = $val; $i++; } } return $array; } /* かけ算をする(Smarty用) */ public function sfMultiply($num1, $num2) { return $num1 * $num2; } /** * 加算ポイントの計算 * * ・店舗基本情報に基づいた計算は SC_Helper_DB::sfGetAddPoint() を使用する * * @param integer $totalpoint * @param integer $use_point * @param integer $point_rate * @return integer 加算ポイント */ public function sfGetAddPoint($totalpoint, $use_point, $point_rate) { // 購入商品の合計ポイントから利用したポイントのポイント換算価値を引く方式 $add_point = $totalpoint - intval($use_point * ($point_rate / 100)); if ($add_point < 0) { $add_point = '0'; } return $add_point; } /* 一意かつ予測されにくいID */ public function sfGetUniqRandomId($head = '') { // 予測されないようにランダム文字列を付与する。 $random = GC_Utils_Ex::gfMakePassword(8); // 同一ホスト内で一意なIDを生成 $id = uniqid($head); return $id . $random; } // 二回以上繰り返されているスラッシュ[/]を一つに変換する。 public function sfRmDupSlash($istr) { if (preg_match('|^http://|', $istr)) { $str = substr($istr, 7); $head = 'http://'; } elseif (preg_match('|^https://|', $istr)) { $str = substr($istr, 8); $head = 'https://'; } else { $str = $istr; } $str = preg_replace('|[/]+|', '/', $str); $ret = $head . $str; return $ret; } /** * テキストファイルの文字エンコーディングを変換する. * * $filepath に存在するテキストファイルの文字エンコーディングを変換する. * 変換前の文字エンコーディングは, mb_detect_order で設定した順序で自動検出する. * 変換後は, 変換前のファイル名に「enc_」というプレフィクスを付与し, * $out_dir で指定したディレクトリへ出力する * * TODO $filepath のファイルがバイナリだった場合の扱い * TODO fwrite などでのエラーハンドリング * * @access public * @param string $filepath 変換するテキストファイルのパス * @param string $enc_type 変換後のファイルエンコーディングの種類を表す文字列 * @param string $out_dir 変換後のファイルを出力するディレクトリを表す文字列 * @return string 変換後のテキストファイルのパス */ public static function sfEncodeFile($filepath, $enc_type, $out_dir) { $ifp = fopen($filepath, 'r'); // 正常にファイルオープンした場合 if ($ifp !== false) { $basename = basename($filepath); $outpath = $out_dir . 'enc_' . $basename; $ofp = fopen($outpath, 'w+'); while (!feof($ifp)) { $line = fgets($ifp); $line = mb_convert_encoding($line, $enc_type, 'auto'); fwrite($ofp, $line); } fclose($ofp); fclose($ifp); } // ファイルが開けなかった場合はエラーページを表示 else { SC_Utils_Ex::sfDispError(''); exit; } return $outpath; } public function sfCutString($str, $len, $byte = true, $commadisp = true) { if ($byte) { if (strlen($str) > ($len + 2)) { $ret =substr($str, 0, $len); $cut = substr($str, $len); } else { $ret = $str; $commadisp = false; } } else { if (mb_strlen($str) > ($len + 1)) { $ret = mb_substr($str, 0, $len); $cut = mb_substr($str, $len); } else { $ret = $str; $commadisp = false; } } // 絵文字タグの途中で分断されないようにする。 if (isset($cut)) { // 分割位置より前の最後の [ 以降を取得する。 $head = strrchr($ret, '['); // 分割位置より後の最初の ] 以前を取得する。 $tail_pos = strpos($cut, ']'); if ($tail_pos !== false) { $tail = substr($cut, 0, $tail_pos + 1); } // 分割位置より前に [、後に ] が見つかった場合は、[ から ] までを // 接続して絵文字タグ1個分になるかどうかをチェックする。 if ($head !== false && $tail_pos !== false) { $subject = $head . $tail; if (preg_match('/^\[emoji:e?\d+\]$/', $subject)) { // 絵文字タグが見つかったので削除する。 $ret = substr($ret, 0, -strlen($head)); } } } if ($commadisp) { $ret = $ret . '...'; } return $ret; } // 年、月、締め日から、先月の締め日+1、今月の締め日を求める。 public function sfTermMonth($year, $month, $close_day) { $end_year = $year; $end_month = $month; // 該当月の末日を求める。 $end_last_day = date('d', mktime(0, 0, 0, $month + 1, 0, $year)); // 月の末日が締め日より少ない場合 if ($end_last_day < $close_day) { // 締め日を月末日に合わせる $end_day = $end_last_day; } else { $end_day = $close_day; } // 前月の取得 $tmp_year = date('Y', mktime(0, 0, 0, $month, 0, $year)); $tmp_month = date('m', mktime(0, 0, 0, $month, 0, $year)); // 前月の末日を求める。 $start_last_day = date('d', mktime(0, 0, 0, $month, 0, $year)); // 前月の末日が締め日より少ない場合 if ($start_last_day < $close_day) { // 月末日に合わせる $tmp_day = $start_last_day; } else { $tmp_day = $close_day; } // 先月の末日の翌日を取得する $start_year = date('Y', mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year)); $start_month = date('m', mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year)); $start_day = date('d', mktime(0, 0, 0, $tmp_month, $tmp_day + 1, $tmp_year)); // 日付の作成 $start_date = sprintf('%d/%d/%d', $start_year, $start_month, $start_day); $end_date = sprintf('%d/%d/%d 23:59:59', $end_year, $end_month, $end_day); return array($start_date, $end_date); } // 再帰的に多段配列を検索して一次元配列(Hidden引渡し用配列)に変換する。 public function sfMakeHiddenArray($arrSrc, $arrDst = array(), $parent_key = '') { if (is_array($arrSrc)) { foreach ($arrSrc as $key => $val) { if ($parent_key != '') { $keyname = $parent_key . '['. $key . ']'; } else { $keyname = $key; } if (is_array($val)) { $arrDst = SC_Utils_Ex::sfMakeHiddenArray($val, $arrDst, $keyname); } else { $arrDst[$keyname] = $val; } } } return $arrDst; } // DB取得日時をタイムに変換 public function sfDBDatetoTime($db_date) { $date = preg_replace("|\..*$|",'',$db_date); $time = strtotime($date); return $time; } /** * PHPのmb_convert_encoding関数をSmartyでも使えるようにする * * XXX この関数を使っている箇所は、ほぼ設計誤りと思われる。変数にフェッチするか、出力時のエンコーディングで対応すべきと見受ける。 */ public function sfMbConvertEncoding($str, $encode = CHAR_CODE) { return mb_convert_encoding($str, $encode); } // 2つの配列を用いて連想配列を作成する public function sfArrCombine($arrKeys, $arrValues) { if (count($arrKeys) <= 0 and count($arrValues) <= 0) return array(); $keys = array_values($arrKeys); $vals = array_values($arrValues); $max = max( count($keys), count($vals)); $combine_ary = array(); for ($i=0; $i<$max; $i++) { $combine_ary[$keys[$i]] = $vals[$i]; } if (is_array($combine_ary)) return $combine_ary; return false; } /* 階層構造のテーブルから与えられたIDの直属の子を取得する */ public function sfGetUnderChildrenArray($arrData, $pid_name, $id_name, $parent) { $max = count($arrData); $arrChildren = array(); // 子IDを検索する for ($i = 0; $i < $max; $i++) { if ($arrData[$i][$pid_name] == $parent) { $arrChildren[] = $arrData[$i][$id_name]; } } return $arrChildren; } /** * SQLシングルクォート対応 * @deprecated SC_Query::quote() を使用すること */ public function sfQuoteSmart($in) { if (is_int($in) || is_double($in)) { return $in; } elseif (is_bool($in)) { return $in ? 1 : 0; } elseif (is_null($in)) { return 'NULL'; } else { return "'" . str_replace("'", "''", $in) . "'"; } } // ディレクトリを再帰的に生成する public function sfMakeDir($path) { static $count = 0; $count++; // 無限ループ回避 $dir = dirname($path); if (preg_match("|^[/]$|", $dir) || preg_match("|^[A-Z]:[\\]$|", $dir) || $count > 256) { // ルートディレクトリで終了 return; } else { if (is_writable(dirname($dir))) { if (!file_exists($dir)) { mkdir($dir); GC_Utils_Ex::gfPrintLog("mkdir $dir"); } } else { SC_Utils_Ex::sfMakeDir($dir); if (is_writable(dirname($dir))) { if (!file_exists($dir)) { mkdir($dir); GC_Utils_Ex::gfPrintLog("mkdir $dir"); } } } } return; } // ディレクトリ以下のファイルを再帰的にコピー public function sfCopyDir($src, $des, $mess = '', $override = false) { if (!is_dir($src)) { return false; } $oldmask = umask(0); $mod= stat($src); // ディレクトリがなければ作成する if (!file_exists($des)) { if (!mkdir($des, $mod[2])) { echo 'path:' . $des; } } $fileArray=glob($src.'*'); if (is_array($fileArray)) { foreach ($fileArray as $data_) { // CVS管理ファイルはコピーしない if (strpos($data_, '/CVS/Entries') !== false) { break; } if (strpos($data_, '/CVS/Repository') !== false) { break; } if (strpos($data_, '/CVS/Root') !== false) { break; } mb_ereg("^(.*[\/])(.*)",$data_, $matches); $data=$matches[2]; if (is_dir($data_)) { $mess = SC_Utils_Ex::sfCopyDir($data_.'/', $des.$data.'/', $mess); } else { if (!$override && file_exists($des.$data)) { $mess.= $des.$data . ":ファイルが存在します\n"; } else { if (@copy($data_, $des.$data)) { $mess.= $des.$data . ":コピー成功\n"; } else { $mess.= $des.$data . ":コピー失敗\n"; } } $mod=stat($data_); } } } umask($oldmask); return $mess; } /** * ブラウザに強制的に送出する * * @param boolean|string $output 半角スペース256文字+改行を出力するか。または、送信する文字列を指定。 * @return void */ public function sfFlush($output = false, $sleep = 0) { // 出力をバッファリングしない(==日本語自動変換もしない) while (@ob_end_flush()); if ($output === true) { // IEのために半角スペース256文字+改行を出力 //echo str_repeat(' ', 256) . "\n"; echo str_pad('', 256) . "\n"; } elseif ($output !== false) { echo $output; } // 出力をフラッシュする flush(); ob_start(); // 時間のかかる処理 sleep($sleep); } // @versionの記載があるファイルからバージョンを取得する。 public function sfGetFileVersion($path) { if (file_exists($path)) { $src_fp = fopen($path, 'rb'); if ($src_fp) { while (!feof($src_fp)) { $line = fgets($src_fp); if (strpos($line, '@version') !== false) { $arrLine = explode(' ', $line); $version = $arrLine[5]; } } fclose($src_fp); } } return $version; } /** * $array の要素を $arrConvList で指定した方式で mb_convert_kana を適用する. * * @param array $array 変換する文字列の配列 * @param array $arrConvList mb_convert_kana の適用ルール * @return array 変換後の配列 * @see mb_convert_kana */ public function mbConvertKanaWithArray($array, $arrConvList) { foreach ($arrConvList as $key => $val) { if (isset($array[$key])) { $array[$key] = mb_convert_kana($array[$key] ,$val); } } return $array; } /** * 配列の添字が未定義の場合は空文字を代入して定義する. * * @param array $array 添字をチェックする配列 * @param array $defineIndexes チェックする添字 * @return array 添字を定義した配列 */ public function arrayDefineIndexes($array, $defineIndexes) { foreach ($defineIndexes as $key) { if (!isset($array[$key])) $array[$key] = ''; } return $array; } /** * $arrSrc のうち、キーが $arrKey に含まれるものを返す * * $arrSrc に含まない要素は返されない。 * * @param array $arrSrc * @param array $arrKey * @return array */ public static function sfArrayIntersectKeys($arrSrc, $arrKey) { $arrRet = array(); foreach ($arrKey as $key) { if (isset($arrSrc[$key])) $arrRet[$key] = $arrSrc[$key]; } return $arrRet; } /** * 前方互換用 * * @deprecated 2.12.0 GC_Utils_Ex::printXMLDeclaration を使用すること */ public function printXMLDeclaration() { trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING); GC_Utils_Ex::printXMLDeclaration(); } /** * 配列をテーブルタグで出力する。 * * @return string */ public function getTableTag($array) { $html = '
$key | "; } $html.= '
---|
$val | "; } $html.= '