Source for file SC_Utils.php
Documentation is available at SC_Utils.php
* This file is part of EC-CUBE
* Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
* http://www.lockon.co.jp/
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* 主に static 参照するユーティリティ系の関数群
* :XXX: 内部でインスタンスを生成している関数は, Helper クラスへ移動するべき...
* @author LOCKON CO.,LTD.
* @version $Id:SC_Utils.php 15532 2007-08-31 14:39:46Z nanasess $
* データが存在する場合、必ず1以上の数値が設定されている。
* @param $control_id 管理ID
* @return $control_flg フラグ
$target_column = "control_flg";
$table_name = "dtb_site_control";
$where = "control_id = ?";
$arrval = array($control_id);
$objQuery = new SC_Query($dsn, true, true);
$arrSiteControl = $objQuery->select($target_column, $table_name, $where, $arrval);
if (count($arrSiteControl) > 0) {
$control_flg = $arrSiteControl[0]["control_flg"];
$phpself = $_SERVER['PHP_SELF'];
if( !ereg('/install/', $phpself) ) {
header('Location: ' . $install_url);
$path = HTML_PATH . "install/index.php";
* インストーラのパスを検索し, URL を返す.
* $path と同階層に install/index.php があるか検索する.
* インストーラのパスが見つかった場合は, その URL を返す.
* DocumentRoot まで検索しても見つからない場合は /install/index.php を返す.
* @param string $path 検索対象のパス
* @return string インストーラの URL
$installer = 'install/index.php';
$host = $proto . $_SERVER['SERVER_NAME'];
return $host . $path . $installer;
if (substr($path, - 1, 1) != '/') {
$installer_url = $host . $path . $installer;
if ($resources === false) {
* 相対パスで記述された URL から絶対パスの URL を取得する.
* この関数は, http(s):// から始まる URL を解析し, 相対パスで記述されていた
* http://www.example.jp/aaa/../index.php
* http://www.example.jp/index.php
* @param string $url http(s):// から始まる URL
* @return string $url を絶対パスに変換した URL
$tmp = split('/', $parse['path']);
if ($v == '' || $v == '.') {
$path = join('/', $results);
return $parse['scheme'] . '://' . $parse['host'] . '/' . $path;
$GLOBAL_ERR.= "<div style='color: #F00; font-weight: bold; font-size: 12px;"
. "background-color: #FEB; text-align: center; padding: 5px;'>";
require_once(CLASS_EX_PATH . "page_extends/error/LC_Page_Error_DispError_Ex.php");
$objPage = new LC_Page_Error_DispError_Ex();
function sfDispSiteError($type, $objSiteSess = "", $return_top = false, $err_msg = "", $is_mobile = false) {
require_once(CLASS_EX_PATH . "page_extends/error/LC_Page_Error_Ex.php");
$objPage = new LC_Page_Error_Ex();
$objPage->objSiteSess = $objSiteSess;
$objPage->return_top = $return_top;
$objPage->err_msg = $err_msg;
$objPage->is_mobile = (defined('MOBILE_SITE')) ? true : false;
$ret = $objSess->IsSuccess();
// リファラーチェック(CSRFの暫定的な対策)
// 「リファラ有」 かつ 「管理画面からの遷移でない」 場合にエラー画面を表示する
if ( empty($_SERVER['HTTP_REFERER']) ) {
// sfErrorHeader('>> referrerが無効になっています。');
$pattern = sprintf('|^%s.*|', $domain);
$referer = $_SERVER['HTTP_REFERER'];
// 管理画面から以外の遷移の場合はエラー画面を表示
* @param string $passlen 変換する文字列
* @return string アスタリスクへ変換した文字列
for ($i= 0;$i< $passlen;true){
// HTTPS時には$_SERVER['HTTPS']には空でない値が入る
// $_SERVER['HTTPS'] != 'off' はIIS用
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
* 前画面でuniqidを埋め込んでおく必要がある
* @param obj SC_Session, SC_SiteSession
// 前画面からPOSTされるuniqidが正しいものかどうかをチェック
$uniqid = $objSess->getUniqId();
if ( !empty($_POST['uniqid']) && ($_POST['uniqid'] === $uniqid) ) {
/* 前のページで正しく登録が行われたか判定 */
function sfIsPrePage(&$objSiteSess, $is_mobile = false) {
$ret = $objSiteSess->isPrePage();
$uniqid = $objSiteSess->getUniqId();
// 購入ボタンを押した時のカート内容がコピーされていない場合のみコピーする。
$objCartSess->saveCurrentCart($uniqid);
// POSTのユニークIDとセッションのユニークIDを比較(ユニークIDがPOSTされていない場合はスルー)
$ret = $objSiteSess->checkUniqId();
SC_Utils_Ex::sfDispSiteError(CANCEL_PURCHASE, $objSiteSess);
// カート内が空でないか || 購入ボタンを押してから変化がないか
$quantity = $objCartSess->getTotalQuantity();
$ret = $objCartSess->checkChangeCart();
if($ret == true || !($quantity > 0)) {
// FIXME false を返して, Page クラスで遷移させるべき...
header("Location: ". MOBILE_URL_CART_TOP
header("Location: ". URL_CART_TOP);
if($year != "" && $month != "" && $day != "") {
$date = $year. "-". $month. "-". $day. " ". $time;
$file_name = $dir_name . date("ymdHis") . ".csv";
$file_name = $prefix . date("ymdHis") . ".csv";
Header("Content-disposition: attachment; filename=${file_name}");
Header("Content-type: application/octet-stream; name=${file_name}");
Header("Cache-Control: ");
if (mb_internal_encoding() == CHAR_CODE){
$data = mb_convert_encoding($data,'SJIS-Win',CHAR_CODE);
$path = $_SERVER['PHP_SELF'];
$arrVal = split("/", $path);
return $arrVal[($cnt - 2)];
* @deprecated LC_Page::reload() を使用して下さい.
if ($_SERVER["SERVER_PORT"] == "443" ){
header("Location: ". $url . $_SERVER['PHP_SELF'] . "?" . $get);
header("Location: ". $url . $_SERVER['PHP_SELF']);
for($cnt = 1; $cnt <= $max; $cnt++ ) {
if ($_POST[$keyname . $cnt] == "1") {
// html_checkboxesの値をマージして2進数形式に変更する。
foreach($array as $val) {
for($i = 1; $i <= $max; $i++ ) {
if(isset ($arrTmp[$i]) && $arrTmp[$i] == "1") {
// html_checkboxesの値をマージして「-」でつなげる。
foreach($array as $val) {
// html_checkboxesの値をマージしてSQL検索用に変更する。
foreach($array as $val) {
for($i = 1; $i <= $max; $i++ ) {
// 2進数形式の値をhtml_checkboxes対応の値に切り替える
for($i = 0; $i < $len; $i++ ) {
if(substr($val, $i, 1) == "1") {
for($cnt = 1; $cnt <= $max; $cnt++ ) {
if ($_POST[$keyname . $cnt] == "1") {
for ($cnt = 0; $cnt < $len; $cnt++ ) {
$arr[$keyname . $no] = substr($val, $cnt, 1);
$arr[] = substr($val, $cnt, 1);
function sfArrKeyValue($arrList, $keyname, $valname, $len_max = "", $keysize = "") {
if($len_max != "" && $max > $len_max) {
for($cnt = 0; $cnt < $max; $cnt++ ) {
$key = $arrList[$cnt][$keyname];
$val = $arrList[$cnt][$valname];
if(!isset ($arrRet[$key])) {
// キーと値をセットした配列を取得(値が複数の場合)
function sfArrKeyValues($arrList, $keyname, $valname, $len_max = "", $keysize = "", $connect = "") {
if($len_max != "" && $max > $len_max) {
for($cnt = 0; $cnt < $max; $cnt++ ) {
$key = $arrList[$cnt][$keyname];
$val = $arrList[$cnt][$valname];
$arrRet[$key].= "$val". $connect;
foreach($array as $val) {
/* 配列の要素をCSVフォーマットで出力する。*/
foreach($array as $key => $val) {
$val = mb_convert_encoding($val, CHAR_CODE, CHAR_CODE);
$line .= "\"". $val. "\",";
/* 配列の要素をPDFフォーマットで出力する。*/
foreach($array as $key => $val) {
/*-----------------------------------------------------------------*/
/* 年月日に別れた2つの期間の妥当性をチェックし、整合性と期間を返す
/* 引数 (開始年,開始月,開始日,終了年,終了月,終了日)
/* 1.開始年月日 (YYYY/MM/DD 000000)
/* 2.終了年月日 (YYYY/MM/DD 235959)
/* 3.エラー ( 0 = OK, 1 = NG )
/*-----------------------------------------------------------------*/
function sfCheckSetTerm ( $start_year, $start_month, $start_day, $end_year, $end_month, $end_day ) {
if ( $start_month || $start_day || $start_year){
if ( ! checkdate($start_month, $start_day , $start_year) ) $error = 1;
if ( $end_month || $end_day || $end_year){
if ( ! checkdate($end_month ,$end_day ,$end_year) ) $error = 2;
$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;
return array($date1, $date2, $error);
// エラー箇所の背景色を変更するためのfunction SC_Viewで読み込む
return 'style="background-color:'. ERR_COLOR. '"';
* 10桁以上はオーバーフローエラーを起こすので。
foreach($array as $key => $val) {
return "background-color:" . ERR_COLOR;
return " disabled=\"disabled\"";
return "checked=\"checked\"";
$ret = mb_ereg_replace("^[ \n\r]*", "", $str);
$ret = mb_ereg_replace("[ \n\r]*$", "", $ret);
function sfTax($price, $tax = null, $tax_rule = null) {
$CONF = SC_Helper_DB_Ex::sf_getBasisData();
$tax_rule = $CONF['tax_rule'];
$ret = $price * $real_tax;
function sfPreTax($price, $tax = null, $tax_rule = null) {
return $price + SC_Utils_Ex::sfTax($price, $tax, $tax_rule);
function sfRound($value, $pow = 0){
$adjust = pow(10 ,$pow- 1);
$ret = (round($value * $adjust)/ $adjust);
function sfPrePoint($price, $point_rate, $rule = POINT_RULE, $product_id = "") {
$where = "now() >= cast(start_date as date) AND ";
$where .= "now() < cast(end_date as date) AND ";
$where .= "del_flg = 0 AND campaign_id IN (SELECT campaign_id FROM dtb_campaign_detail where product_id = ? )";
$objQuery->setOrder('update_date DESC');
$arrRet = $objQuery->select("campaign_name, campaign_point_rate", "dtb_campaign", $where, array($product_id));
//複数のキャンペーンに登録されている商品は、最新のキャンペーンからポイントを取得
if(isset ($arrRet[0]['campaign_point_rate'])
&& $arrRet[0]['campaign_point_rate'] != "") {
$campaign_point_rate = $arrRet[0]['campaign_point_rate'];
$real_point = $campaign_point_rate / 100;
$real_point = $point_rate / 100;
$ret = $price * $real_point;
if(isset ($campaign_point_rate) && $campaign_point_rate != "") {
$ret = "(". $arrRet[0]['campaign_name']. "ポイント率". $campaign_point_rate. "%)". $ret;
$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";
$arrList = $objQuery->getAll($sql);
// すでに規格登録があるかどうかをチェックする。
$where = "product_id = ? AND classcategory_id1 <> 0 AND classcategory_id1 <> 0";
$count = $objQuery->count("dtb_products_class", $where, array($product_id));
$where = "product_id = ?";
$objQuery->delete("dtb_products_class", $where, array($product_id));
$checkArray = array("product_code", "stock", "stock_unlimited", "price01", "price02");
$arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray);
$sqlval['product_id'] = $product_id;
if(strlen($product_class_id ) > 0 ){
$sqlval['product_class_id'] = $product_class_id;
$sqlval['classcategory_id1'] = '0';
$sqlval['classcategory_id2'] = '0';
$sqlval['product_code'] = $arrList["product_code"];
$sqlval['stock'] = $arrList["stock"];
$sqlval['stock_unlimited'] = $arrList["stock_unlimited"];
$sqlval['price01'] = $arrList['price01'];
$sqlval['price02'] = $arrList['price02'];
$sqlval['creator_id'] = $_SESSION['member_id'];
$sqlval['create_date'] = "now()";
if($_SESSION['member_id'] == "") {
$sqlval['creator_id'] = '0';
$objQuery->insert("dtb_products_class", $sqlval);
$where = "product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?";
$ret = $objQuery->get("dtb_products_class", "product_class_id", $where, Array($product_id, $classcategory_id1, $classcategory_id2));
/* DBから取り出した日付の文字列を調整する。*/
list ($y, $m, $d, $H, $M) = split("[- :]", $dbdate);
$str = sprintf("%04d/%02d/%02d %02d:%02d", $y, $m, $d, $H, $M);
$str = sprintf("%04d/%02d/%02d", $y, $m, $d, $H, $M);
for($i = 0; $i < $max; $i++ ) {
foreach($array[$i] as $key => $val) {
* $requires が指定された場合, $requires に含まれるキーの値のみを返す.
* @return array 連想配列の値のみの配列
foreach ($hash as $key => $val) {
function sfGetAuthonlyResult($dir, $file_name, $name01, $name02, $card_no, $card_exp, $amount, $order_id, $jpo_info = "10"){
$path = $dir . $file_name; // cgiファイルのフルパス生成
$now_dir = getcwd(); // requireがうまくいかないので、cgi実行ディレクトリに移動する
$cmd = "$path card_no=$card_no name01=$name01 name02=$name02 card_exp=$card_exp amount=$amount order_id=$order_id jpo_info=$jpo_info";
$tmpResult = popen($cmd, "r");
while( ! FEOF ( $tmpResult ) ) {
$result .= FGETS($tmpResult);
pclose($tmpResult); // パイプを閉じる
chdir($now_dir); // 元にいたディレクトリに帰る
foreach (explode("&",$result) as $data) {
list ($key, $val) = explode("=", $data, 2);
if( USE_POINT === false ) return ;
// 購入商品の合計ポイントから利用したポイントのポイント換算価値を引く方式
$add_point = $totalpoint - intval($use_point * ($arrInfo['point_rate'] / 100));
// 予測されないようにランダム文字列を付与する。
$random = GC_Utils_Ex::gfMakePassword(8);
$sql = "SELECT name, main_image, main_list_image, price01_min, price01_max, price02_min, price02_max, point_rate,
A.product_id, A.comment FROM dtb_best_products as A LEFT JOIN vw_products_allclass AS allcls
USING (product_id) WHERE A.category_id = ? AND A.del_flg = 0 AND status = 1 ORDER BY A.rank";
$arrItems = $conn->getAll($sql, array($category_id));
if (DB_TYPE == "pgsql") {
$ret = pg_escape_string($data);
}else if(DB_TYPE == "mysql"){
$ret = mysql_real_escape_string($data);
if (DB_TYPE == "pgsql") {
$ret = pg_escape_string($val);
}else if(DB_TYPE == "mysql"){
$ret = mysql_real_escape_string($val);
* 共有SSL対応のための修正により、この関数は廃止します。
* セッションはrequire.phpを読み込んだ際に開始されます。
* 2.1.1ベータからはSC_SessionFactory_UseCookie::initSession()で処理するため、
if (defined('SESSION_KEEP_METHOD')) {
if (!ini_get("session.auto_start")) {
if(strlen($line[$cnt]) > $size) {
// 二回以上繰り返されているスラッシュ[/]を一つに変換する。
if(ereg("^http://", $istr)) {
} else if(ereg("^https://", $istr)) {
* テキストファイルの文字エンコーディングを変換する.
* $filepath に存在するテキストファイルの文字エンコーディングを変換する.
* 変換前の文字エンコーディングは, mb_detect_order で設定した順序で自動検出する.
* 変換後は, 変換前のファイル名に「enc_」というプレフィクスを付与し,
* $out_dir で指定したディレクトリへ出力する
* TODO $filepath のファイルがバイナリだった場合の扱い
* TODO fwrite などでのエラーハンドリング
* @param string $filepath 変換するテキストファイルのパス
* @param string $enc_type 変換後のファイルエンコーディングの種類を表す文字列
* @param string $out_dir 変換後のファイルを出力するディレクトリを表す文字列
* @return string 変換後のテキストファイルのパス
$ifp = fopen($filepath, "r");
$outpath = $out_dir . "enc_" . $basename;
$ofp = fopen($outpath, "w+");
$line = mb_convert_encoding($line, $enc_type, "auto");
// ファイルが開けなかった場合はエラーページを表示
function sfCutString($str, $len, $byte = true, $commadisp = true) {
if(strlen($str) > ($len + 2)) {
if(mb_strlen($str) > ($len + 1)) {
$ret = mb_substr($str, 0, $len);
$cut = mb_substr($str, $len);
// 分割位置より前の最後の [ 以降を取得する。
// 分割位置より後の最初の ] 以前を取得する。
$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)) {
// 年、月、締め日から、先月の締め日+1、今月の締め日を求める。
$end_last_day = date("d", mktime(0, 0, 0, $month + 1, 0, $year));
if($end_last_day < $close_day) {
$end_day = $end_last_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;
$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 00:00:00", $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);
return array($r, $g, $b);
$objConn = new SC_DBConn();
$arrRegistMailMagazine["mail_flag"] = $mail_flag;
$arrRegistMailMagazine["email"] = $email;
$arrRegistMailMagazine["temp_id"] = $random_id;
$arrRegistMailMagazine["end_flag"]= '0';
$arrRegistMailMagazine["update_date"] = 'now()';
$flag = $objQuery->count("dtb_customer_mail_temp", "email=?", array($email));
$objConn->query("BEGIN");
$objConn->autoExecute("dtb_customer_mail_temp",$arrRegistMailMagazine);
$objConn->autoExecute("dtb_customer_mail_temp",$arrRegistMailMagazine, "email = " . SC_Utils::sfQuoteSmart($email));
$objConn->query("COMMIT");
$subject = sfMakeSubject('メルマガ仮登録が完了しました。');
$objPage->tpl_url = SSL_URL. "mailmagazine/regist.php?temp_id=". $arrRegistMailMagazine['temp_id'];
$objPage->tpl_name = "登録";
$objPage->tpl_kindname = "HTML";
$objPage->tpl_name = "登録";
$objPage->tpl_kindname = "テキスト";
$objPage->tpl_name = "解除";
$objPage->tpl_email = $email;
sfSendTplMail($email, $subject, 'mail_templates/mailmagazine_temp.tpl', $objPage);
// 再帰的に多段配列を検索して一次元配列(Hidden引渡し用配列)に変換する。
foreach($arrSrc as $key => $val) {
$keyname = $parent_key . "[". $key . "]";
$arrDst[$keyname] = $val;
* @deprecated 2008/04/02以降使用不可
$basename = basename($_SERVER["REQUEST_URI"]);
$path = $_SERVER["REQUEST_URI"] . "index.php";
$path = $_SERVER["REQUEST_URI"];
if(isset ($_GET['tpl']) && $_GET['tpl'] != "") {
$tpl_name = $_GET['tpl'];
$tpl_name = ereg_replace("(\.php$|\.html$)", ".tpl", $tpl_name);
$template_path = TEMPLATE_FTP_DIR . $tpl_name;
if($is_mobile === true) {
$objView->assignobj($objPage);
$objView->display(SITE_FRAME);
$objView = new SC_UserView(TEMPLATE_FTP_DIR, COMPILE_FTP_DIR);
$objView->assignobj($objPage);
$objView->display($tpl_name);
$objView->assignobj($objPage);
$objView->display(SITE_FRAME);
// PHPのmb_convert_encoding関数をSmartyでも使えるようにする
return mb_convert_encoding($str, $encode);
// PHPのmktime関数をSmartyでも使えるようにする
function sf_mktime($format, $hour= 0, $minute= 0, $second= 0, $month= 1, $day= 1, $year= 1999) {
return date($format,mktime($hour, $minute, $second, $month, $day, $year));
// PHPのdate関数をSmartyでも使えるようにする
function sf_date($format, $timestamp = '') {
return date( $format, $timestamp);
if(count($arrKeys) <= 0 and count($arrValues) <= 0) return array();
for($i= 0; $i< $max; $i++ ) {
$combine_ary[$keys[$i]] = $vals[$i];
if(is_array($combine_ary)) return $combine_ary;
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$id_name] == $child) {
$parent = $arrData[$i][$pid_name];
/* 階層構造のテーブルから与えられたIDの兄弟を取得する */
foreach($arrPID as $id) {
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$id_name] == $id) {
$parent = $arrData[$i][$pid_name];
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$pid_name] == $parent) {
$arrBrothers[] = $arrData[$i][$id_name];
/* 階層構造のテーブルから与えられたIDの直属の子を取得する */
for($i = 0; $i < $max; $i++ ) {
if($arrData[$i][$pid_name] == $parent) {
$arrChildren[] = $arrData[$i][$id_name];
if(ereg("^[/]$", $dir) || ereg("^[A-Z]:[\\]$", $dir) || $count > 256) {
function sfCopyDir($src, $des, $mess = "", $override = false){
if(!mkdir($des, $mod[2])) {
$fileArray= glob( $src. "*" );
foreach( $fileArray as $key => $data_ ){
if(ereg("/CVS/Entries", $data_)) {
if(ereg("/CVS/Repository", $data_)) {
if(ereg("/CVS/Root", $data_)) {
mb_ereg("^(.*[\/])(.*)",$data_, $matches);
$mess.= $des. $data . ":ファイルが存在します\n";
if(@copy( $data_, $des. $data)) {
$mess.= $des. $data . ":コピー成功\n";
$mess.= $des. $data . ":コピー失敗\n";
if ($file == "." or $file == "..") continue;
$del_file = $dir . "/" . $file;
$ret = unlink($dir . "/" . $file);
* 戻り値:結果フラグ 成功なら true 失敗なら false
function sfWriteFile($str, $path, $type, $permission = "") {
if (!($file = fopen ($path, $type))) {
chmod($path, $permission);
function sfFlush($output = " ", $sleep = 0){
// 出力をバッファリングしない(==日本語自動変換もしない)
// @versionの記載があるファイルからバージョンを取得する。
$src_fp = fopen($path, "rb");
if(ereg("@version", $line)) {
$arrLine = split(" ", $line);
// 指定したURLに対してPOSTでデータを送信する
require_once(DATA_PATH . "module/Request.php");
$req = new HTTP_Request($url);
$req->addHeader('User-Agent', 'DoCoMo/2.0 P2101V(c100)');
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostDataArray($arrData);
if (!PEAR::isError($req->sendRequest())) {
$res_code = $req->getResponseCode();
$response = $req->getResponseBody();
* $array の要素を $arrConvList で指定した方式で mb_convert_kana を適用する.
* @param array $array 変換する文字列の配列
* @param array $arrConvList mb_convert_kana の適用ルール
foreach ($arrConvList as $key => $val) {
if(isset ($array[$key])) {
$array[$key] = mb_convert_kana($array[$key] ,$val);
* 配列の添字が未定義の場合は空文字を代入して定義する.
* @param array $array 添字をチェックする配列
* @param array $defineIndexes チェックする添字
* @return array 添字を定義した配列
foreach ($defineIndexes as $key) {
if (!isset ($array[$key])) $array[$key] = "";
* XML宣言があると問題が発生する UA は出力しない.
* @return string XML宣言の文字列
$ua = $_SERVER['HTTP_USER_AGENT'];
print ("<?xml version='1.0' encoding='" . CHAR_CODE . "'?>\n");
while (($file = readdir($dh)) !== false) $arrDir[] = $file;
foreach($arrDir as $file) {
if($file != "." && $file != "..") {
// SELECT内の見た目を整えるため指定文字数で切る
$arrDirList[$cnt]['file_name'] = $file;
$arrDirList[$cnt]['file_path'] = $path;
$arrDirList[$cnt]['file_size'] = $file_size;
$arrDirList[$cnt]['file_time'] = $file_time;
$arrDirList[$cnt]['is_dir'] = true;
$arrFileList[$cnt]['file_name'] = $file;
$arrFileList[$cnt]['file_path'] = $path;
$arrFileList[$cnt]['file_size'] = $file_size;
$arrFileList[$cnt]['file_time'] = $file_time;
$arrFileList[$cnt]['is_dir'] = false;
if ($file != '..' && $file != '.' && !is_dir($path)) {
} else if (is_dir($path) && $file != '..' && $file != '.') {
// 下層ファイルのバイト数を取得する為、再帰的に呼び出す。
// ディレクトリ(ファイル)が存在しない場合は0byteを返す
if($bytes == "") $bytes = 0;
while (false !== ($item = readdir($handle))) {
if ($item != "." && $item != "..") {
$arrResult[$cnt]['result'] = @unlink("$dir/$item");
$arrResult[$cnt]['file_name'] = "$dir/$item";
$arrResult[$cnt]['result'] = @rmdir($dir);
$arrResult[$cnt]['file_name'] = "$dir/$item";
$arrResult[0]['result'] = @unlink("$dir");
$arrResult[0]['file_name'] = "$dir";
* 説明 :ツリー生成用配列取得(javascriptに渡す用)
* 引数2 :現在のツリーの状態開いているフォルダのパスが | 区切りで格納
$arrTree[$cnt]['type'] = "_parent";
$arrTree[$cnt]['type'] = "_child";
$arrTree[$cnt]['path'] = $dir;
$arrTree[$cnt]['rank'] = 0;
$arrTree[$cnt]['count'] = $cnt;
if($_POST['mode'] != '') {
$arrTree[$cnt]['open'] = true;
* 説明 :ツリー生成用配列取得(javascriptに渡す用)
* 引数2 :デフォルトの階層(/区切りで 0,1,2・・・とカウント)
* 引数4 :現在のツリーの状態開いているフォルダのパスが | 区切りで格納
function sfGetFileTreeSub($dir, $default_rank, &$cnt, &$arrTree, $tree_status) {
while (false !== ($item = readdir($handle))) $arrDir[] = $item;
foreach($arrDir as $item) {
if ($item != "." && $item != "..") {
$arrTree[$cnt]['path'] = $path;
$arrTree[$cnt]['type'] = "_parent";
$arrTree[$cnt]['type'] = "_child";
$arrCnt = split('/', $path);
$arrTree[$cnt]['rank'] = $rank - $default_rank + 1;
$arrTree[$cnt]['count'] = $cnt;
* 説明 :指定したディレクトリ配下にファイルがあるか
if ($file != '..' && $file != '.' && is_dir($path)) {
* 説明 :指定したファイルが前回開かれた状態にあったかチェック
* 引数2 :現在のツリーの状態開いているフォルダのパスが | 区切りで格納
$arrTreeStatus = split('\|', $tree_status);
Header("Content-disposition: attachment; filename=". basename($file));
Header("Content-type: application/octet-stream; name=". basename($file));
Header("Cache-Control: ");
$ret = @mkdir($file, $mode);
$fp = @fopen($filename, "rb" );
for ($i = 0; $i < count($array); $i++ ){
for ($j = 0; $j < count($arrayIndex); $j++ ){
if ( $j > 0 ) $return .= ",";
$return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$arrayIndex[$j]] )) . "\"";
for ($j = 0; $j < count($array[$i]); $j++ ){
if ( $j > 0 ) $return .= ",";
$return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$j] )) . "\"";
foreach($array[0] as $key => $val) {
for($i = 0; $i < $cnt; $i++ ) {
foreach($array[$i] as $val) {
* 出力バッファをフラッシュし, バッファリングを開始する.
/* デバッグ用 ------------------------------------------------------------------------------------------------*/
print ("<div style='font-size: 12px;color: #00FF00;'>\n");
print ("<strong>**デバッグ中**</strong><br />\n");
print ("<strong>**デバッグ中**</strong></div>\n");
Documentation generated on Fri, 24 Feb 2012 14:00:27 +0900 by Seasoft
|