Changeset 19752


Ignore:
Timestamp:
2010/12/20 08:53:26 (11 years ago)
Author:
AMUAMU
Message:

#781 (規格のデータベースを木構造に)により動作していなかった商品CSVアップロード機能を全面見直し修正。
#657 (CSVダウンロードの改善) の商品ダウンロードに関する部分の再修正。
#582 (#250(管理画面の商品CSV出力で規格名1、規格名2、カテゴリIDが強制出力される) による不具合) の修正
#850 (顧客CSV 列追加時にロジックの変更を不要に) の準備修正
#849 (LC_Page_Admin_Products_UploadCSV パラメータを無視) の解決

Location:
branches/version-2_5-dev/data/class
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_5-dev/data/class/SC_FormParam.php

    r18777 r19752  
    105105 
    106106            if($find) { 
    107                 $this->html_disp_name[$cnt] = $this->disp_name[$cnt] . "<span class='red'>(※ 必須)</span>"; 
     107                $this->html_disp_name[$cnt] = $this->disp_name[$cnt] . '<span class="red">(※ 必須)</span>'; 
    108108            } else { 
    109109                $this->html_disp_name[$cnt] = $this->disp_name[$cnt]; 
     110            } 
     111            if($this->default[$cnt] != "") { 
     112                $this->html_disp_name[$cnt] .= ' [省略時初期値: ' . $this->default[$cnt] . ']'; 
     113            } 
     114            if($this->input_db[$cnt] == false) { 
     115                $this->html_disp_name[$cnt] .= ' [登録・更新不可] '; 
    110116            } 
    111117            $cnt++; 
  • branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php

    r19746 r19752  
    6262     * @param string $where SQL の WHERE 句 
    6363     * @param array $arrVal WHERE 句の要素 
     64     * @param array $order SQL の ORDER BY 句 
    6465     * @return array CSV 項目の配列 
    6566     */ 
    66     function sfgetCsvOutput($csv_id = "", $where = '0=0', $arrVal = array()){ 
    67         $objQuery = new SC_Query(); 
    68         $ret = array(); 
    69  
    70         $sql = <<< __EOS__ 
    71             SELECT 
    72                 no, 
    73                 csv_id, 
    74                 col, 
    75                 disp_name, 
    76                 rank, 
    77                 status, 
    78                 create_date, 
    79                 update_date, 
    80                 mb_convert_kana_option 
    81             FROM 
    82                 dtb_csv 
    83 __EOS__; 
    84  
    85         if (strlen($csv_id) >= 1) { 
    86             $where = "($where) AND csv_id = ?"; 
     67    function sfgetCsvOutput($csv_id = "", $where = '', $arrVal = array(), $order = 'rank, no'){ 
     68        $objQuery =& SC_Query::getSingletonInstance(); 
     69         
     70        $cols = 'no, csv_id, col, disp_name, rank, status, rw_flg, mb_convert_kana_option, size_const_type, error_check_types'; 
     71        $table = 'dtb_csv'; 
     72         
     73        if(SC_Utils_Ex::sfIsInt($csv_id)){ 
     74            if($where == "") { 
     75                $where = "csv_id = ?"; 
     76            }else{ 
     77                $where = "$where AND csv_id = ?"; 
     78            } 
    8779            $arrVal[] = $csv_id; 
    8880        } 
    89  
    90         if (strlen($where) >= 1) { 
    91             $sql .= " WHERE $where"; 
    92         } 
    93  
    94         $sql .= " ORDER BY "; 
    95         $sql .= "     rank , no"; 
    96         $sql .= " "; 
    97  
    98         $ret = $objQuery->getAll($sql, $arrVal); 
    99  
    100         return $ret; 
     81        $objQuery->setOrder($order); 
     82         
     83        $arrRet = $objQuery->select($cols, $table, $where, $arrVal); 
     84        return $arrRet; 
    10185    } 
    10286 
     
    121105    } 
    122106     
     107    /** 
     108     * CSVが出力設定でインポート可能かのチェック 
     109     * 
     110     * @param array sfgetCsvOutputで取得した内容(またはそれと同等の配列) 
     111     * @return boolean true:インポート可能、false:インポート不可 
     112     */ 
     113    function sfIsImportCSVFrame(&$arrCSVFrame) { 
     114        $result = true; 
     115        foreach($arrCSVFrame as $key => $val) { 
     116            if($val['status'] != "1" 
     117                    and $val['rw_flg'] == "1" 
     118                    and $val['error_check_types'] != "" 
     119                    and stripos($val['error_check_types'], "EXIST_CHECK") !== FALSE) { 
     120                //必須フィールド 
     121                $result = false; 
     122            } 
     123        } 
     124        return $result; 
     125    } 
     126     
     127    /** 
     128     * CSVが出力設定で更新可能かのチェック 
     129     * 
     130     * @param array sfgetCsvOutputで取得した内容(またはそれと同等の配列) 
     131     * @return boolean true:更新可能、false:新規追加のみ不可 
     132     */ 
     133    function sfIsUpdateCSVFrame(&$arrCSVFrame) { 
     134        $result = true; 
     135        foreach($arrCSVFrame as $key => $val) { 
     136            if($val['status'] != "1" 
     137                    and $val['rw_flg'] == "3") { 
     138                //キーフィールド 
     139                $result = false; 
     140            } 
     141        } 
     142        return $result; 
     143    } 
     144     
     145    /** 
     146     * CSVファイルのカウント数を得る. 
     147     * 
     148     * @param resource $fp fopenを使用して作成したファイルポインタ 
     149     * @return integer CSV のカウント数 
     150     */ 
     151    function sfGetCSVRecordCount($fp) { 
     152 
     153        $count = 0; 
     154        while(!feof($fp)) { 
     155            $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
     156            $count++; 
     157        } 
     158        // ファイルポインタを戻す 
     159        if (rewind($fp)) { 
     160            return $count-1; 
     161        } else { 
     162            return FALSE; 
     163        } 
     164    } 
     165 
    123166    //  CSV作成 コールバック関数 
    124167    function cbOutputProductCSV($data) { 
     
    140183        $arrOutputCols = $arrOutput['col']; 
    141184 
    142         $objQuery = new SC_Query(); 
     185        $objQuery =& SC_Query::getSingletonInstance(); 
    143186        $objQuery->setOrder($order); 
    144187         
    145188        $objProduct = new SC_Product(); 
    146189        $cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true); 
    147         $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL(),$where); 
     190        // このWhereを足さないと無効な規格も出力される。現行仕様と合わせる為追加。 
     191        $inner_where = 'dtb_products_class.del_flg = 0'; 
     192        $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL($inner_where),$where); 
    148193        $header = $this->sfArrayToCSV($arrOutput['disp_name']); 
    149194        $header = mb_convert_encoding($header, 'SJIS-Win'); 
     
    182227        $cols = SC_Utils_Ex::sfGetCommaList($this->arrREVIEW_CVSCOL); 
    183228 
    184         $objQuery = new SC_Query(); 
     229        $objQuery =& SC_Query::getSingletonInstance(); 
    185230        $objQuery->setOption($option); 
    186231 
     
    201246        $cols = SC_Utils_Ex::sfGetCommaList($this->arrTRACKBACK_CVSCOL); 
    202247 
    203         $objQuery = new SC_Query(); 
     248        $objQuery =& SC_Query::getSingletonInstance(); 
    204249        $objQuery->setOption($option); 
    205250 
     
    223268        $arrOutputCols = $arrOutput['col']; 
    224269 
    225         $objQuery = new SC_Query(); 
     270        $objQuery =& SC_Query::getSingletonInstance(); 
    226271        $objQuery->setOrder('rank DESC'); 
    227272 
     
    254299        $cols = SC_Utils_Ex::sfGetCommaList($arrCsvOutputCols); 
    255300 
    256         $objQuery = new SC_Query(); 
     301        $objQuery =& SC_Query::getSingletonInstance(); 
    257302        $objQuery->setOption($option); 
    258303 
  • branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php

    r19670 r19752  
    2424// {{{ requires 
    2525require_once(CLASS_PATH . "pages/admin/LC_Page_Admin.php"); 
     26require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_CSV_Ex.php"); 
    2627 
    2728/** 
     
    4445    /** SC_UploadFile インスタンス */ 
    4546    var $objUpfile; 
     47     
     48    /** TAGエラーチェックフィールド情報 */ 
     49    var $arrTagCheckItem; 
     50     
     51    /** 商品テーブルカラム情報 (登録処理用) **/ 
     52    var $arrProductColumn; 
     53     
     54    /** 商品規格テーブルカラム情報 (登録処理用) **/ 
     55    var $arrProductClassColumn; 
     56 
     57    /** 登録フォームカラム情報 **/ 
     58    var $arrFormKeyList; 
    4659 
    4760    /** 
     
    5770        $this->tpl_subno = 'upload_csv'; 
    5871        $this->tpl_subtitle = '商品登録CSV'; 
     72        $this->csv_id = '1'; 
     73 
     74        $masterData = new SC_DB_MasterData_Ex(); 
     75        $this->arrDISP = $masterData->getMasterData("mtb_disp"); 
     76        $this->arrSTATUS = $masterData->getMasterData("mtb_status"); 
     77        $this->arrDELIVERYDATE = $masterData->getMasterData("mtb_delivery_date"); 
     78        $this->arrProductType = $masterData->getMasterData("mtb_product_type"); 
     79        $this->arrMaker = SC_Helper_DB_Ex::sfGetIDValueList("dtb_maker", "maker_id", "name"); 
     80        $this->arrPayments = SC_Helper_DB_Ex::sfGetIDValueList("dtb_payment", "payment_id", "payment_method");            $this->arrAllowedTag = $masterData->getMasterData("mtb_allowed_tag"); 
     81        $this->arrTagCheckItem = array(); 
    5982    } 
    6083 
     
    7699    function action() { 
    77100        $objSess = new SC_Session(); 
    78         $objDb = new SC_Helper_DB_Ex(); 
     101        $this->objDb = new SC_Helper_DB_Ex(); 
    79102        $objView = new SC_SiteView(); 
    80103 
     
    84107        // ファイル管理クラス 
    85108        $this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR); 
    86         // ファイル情報の初期化 
     109        // サイト基本情報 (ポイントレート初期値用) 
     110        $this->arrInfo = $this->objDb->sfGetBasisData(); 
     111        // CSV管理ヘルパー 
     112        $this->objCSV = new SC_Helper_CSV(); 
     113        // CSV構造読み込み 
     114        $arrCSVFrame = $this->objCSV->sfgetCsvOutput($this->csv_id); 
     115         
     116        // CSV構造がインポート可能かのチェック 
     117        if( !$this->objCSV->sfIsImportCSVFrame($arrCSVFrame) ) { 
     118            // 無効なフォーマットなので初期状態に強制変更 
     119            $arrCSVFram = $this->objCSV->sfgetCsvOutput($this->csv_id, '', array(), $order ='no'); 
     120            $this->tpl_is_format_default = true; 
     121        } 
     122        // CSV構造は更新可能なフォーマットかのフラグ取得 
     123        $this->tpl_is_update = $this->objCSV->sfIsUpdateCSVFrame($arrCSVFrame); 
     124 
     125        // CSVファイルアップロード情報の初期化 
    87126        $this->lfInitFile(); 
    88127        // パラメータ管理クラス 
    89128        $this->objFormParam = new SC_FormParam(); 
    90129        // パラメータ情報の初期化 
    91         $this->lfInitParam(); 
     130        $this->lfInitParam($arrCSVFrame); 
     131         
    92132        $colmax = $this->objFormParam->getCount(); 
    93133        $this->objFormParam->setHtmlDispNameArray(); 
     
    98138        switch($_POST['mode']) { 
    99139        case 'csv_upload': 
     140            // 登録先テーブル カラム情報の初期化 
     141            $this->lfInitTableInfo(); 
     142            // 登録フォーム カラム情報 
     143            $this->arrFormKeyList = $this->objFormParam->getKeyList(); 
     144             
    100145            $err = false; 
    101             // エラーチェック 
     146            // CSVファイルアップロード エラーチェック 
    102147            $arrErr['csv_file'] = $this->objUpFile->makeTempFile('csv_file'); 
    103148 
     
    132177 
    133178                // レコード数を得る 
    134                 $rec_count = $this->lfCSVRecordCount($fp); 
     179                $rec_count = $this->objCSV->sfGetCSVRecordCount($fp); 
     180                if($rec_count === FALSE) { 
     181                    SC_Utils_Ex::sfDispError(""); 
     182                } 
    135183 
    136184                $line = 0;      // 行数 
    137185                $regist = 0;    // 登録数 
    138186 
    139                 $objQuery = new SC_Query(); 
     187                $objQuery =& SC_Query::getSingletonInstance(); 
    140188                $objQuery->begin(); 
    141189 
     
    175223                    } 
    176224 
    177                     //販売方法チェックを行う 
    178                     $this->checkSalesKind( $this->objFormParam->keyname ,$arrCSV , $arrCSVErr ); 
    179  
    180225                    // 入力エラーチェック 
    181226                    if(count($arrCSVErr) > 0) { 
     
    202247                    echo "■" . $regist . "件のレコードを登録しました。"; 
    203248                    // 商品件数カウント関数の実行 
    204                     $objDb->sfCategory_Count($objQuery); 
    205                     $objDb->sfMaker_Count($objQuery); 
     249                    $this->objDb->sfCategory_Count($objQuery); 
     250                    $this->objDb->sfMaker_Count($objQuery); 
    206251                } else { 
    207252                    $objQuery->rollback(); 
     
    233278    } 
    234279 
    235  
    236280    /** 
    237281     * ファイル情報の初期化を行う. 
     
    247291     * 入力情報の初期化を行う. 
    248292     * 
    249      * @return void 
    250      */ 
    251     function lfInitParam() { 
    252  
    253         // 商品ステータスの上限文字数の算出 
    254         $masterData = new SC_DB_MasterData_Ex(); 
    255         $arrSTATUS = $masterData->getMasterData("mtb_status"); 
    256         $product_flag_maxlen = max(array_keys($arrSTATUS)); 
    257         unset($arrSTATUS); 
    258         unset($masterData); 
    259  
    260         $this->objFormParam->addParam("商品ID", "product_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    261         $this->objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    262  
    263         $this->objFormParam->addParam("規格名1", "dummy1"); 
    264         $this->objFormParam->addParam("規格名2", "dummy2"); 
    265  
    266         $this->objFormParam->addParam("商品名", "name", STEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    267         $this->objFormParam->addParam("公開フラグ(1:公開 2:非公開)", "status", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 
    268         $this->objFormParam->addParam("商品ステータス", "product_flag", $product_flag_maxlen, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 
    269         $this->objFormParam->addParam("商品コード", "product_code", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    270         $this->objFormParam->addParam(NORMAL_PRICE_TITLE, "price01", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    271         $this->objFormParam->addParam(SALE_PRICE_TITLE, "price02", PRICE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 
    272         $this->objFormParam->addParam("在庫数", "stock", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    273         $this->objFormParam->addParam("送料", "deliv_fee", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    274         $this->objFormParam->addParam("ポイント付与率", "point_rate", PERCENTAGE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 
    275         $this->objFormParam->addParam("購入制限", "sale_limit", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    276         $this->objFormParam->addParam("メーカーURL", "comment1", URL_LEN, "KVa", array("SPTAB_CHECK","URL_CHECK","MAX_LENGTH_CHECK")); 
    277         $this->objFormParam->addParam("検索ワード", "comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    278         $this->objFormParam->addParam("備考欄(SHOP専用)", "note", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    279         $this->objFormParam->addParam("一覧-メインコメント", "main_list_comment", MTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    280         $this->objFormParam->addParam("一覧-メイン画像", "main_list_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    281         $this->objFormParam->addParam("メインコメント", "main_comment", LLTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    282         $this->objFormParam->addParam("メイン画像", "main_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    283         $this->objFormParam->addParam("メイン拡大画像", "main_large_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    284         $this->objFormParam->addParam("詳細-サブタイトル(1)", "sub_title1", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    285         $this->objFormParam->addParam("詳細-サブコメント(1)", "sub_comment1", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    286         $this->objFormParam->addParam("詳細-サブ画像(1)", "sub_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    287         $this->objFormParam->addParam("詳細-サブ拡大画像(1)", "sub_large_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    288  
    289         $this->objFormParam->addParam("詳細-サブタイトル(2)", "sub_title2", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    290         $this->objFormParam->addParam("詳細-サブコメント(2)", "sub_comment2", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    291         $this->objFormParam->addParam("詳細-サブ画像(2)", "sub_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    292         $this->objFormParam->addParam("詳細-サブ拡大画像(2)", "sub_large_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    293  
    294         $this->objFormParam->addParam("詳細-サブタイトル(3)", "sub_title3", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    295         $this->objFormParam->addParam("詳細-サブコメント(3)", "sub_comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    296         $this->objFormParam->addParam("詳細-サブ画像(3)", "sub_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    297         $this->objFormParam->addParam("詳細-サブ拡大画像(3)", "sub_large_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    298  
    299         $this->objFormParam->addParam("詳細-サブタイトル(4)", "sub_title4", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    300         $this->objFormParam->addParam("詳細-サブコメント(4)", "sub_comment4", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    301         $this->objFormParam->addParam("詳細-サブ画像(4)", "sub_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    302         $this->objFormParam->addParam("詳細-サブ拡大画像(4)", "sub_large_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    303  
    304         $this->objFormParam->addParam("詳細-サブタイトル(5)", "sub_title5", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    305         $this->objFormParam->addParam("詳細-サブコメント(5)", "sub_comment5", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    306         $this->objFormParam->addParam("詳細-サブ画像(5)", "sub_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    307         $this->objFormParam->addParam("詳細-サブ拡大画像(5)", "sub_large_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    308  
    309         $this->objFormParam->addParam("発送日目安", "deliv_date_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    310  
    311         for ($cnt = 1; $cnt <= RECOMMEND_PRODUCT_MAX; $cnt++) { 
    312             $this->objFormParam->addParam("関連商品($cnt)", "recommend_product_id$cnt", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 
    313             $this->objFormParam->addParam("関連商品コメント($cnt)", "recommend_comment$cnt", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    314         } 
    315  
    316         $this->objFormParam->addParam("実商品・ダウンロード(1:実商品 2:ダウンロード)", "down", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 
    317         $this->objFormParam->addParam("ダウンロードファイル名", "down_filename", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    318         $this->objFormParam->addParam("ダウンロード商品用ファイル", "down_realfilename", LTEXT_LEN, "KVa", array("DOWN_FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 
    319  
    320         $this->objFormParam->addParam("商品カテゴリ", "category_id", STEXT_LEN, "n", array("EXIST_CHECK", "SPTAB_CHECK")); 
    321     } 
    322  
     293     * @param array CSV構造設定配列 
     294     * @return void 
     295     */ 
     296    function lfInitParam(&$arrCSVFrame) { 
     297        // 固有の初期値調整 
     298        $arrCSVFrame = $this->lfSetParamDefaultValue($arrCSVFrame); 
     299        // CSV項目毎の処理 
     300        foreach($arrCSVFrame as $item) { 
     301            if($item['status'] == '2') continue; 
     302            //サブクエリ構造の場合は AS名 を使用 
     303            if(preg_match_all('/\(.+\) as (.+)$/i', $item['col'], $match, PREG_SET_ORDER)) { 
     304                $col = $match[0][1]; 
     305            }else{ 
     306                $col = $item['col']; 
     307            } 
     308            // HTML_TAG_CHECKは別途実行なので除去し、別保存しておく 
     309            if(stripos($item['error_check_types'], 'HTML_TAG_CHECK') !== FALSE) { 
     310                $this->arrTagCheckItem[] = $item; 
     311                $error_check_types = str_replace('HTML_TAG_CHECK', '', $item['error_check_types']); 
     312            }else{ 
     313                $error_check_types = $item['error_check_types']; 
     314            } 
     315            $arrErrorCheckTypes = explode(',', $error_check_types); 
     316            foreach($arrErrorCheckTypes as $key => $val) { 
     317                if(trim($val) == "") { 
     318                    unset($arrErrorCheckTypes[$key]); 
     319                }else{ 
     320                    $arrErrorCheckTypes[$key] = trim($val); 
     321                } 
     322            } 
     323            // パラメーター登録 
     324            $this->objFormParam->addParam( 
     325                    $item['disp_name'] 
     326                    , $col 
     327                    , constant($item['size_const_type']) 
     328                    , $item['mb_convert_kana_option'] 
     329                    , $arrErrorCheckTypes 
     330                    , $item['default'] 
     331                    , ($item['rw_flg'] != 2) ? true : false 
     332                    ); 
     333        } 
     334    } 
     335     
     336    /** 
     337     * 入力チェックを行う. 
     338     * 
     339     * @return void 
     340     */ 
     341    function lfCheckError() { 
     342        // 入力データを渡す。 
     343        $arrRet =  $this->objFormParam->getHashArray(); 
     344        $objErr = new SC_CheckError($arrRet); 
     345        $objErr->arrErr = $this->objFormParam->checkError(false); 
     346        // HTMLタグチェックの実行 
     347        foreach($this->arrTagCheckItem as $item) { 
     348            $objErr->doFunc(array( $item['disp_name'], $item['col'], $this->arrAllowedTag), array("HTML_TAG_CHECK")); 
     349        } 
     350        // このフォーム特有の複雑系のエラーチェックを行う 
     351        if(count($objErr->arrErr) == 0) { 
     352            $objErr->arrErr = $this->lfCheckErrorDetail($arrRet, $objErr->arrErr); 
     353        } 
     354        return $objErr->arrErr; 
     355    } 
     356 
     357    /** 
     358     * 保存先テーブル情報の初期化を行う. 
     359     * 
     360     * @return void 
     361     */ 
     362    function lfInitTableInfo() { 
     363        $objQuery =& SC_Query::getSingletonInstance(); 
     364        $this->arrProductColumn = $objQuery->listTableFields('dtb_products'); 
     365        $this->arrProductClassColumn = $objQuery->listTableFields('dtb_products_class'); 
     366    } 
     367     
    323368    /** 
    324369     * 商品登録を行う. 
     370     * 
     371     * FIXME: 商品登録の実処理自体は、LC_Page_Admin_Products_Productと共通化して欲しい。 
    325372     * 
    326373     * @param SC_Query $objQuery SC_Queryインスタンス 
     
    329376     */ 
    330377    function lfRegistProduct($objQuery, $line = "") { 
    331  
    332         $objDb = new SC_Helper_DB_Ex(); 
    333  
    334         $arrRet = $this->objFormParam->getHashArray(); 
    335  
    336         // dtb_products以外に登録される値を除外する。 
    337         foreach($arrRet as $key => $val) { 
    338             switch($key) { 
    339             case 'product_code': 
    340             case 'price01': 
    341             case 'price02': 
    342             case 'stock': 
    343             case 'product_class_id': 
    344             case 'recommend_product_id1': 
    345             case 'recommend_product_id2': 
    346             case 'recommend_product_id3': 
    347             case 'recommend_product_id4': 
    348             case 'recommend_product_id5': 
    349             case 'recommend_product_id6': 
    350             case 'recommend_comment1': 
    351             case 'recommend_comment2': 
    352             case 'recommend_comment3': 
    353             case 'recommend_comment4': 
    354             case 'recommend_comment5': 
    355             case 'recommend_comment6': 
    356             case 'category_id': 
    357                 break; 
    358             default: 
    359                 if(!ereg("^dummy", $key)) { 
    360                     $sqlval[$key] = $val; 
    361                 } 
    362                 break; 
    363             } 
    364         } 
    365  
     378        $objProduct = new SC_Product(); 
     379        // 登録データ対象取得 
     380        $arrList = $this->objFormParam->getHashArray(); 
    366381        // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう) 
    367         $time = date("Y-m-d H:i:s"); 
    368         // 秒以下を生成 
    369         if($line != "") { 
    370             $microtime = sprintf("%06d", $line); 
    371             $time .= ".$microtime"; 
    372         } 
    373         $sqlval['update_date'] = $time; 
    374         $sqlval['creator_id'] = $_SESSION['member_id']; 
    375  
    376         if($sqlval['status'] == "") { 
    377             $sqlval['status'] = 2; 
    378         } 
     382        $arrList['update_date'] = $this->lfGetDbFormatTimeWithLine($line); 
     383 
     384        // 商品登録情報を生成する。 
     385        // 商品テーブルのカラムに存在しているもののうち、Form投入設定されていないデータは上書きしない。 
     386        $sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $this->arrProductColumn); 
     387 
     388        // 必須入力では無い項目だが、空文字では問題のある特殊なカラム値の初期値設定 
     389        $sqlval = $this->lfSetProductDefaultData($sqlval); 
    379390 
    380391        if($sqlval['product_id'] != "") { 
    381  
    382392            // UPDATEの実行 
    383393            $where = "product_id = ?"; 
    384394            $objQuery->update("dtb_products", $sqlval, $where, array($sqlval['product_id'])); 
    385  
    386395            $product_id = $sqlval['product_id']; 
    387396        } else { 
    388397            // 新規登録 
    389  
    390398            $sqlval['product_id'] = $objQuery->nextVal('dtb_products_product_id'); 
    391399            $product_id = $sqlval['product_id']; 
    392             $sqlval['create_date'] = $time; 
    393  
     400            $sqlval['create_date'] = $arrList['update_date']; 
    394401            // INSERTの実行 
    395402            $objQuery->insert("dtb_products", $sqlval); 
     
    397404 
    398405        // カテゴリ登録 
    399         $arrCategory_id = explode("|", $arrRet["category_id"]); 
    400         $objDb->updateProductCategories($arrCategory_id, $product_id); 
    401  
    402         // 規格登録 
    403         $this->lfRegistProductClass($objQuery, $arrRet, $product_id, $arrRet['product_class_id']); 
     406        if($arrList['category_ids'] != "") { 
     407            $arrCategory_id = explode(',', $arrList['category_ids']); 
     408            $this->objDb->updateProductCategories($arrCategory_id, $product_id); 
     409        } 
     410        // ステータス登録 
     411        if($arrList['product_statuses'] != "") { 
     412            $arrStatus_id = explode(',', $arrList['product_statuses']); 
     413            $objProduct->setProductStatus($product_id, $arrStatus_id); 
     414        } 
     415         
     416        // 商品規格情報を登録する 
     417        $this->lfRegistProductClass($objQuery, $arrList, $product_id, $arrList['product_class_id']); 
    404418 
    405419        // 関連商品登録 
     420        $this->lfRegistReccomendProducts($objQuery, $arrList, $product_id); 
     421    } 
     422 
     423    /** 
     424     * 商品規格登録を行う. 
     425     * 
     426     * FIXME: 商品規格登録の実処理自体は、LC_Page_Admin_Products_Productと共通化して欲しい。 
     427     * 
     428     * @param SC_Query $objQuery SC_Queryインスタンス 
     429     * @param array $arrList 商品規格情報配列 
     430     * @param integer $product_id 商品ID 
     431     * @param integer $product_class_id 商品規格ID 
     432     * @return void 
     433     */ 
     434    function lfRegistProductClass($objQuery, $arrList, $product_id, $product_class_id) { 
     435        $objProduct = new SC_Product(); 
     436        // 商品規格登録情報を生成する。 
     437        // 商品規格テーブルのカラムに存在しているもののうち、Form投入設定されていないデータは上書きしない。 
     438        $sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $this->arrProductClassColumn); 
     439        // 必須入力では無い項目だが、空文字では問題のある特殊なカラム値の初期値設定 
     440        $sqlval = $this->lfSetProductClassDefaultData($sqlval); 
     441 
     442        if($product_class_id == "") { 
     443            // 新規登録 
     444            $sqlval['product_id'] = $product_id; 
     445            $sqlval['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id'); 
     446            $sqlval['create_date'] = $arrList['update_date']; 
     447            // INSERTの実行 
     448            $objQuery->insert("dtb_products_class", $sqlval); 
     449            $product_class_id = $sqlval['product_class_id']; 
     450        } else { 
     451            // UPDATEの実行 
     452            $where = "product_class_id = ?"; 
     453            $objQuery->update("dtb_products_class", $sqlval, $where, array($product_class_id)); 
     454        } 
     455        // 支払い方法登録 
     456        if($arrList['product_payment_ids'] != "") { 
     457            $arrPayment_id = explode(',', $arrList['product_payment_ids']); 
     458            $objProduct->setPaymentOptions($product_class_id, $arrPayment_id); 
     459        } 
     460    } 
     461 
     462    /** 
     463     * 関連商品登録を行う. 
     464     * 
     465     * FIXME: 商品規格登録の実処理自体は、LC_Page_Admin_Products_Productと共通化して欲しい。 
     466     *        DELETE/INSERT ではなく UPDATEへの変更も・・・ 
     467     * 
     468     * @param SC_Query $objQuery SC_Queryインスタンス 
     469     * @param array $arrList 商品規格情報配列 
     470     * @param integer $product_id 商品ID 
     471     * @return void 
     472     */ 
     473    function lfRegistReccomendProducts($objQuery, $arrList, $product_id) { 
    406474        $objQuery->delete("dtb_recommend_products", "product_id = ?", array($product_id)); 
    407475        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) { 
    408476            $keyname = "recommend_product_id" . $i; 
    409477            $comment_key = "recommend_comment" . $i; 
    410             if($arrRet[$keyname] != "") { 
    411                 $arrProduct = $objQuery->select("product_id", "dtb_products", "product_id = ?", array($arrRet[$keyname])); 
     478            if($arrList[$keyname] != "") { 
     479                $arrProduct = $objQuery->select("product_id", "dtb_products", "product_id = ?", array($arrList[$keyname])); 
    412480                if($arrProduct[0]['product_id'] != "") { 
    413481                    $arrval['product_id'] = $product_id; 
    414482                    $arrval['recommend_product_id'] = $arrProduct[0]['product_id']; 
    415                     $arrval['comment'] = $arrRet[$comment_key]; 
    416                     $arrval['update_date'] = "Now()"; 
    417                     $arrval['create_date'] = "Now()"; 
     483                    $arrval['comment'] = $arrList[$comment_key]; 
     484                    $arrval['update_date'] = $arrList['update_date']; 
     485                    $arrval['create_date'] = $arrList['update_date']; 
    418486                    $arrval['creator_id'] = $_SESSION['member_id']; 
    419487                    $arrval['rank'] = RECOMMEND_PRODUCT_MAX - $i + 1; 
     
    425493 
    426494    /** 
    427      * 商品規格登録を行う. 
    428      * 
    429      * @param SC_Query $objQuery SC_Queryインスタンス 
    430      * @param array $arrList 商品規格情報配列 
    431      * @param integer $product_id 商品ID 
    432      * @param integer $product_class_id 商品規格ID 
    433      * @return void 
    434      */ 
    435     function lfRegistProductClass($objQuery, $arrList, $product_id, $product_class_id) { 
    436         $sqlval['product_code'] = $arrList["product_code"]; 
    437         $sqlval['stock'] = $arrList["stock"]; 
    438         if($sqlval['stock'] == "") { 
    439             $sqlval['stock_unlimited'] = '1'; 
    440         } else { 
    441             $sqlval['stock_unlimited'] = '0'; 
    442         } 
    443         $sqlval['price01'] = $arrList['price01']; 
    444         $sqlval['price02'] = $arrList['price02']; 
    445         $sqlval['creator_id'] = $_SESSION['member_id']; 
    446  
    447         // TODO $sqlval['member_id'] は何処から出てくる? 
    448         if($sqlval['member_id'] == "") { 
    449             $sqlval['creator_id'] = '0'; 
    450         } 
    451  
    452         if($product_class_id == "") { 
    453             // 新規登録 
    454             $where = "product_id = ?"; 
    455             // 念のために既存の規格を削除 
    456             $objQuery->delete("dtb_products_class", $where, array($product_id)); 
    457             $sqlval['product_id'] = $product_id; 
    458             $sqlval['classcategory_id1'] = '0'; 
    459             $sqlval['classcategory_id2'] = '0'; 
    460             $sqlval['create_date'] = "now()"; 
    461             $sqlval['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id'); 
    462             $objQuery->insert("dtb_products_class", $sqlval); 
    463         } else { 
    464             // 既存編集 
    465             $where = "product_id = ? AND product_class_id = ?"; 
    466             $objQuery->update("dtb_products_class", $sqlval, $where, array($product_id, $product_class_id)); 
    467         } 
    468     } 
    469  
    470     /** 
    471      * 入力チェックを行う. 
    472      * 
    473      * @return void 
    474      */ 
    475     function lfCheckError() { 
    476  
    477         // 入力データを渡す。 
    478         $arrRet =  $this->objFormParam->getHashArray(); 
    479         $objErr = new SC_CheckError($arrRet); 
    480         $objErr->arrErr = $this->objFormParam->checkError(false); 
    481  
    482         if(count($objErr->arrErr) == 0) { 
    483             $objQuery = new SC_Query(); 
    484             // 商品ID、規格IDの存在チェック 
    485             if($arrRet['product_id'] != "") { 
    486                 $count = $objQuery->count("dtb_products", "product_id = ?", array($arrRet['product_id'])); 
    487                 if($count == 0) { 
    488                     $objErr->arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。"; 
     495     * 初期値の設定 
     496     * 
     497     * @param array $arrCSVFrame CSV構造配列 
     498     * @return array $arrCSVFrame CSV構造配列 
     499     */ 
     500    function lfSetParamDefaultValue(&$arrCSVFrame) { 
     501        foreach($arrCSVFrame as $key => $val) { 
     502            switch($val['col']) { 
     503                case 'status': 
     504                    $arrCSVFrame[$key]['default'] = DEFAULT_PRODUCT_DISP; 
     505                    break; 
     506                case 'del_flg': 
     507                    $arrCSVFrame[$key]['default'] = '0'; 
     508                    break; 
     509                case 'point_rate': 
     510                    $arrCSVFrame[$key]['default'] = $this->arrInfo['point_rate']; 
     511                    break; 
     512                case 'product_type_id': 
     513                    $arrCSVFrame[$key]['default'] = DEFAULT_PRODUCT_DOWN; 
     514                    break; 
     515                case 'product_payment_ids': 
     516                    $arrCSVFrame[$key]['default'] = implode(',',array_keys($this->arrPayments)); 
     517                    break; 
     518                default: 
     519                    break; 
     520            } 
     521        } 
     522        return $arrCSVFrame; 
     523    } 
     524 
     525    /** 
     526     * 商品データ登録前に特殊な値の持ち方をする部分のデータ部分の初期値補正を行う 
     527     * 
     528     * @param array $sqlval 商品登録情報配列 
     529     * @return $sqlval 登録情報配列 
     530     */ 
     531    function lfSetProductDefaultData(&$sqlval) { 
     532        //新規登録時のみ設定する項目 
     533        if( $sqlval['product_id'] == "") { 
     534            if($sqlval['status'] == "") { 
     535                $sqlval['status'] = DEFAULT_PRODUCT_DISP; 
     536            } 
     537        } 
     538        //共通で空欄時に上書きする項目 
     539        if($sqlval['del_flg'] == ""){ 
     540            $sqlval['del_flg'] = '0'; //有効 
     541        } 
     542        if($sqlval['creator_id'] == "") { 
     543            $sqlval['creator_id'] = $_SESSION['member_id']; 
     544        } 
     545        return $sqlval; 
     546    } 
     547 
     548    /** 
     549     * 商品規格データ登録前に特殊な値の持ち方をする部分のデータ部分の初期値補正を行う 
     550     * 
     551     * @param array $sqlval 商品登録情報配列 
     552     * @return $sqlval 登録情報配列 
     553     */ 
     554    function lfSetProductClassDefaultData(&$sqlval) { 
     555        //新規登録時のみ設定する項目 
     556        if($sqlval['product_class_id'] == "") { 
     557            if($sqlval['point_rate'] == "") { 
     558                $sqlval['point_rate'] = $this->arrInfo['point_rate']; 
     559            } 
     560            if($sqlval['product_type_id'] == "") { 
     561                $sqlval['product_type_id'] = DEFAULT_PRODUCT_DOWN; 
     562            } 
     563            // TODO: 在庫数、無制限フラグの扱いについて仕様がぶれているので要調整 
     564            if($sqlval['stock'] == "" and $sqlval['stock_unlimited'] != '1') { 
     565                //在庫数設定がされておらず、かつ無制限フラグが設定されていない場合、強制無制限 
     566                $sqlval['stock_unlimited'] = '1'; 
     567            }elseif($sqlval['stock'] != "" and $sqlval['stock_unlimited'] != '1') { 
     568                //在庫数設定時は在庫無制限フラグをクリア 
     569                $sqlval['stock_unlimited'] = '0'; 
     570            }elseif($sqlval['stock'] != "" and $sqlval['stock_unlimited'] == '1') { 
     571                //在庫無制限フラグ設定時は在庫数をクリア 
     572                $sqlval['stock'] = ''; 
     573            } 
     574        }else{ 
     575            //更新時のみ設定する項目 
     576            if(array_key_exists('stock_unlimited', $sqlval) and $sqlval['stock_unlimited'] == '1') { 
     577                $sqlval['stock'] = ''; 
     578            } 
     579        } 
     580        //共通で設定する項目 
     581        if($sqlval['del_flg'] == ""){ 
     582            $sqlval['del_flg'] = '0'; //有効 
     583        } 
     584        if($sqlval['creator_id'] == "") { 
     585            $sqlval['creator_id'] = $_SESSION['member_id']; 
     586        } 
     587        return $sqlval; 
     588    } 
     589 
     590    /** 
     591     * このフォーム特有の複雑な入力チェックを行う. 
     592     * 
     593     * @param array 確認対象データ 
     594     * @param array エラー配列 
     595     * @return array エラー配列 
     596     */ 
     597    function lfCheckErrorDetail($item, $arrErr) { 
     598        // 商品IDの存在チェック 
     599        if(!$this->lfIsDbRecord('dtb_products', 'product_id', $item)) { 
     600            $arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。"; 
     601        } 
     602        // 規格IDの存在チェック 
     603        if(!$this->lfIsDbRecord('dtb_products_class', 'product_class_id', $item)) { 
     604            $arrErr['product_class_id'] = "※ 指定の商品規格IDは、登録されていません。"; 
     605        } 
     606        // 商品ID、規格IDの組合せチェック 
     607        if(array_search('product_class_id', $this->arrFormKeyList) !== FALSE 
     608                and $item['product_class_id'] != "") { 
     609            if($item['product_id'] == "") { 
     610                $arrErr['product_class_id'] = "※ 商品規格ID指定時には商品IDの指定が必須です。"; 
     611            }else{ 
     612                if(!$this->objDb->sfIsRecord('dtb_products_class', 'product_id, product_class_id' 
     613                        , array($item['product_id'], $item['product_class_id']))) { 
     614                    $arrErr['product_class_id'] = "※ 指定の商品IDと商品規格IDの組合せは正しくありません。"; 
    489615                } 
    490616            } 
    491  
    492             if($arrRet['product_class_id'] != "") { 
    493                 $count = 0; 
    494                 if($arrRet['product_id'] != "") { 
    495                     $count = $objQuery->count("dtb_products_class", "product_id = ? AND product_class_id = ?", array($arrRet['product_id'], $arrRet['product_class_id'])); 
    496                 } 
    497                 if($count == 0) { 
    498                     $objErr->arrErr['product_class_id'] = "※ 指定の規格IDは、登録されていません。"; 
    499                 } 
    500             } 
    501  
    502             // 存在するカテゴリIDかチェック 
    503             $arrCategory_id = explode("|", $arrRet['category_id']); 
    504             foreach ($arrCategory_id as $category_id) { 
    505                 $count = $objQuery->count("dtb_category", "category_id = ?", array($category_id)); 
    506                 if($count == 0) { 
    507                     $objErr->arrErr['product_id'] = "※ 指定のカテゴリIDは、登録されていません。"; 
    508                 } 
    509             } 
    510         } 
    511         return $objErr->arrErr; 
    512     } 
    513  
    514     /** 
    515      * CSVのカウント数を得る. 
    516      * 
    517      * @param resource $fp fopenを使用して作成したファイルポインタ 
    518      * @return integer CSV のカウント数 
    519      */ 
    520     function lfCSVRecordCount($fp) { 
    521  
    522         $count = 0; 
    523         while(!feof($fp)) { 
    524             $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 
    525             $count++; 
    526         } 
    527         // ファイルポインタを戻す 
    528         if (rewind($fp)) { 
    529             return $count-1; 
    530         } else { 
    531             SC_Utils_Ex::sfDispError(""); 
    532         } 
     617        } 
     618        // 規格組合せIDの存在チェック 
     619//        if(!$this->lfIsDbRecord('dtb_class_combination', 'class_combination_id', $item)) { 
     620//      SC_Utils::sfIsRecord が del_flg が無いと使えない為、個別処理 
     621        if(array_search('class_combination_id', $this->arrFormKeyList) !== FALSE 
     622                and $item['class_combination_id'] != "" ) { 
     623            $objQuery =& SC_Query::getSingletonInstance(); 
     624            $ret = $objQuery->get('class_combination_id', 'dtb_class_combination', 'class_combination_id = ?', array($item['class_combination_id'])); 
     625            if($ret == "") { 
     626                $arrErr['class_combination_id'] = "※ 指定の規格組合せIDは、登録されていません。"; 
     627            } 
     628        } 
     629        // 表示ステータスの存在チェック 
     630        if(!$this->lfIsArrayRecord($this->arrDISP, 'status', $item)) { 
     631            $arrErr['status'] = "※ 指定の表示ステータスは、登録されていません。"; 
     632        } 
     633        // メーカーIDの存在チェック 
     634        if(!$this->lfIsArrayRecord($this->arrMaker, 'maker_id', $item)) { 
     635            $arrErr['maker_id'] = "※ 指定のメーカーIDは、登録されていません。"; 
     636        } 
     637        // 発送日目安IDの存在チェック 
     638        if(!$this->lfIsArrayRecord($this->arrDELIVERYDATE, 'deliv_date_id', $item)) { 
     639            $arrErr['deliv_date_id'] = "※ 指定の発送日目安IDは、登録されていません。"; 
     640        } 
     641        // 発送日目安IDの存在チェック 
     642        if(!$this->lfIsArrayRecord($this->arrProductType, 'product_type_id', $item)) { 
     643            $arrErr['product_type_id'] = "※ 指定の商品種別IDは、登録されていません。"; 
     644        } 
     645        // 関連商品IDの存在チェック 
     646        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) { 
     647            if(array_search('recommend_product_id' . $i, $this->arrFormKeyList) !== FALSE 
     648                    and $item['recommend_product_id' . $i] != "" 
     649                    and !$this->objDb->sfIsRecord('dtb_products', 'product_id', (array)$item['recommend_product_id' . $i]) ) { 
     650                $arrErr['recommend_product_id' . $i] = "※ 指定の関連商品ID($i)は、登録されていません。"; 
     651            } 
     652        } 
     653        // カテゴリIDの存在チェック 
     654        if(!$this->lfIsDbRecordMulti('dtb_category', 'category_id', 'category_ids', $item, ',')) { 
     655            $arrErr['category_ids'] = "※ 指定のカテゴリIDは、登録されていません。"; 
     656        } 
     657        // ステータスIDの存在チェック 
     658        if(!$this->lfIsArrayRecordMulti($this->arrSTATUS, 'product_statuses', $item, ',')) { 
     659            $arrErr['product_statuses'] = "※ 指定のステータスIDは、登録されていません。"; 
     660        } 
     661        // 支払い方法IDの存在チェック 
     662        if(!$this->lfIsArrayRecordMulti($this->arrPayments, 'product_payment_ids', $item, ',')) { 
     663            $arrErr['product_payment_ids'] = "※ 指定の支払い方法IDは、登録されていません。"; 
     664        } 
     665        // 削除フラグのチェック 
     666        if(array_search('del_flg', $this->arrFormKeyList) !== FALSE 
     667                and $item['del_flg'] != "") { 
     668            if(!($item['del_flg'] == "0" or $item['del_flg'] == "1")) { 
     669                $arrErr['del_flg'] = "※ 削除フラグは「0」(有効)、「1」(削除)のみが有効な値です。"; 
     670            } 
     671        } 
     672/* 
     673    TODO: 在庫数の扱いが2.4仕様ではぶれているのでどうするか・・ 
     674        // 在庫数/在庫無制限フラグの有効性に関するチェック 
     675        if($item['stock'] == "") { 
     676            if(array_search('stock_unlimited', $this->arrFormKeyList) === FALSE) { 
     677                $arrErr['stock'] = "※ 在庫数は必須です(無制限フラグ項目がある場合のみ空欄許可)。"; 
     678            }else if($item['stock_unlimited'] != "1") { 
     679                $arrErr['stock'] = "※ 在庫数または在庫無制限フラグのいずれかの入力が必須です。"; 
     680            } 
     681        } 
     682*/         
     683        // ダウンロード商品チェック 
     684        if(array_search('product_type_id', $this->arrFormKeyList) !== FALSE 
     685                 and $item['product_type_id'] == PRODUCT_TYPE_NORMAL) { 
     686            //実商品の場合 
     687            if( $item['down_filename'] != "") { 
     688                $arrErr['down_filename'] = "※ 実商品の場合はダウンロードファイル名は入力できません。"; 
     689            } 
     690            if( $item['down_realfilename'] != "") { 
     691                $arrErr['down_realfilename'] = "※ 実商品の場合はダウンロード商品用ファイルアップロードは入力できません。"; 
     692            } 
     693        }elseif(array_search('product_type_id', $this->arrFormKeyList) !== FALSE 
     694                and $item['product_type_id'] == PRODUCT_TYPE_DOWNLOAD) { 
     695            //ダウンロード商品の場合 
     696            if( $item['down_filename'] == "") { 
     697                $arrErr['down_filename'] = "※ ダウンロード商品の場合はダウンロードファイル名は必須です。"; 
     698            } 
     699            if( $item['down_realfilename'] == "") { 
     700                $arrErr['down_realfilename'] = "※ ダウンロード商品の場合はダウンロード商品用ファイルアップロードは必須です。"; 
     701            } 
     702        } 
     703        return $arrErr; 
     704    } 
     705 
     706    // TODO: ここから下のルーチンは汎用ルーチンとして移動が望ましい 
     707 
     708    /** 
     709     * 指定された行番号をmicrotimeに付与してDB保存用の時間を生成する。 
     710     * トランザクション内のnow()は全てcommit()時の時間に統一されてしまう為。 
     711     * 
     712     * @param string $line_no 行番号 
     713     * @return string $time DB保存用の時間文字列 
     714     */ 
     715    function lfGetDbFormatTimeWithLine($line_no = '') { 
     716        $time = date("Y-m-d H:i:s"); 
     717        // 秒以下を生成 
     718        if($line != '') { 
     719            $microtime = sprintf("%06d", $line_no); 
     720            $time .= ".$microtime"; 
     721        } 
     722        return $time; 
     723    } 
     724 
     725    /** 
     726     * 指定されたキーと複数値の有効性の配列内確認 
     727     * 
     728     * @param string $arr チェック対象配列 
     729     * @param string $keyname フォームキー名 
     730     * @param array  $item 入力データ配列 
     731     * @param string $delimiter 分割文字 
     732     * @return boolean true:有効なデータがある false:有効ではない 
     733     */ 
     734    function lfIsArrayRecordMulti($arr, $keyname, $item, $delimiter = ',') { 
     735        if(array_search($keyname, $this->arrFormKeyList) === FALSE) { 
     736            return true; 
     737        } 
     738        if($item[$keyname] == "") { 
     739            return true; 
     740        } 
     741        $arrItems = explode($delimiter, $item[$keyname]); 
     742        //空項目のチェック 1つでも空指定があったら不正とする。 
     743        if(array_search("", $arrItems) !== FALSE) { 
     744            return false; 
     745        } 
     746        //キー項目への存在チェック 
     747        foreach($arrItems as $item) { 
     748            if(!array_key_exists($item, $arr)) { 
     749                return false; 
     750            } 
     751        } 
     752        return true; 
     753    } 
     754 
     755    /** 
     756     * 指定されたキーと複数値の有効性のDB確認 
     757     * 
     758     * @param string $table テーブル名 
     759     * @param string $tblkey テーブルキー名 
     760     * @param string $keyname フォームキー名 
     761     * @param array  $item 入力データ配列 
     762     * @param string $delimiter 分割文字 
     763     * @return boolean true:有効なデータがある false:有効ではない 
     764     */ 
     765    function lfIsDbRecordMulti($table, $tblkey, $keyname, $item, $delimiter = ',') { 
     766        if(array_search($keyname, $this->arrFormKeyList) === FALSE) { 
     767            return true; 
     768        } 
     769        if($item[$keyname] == "") { 
     770            return true; 
     771        } 
     772        $arrItems = explode($delimiter, $item[$keyname]); 
     773        //空項目のチェック 1つでも空指定があったら不正とする。 
     774        if(array_search("", $arrItems) !== FALSE) { 
     775            return false; 
     776        } 
     777        $count = count($arrItems); 
     778        $where = $tblkey ." IN (" . implode(",", array_fill(0, $count, "?")) . ")"; 
     779         
     780        $objQuery =& SC_Query::getSingletonInstance(); 
     781        $db_count = $objQuery->count($table, $where, $arrItems); 
     782        if($count != $db_count) { 
     783            return false; 
     784        } 
     785        return true; 
     786    } 
     787 
     788    /** 
     789     * 指定されたキーと値の有効性のDB確認 
     790     * 
     791     * @param string $table テーブル名 
     792     * @param string $keyname キー名 
     793     * @param array  $item 入力データ配列 
     794     * @return boolean true:有効なデータがある false:有効ではない 
     795     */ 
     796    function lfIsDbRecord($table, $keyname, $item) { 
     797        if(array_search($keyname, $this->arrFormKeyList) !== FALSE  //入力対象である 
     798                and $item[$keyname] != ""   // 空ではない 
     799                and !$this->objDb->sfIsRecord($table, $keyname, (array)$item[$keyname]) //DBに存在するか 
     800                ) { 
     801            return false; 
     802        } 
     803        return true; 
     804    } 
     805 
     806    /** 
     807     * 指定されたキーと値の有効性の配列内確認 
     808     * 
     809     * @param string $arr チェック対象配列 
     810     * @param string $keyname キー名 
     811     * @param array  $item 入力データ配列 
     812     * @return boolean true:有効なデータがある false:有効ではない 
     813     */ 
     814    function lfIsArrayRecord($arr, $keyname, $item) { 
     815        if(array_search($keyname, $this->arrFormKeyList) !== FALSE //入力対象である 
     816                and $item[$keyname] != "" // 空ではない 
     817                and !array_key_exists($item[$keyname], $arr) //配列に存在するか 
     818                ) { 
     819            return false; 
     820        } 
     821        return true; 
    533822    } 
    534823 
     
    544833         echo "<font color=\"red\">" 
    545834             . htmlspecialchars($val, ENT_QUOTES) 
    546              . "</font></br>\n"; 
    547     } 
    548  
    549     /** 
    550      * 実商品・ダウンロード判定チェック処理 
    551      * 
    552      * @param $p_keyname    csv項目番号配列 
    553      * @param $p_arrCSV     csv入力データ配列 
    554      * @param $p_arrCSVErr  エラー格納配列 
    555      */ 
    556     function checkSalesKind( $p_keyname , $p_arrCSV , &$p_arrCSVErr ){ 
    557  
    558         //実商品・ダウンロードカラムの値を取得する 
    559         $sDownFlg_Key = array_search('down', $p_keyname ); 
    560         if( $sDownFlg_Key != '' ){ 
    561             //実商品・ダウンロードカラムが存在する場合 
    562             //実商品・ダウンロードカラムの値を取得する 
    563             $sDownFlg = $p_arrCSV[$sDownFlg_Key]; 
    564  
    565             //ダウンロードファイル名を取得する 
    566             $sFilename_Key = array_search('down_filename', $p_keyname ); 
    567             $sFilename = $p_arrCSV[$sFilename_Key]; 
    568  
    569             //ダウンロード商品用ファイルアップロードを取得する 
    570             $sRealdown_filename_Key = array_search('down_realfilename', $p_keyname ); 
    571             $sRealdown_filename = $p_arrCSV[$sRealdown_filename_Key]; 
    572  
    573             if( $sDownFlg == 1 ){ 
    574                 //実商品の場合 
    575                 if( mb_strlen($sFilename) > 0 ){ 
    576                     $p_arrCSVErr["down_filename"] = "※ 実商品の場合はダウンロードファイル名は入力できません。\n"; 
    577                 } 
    578                 if( mb_strlen($sRealdown_filename) > 0 ){ 
    579                     $p_arrCSVErr["down_realfilename"] = "※ 実商品の場合はダウンロード商品用ファイルアップロードは入力できません。\n"; 
    580                 } 
    581             }else if( $sDownFlg == 2 ){ 
    582                 //ダウンロード商品の場合 
    583                 if( mb_strlen($sFilename) <= 0 ){ 
    584                     $p_arrCSVErr["down_filename"] = "※ ダウンロード商品の場合はダウンロードファイル名は必須です。\n"; 
    585                 } 
    586                 if( mb_strlen($sRealdown_filename) <=  0 ){ 
    587                     $p_arrCSVErr["down_realfilename"] = "※ ダウンロード商品の場合はダウンロード商品用ファイルアップロードは必須です。\n"; 
    588                 } 
    589             }else{ 
    590                 //その他 
    591                 $p_arrCSVErr["down"] = "※ 実商品・ダウンロード(1:実商品 2:ダウンロード)の設定が不正です。\n"; 
    592             } 
    593         } 
     835             . "</font><br />\n"; 
    594836    } 
    595837} 
Note: See TracChangeset for help on using the changeset viewer.