[Svn-src-all:865] [version-2_5-dev 19752] #781 (規格のデータベースを木構造に)により動作していなかった商品CSVアップロード機能を全面見直し修正。

AMUAMU admin @ mail.ec-cube.net
2010年 12月 20日 (月) 08:53:27 JST


Subversion committed to /home/svn/open 19752
http://svn.ec-cube.net/open_trac/changeset/19752
┌────────────────────────────┐
│更新者 :  AMUAMU                                       │
│更新日時:  2010-12-20 08:53:26 +0900 (月, 20 12月 2010)│
└────────────────────────────┘

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

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_5-dev/data/class/SC_FormParam.php
U   branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
U   branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php

変更: branches/version-2_5-dev/data/class/SC_FormParam.php
===================================================================
--- branches/version-2_5-dev/data/class/SC_FormParam.php	2010-12-19 23:43:06 UTC (rev 19751)
+++ branches/version-2_5-dev/data/class/SC_FormParam.php	2010-12-19 23:53:26 UTC (rev 19752)
@@ -104,10 +104,16 @@
             }
 
             if($find) {
-                $this->html_disp_name[$cnt] = $this->disp_name[$cnt] . "<span class='red'>(※ 必須)</span>";
+                $this->html_disp_name[$cnt] = $this->disp_name[$cnt] . '<span class="red">(※ 必須)</span>';
             } else {
                 $this->html_disp_name[$cnt] = $this->disp_name[$cnt];
             }
+            if($this->default[$cnt] != "") {
+                $this->html_disp_name[$cnt] .= ' [省略時初期値: ' . $this->default[$cnt] . ']';
+            }
+            if($this->input_db[$cnt] == false) {
+                $this->html_disp_name[$cnt] .= ' [登録・更新不可] ';
+            }
             $cnt++;
         }
     }

変更: branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
===================================================================
--- branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php	2010-12-19 23:43:06 UTC (rev 19751)
+++ branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php	2010-12-19 23:53:26 UTC (rev 19752)
@@ -61,43 +61,27 @@
      * @param integer $csv_id CSV ID
      * @param string $where SQL の WHERE 句
      * @param array $arrVal WHERE 句の要素
+     * @param array $order SQL の ORDER BY 句
      * @return array CSV 項目の配列
      */
-    function sfgetCsvOutput($csv_id = "", $where = '0=0', $arrVal = array()){
-        $objQuery = new SC_Query();
-        $ret = array();
-
-        $sql = <<< __EOS__
-            SELECT
-                no,
-                csv_id,
-                col,
-                disp_name,
-                rank,
-                status,
-                create_date,
-                update_date,
-                mb_convert_kana_option
-            FROM
-                dtb_csv
-__EOS__;
-
-        if (strlen($csv_id) >= 1) {
-            $where = "($where) AND csv_id = ?";
+    function sfgetCsvOutput($csv_id = "", $where = '', $arrVal = array(), $order = 'rank, no'){
+        $objQuery =& SC_Query::getSingletonInstance();
+        
+        $cols = 'no, csv_id, col, disp_name, rank, status, rw_flg, mb_convert_kana_option, size_const_type, error_check_types';
+        $table = 'dtb_csv';
+        
+        if(SC_Utils_Ex::sfIsInt($csv_id)){
+            if($where == "") {
+                $where = "csv_id = ?";
+            }else{
+                $where = "$where AND csv_id = ?";
+            }
             $arrVal[] = $csv_id;
         }
-
-        if (strlen($where) >= 1) {
-            $sql .= " WHERE $where";
-        }
-
-        $sql .= " ORDER BY ";
-        $sql .= "     rank , no";
-        $sql .= " ";
-
-        $ret = $objQuery->getAll($sql, $arrVal);
-
-        return $ret;
+        $objQuery->setOrder($order);
+        
+        $arrRet = $objQuery->select($cols, $table, $where, $arrVal);
+        return $arrRet;
     }
 
     // CSVを送信する。(共通。現状は受注のみ利用。)
@@ -120,6 +104,65 @@
         $data = $objCSV->lfGetCSV("dtb_order", $where, $option, $arrval, $arrCsvOutputCols, $arrCsvOutputConvs);
     }
     
+    /**
+     * CSVが出力設定でインポート可能かのチェック
+     *
+     * @param array sfgetCsvOutputで取得した内容(またはそれと同等の配列)
+     * @return boolean true:インポート可能、false:インポート不可
+     */
+    function sfIsImportCSVFrame(&$arrCSVFrame) {
+        $result = true;
+        foreach($arrCSVFrame as $key => $val) {
+            if($val['status'] != "1"
+                    and $val['rw_flg'] == "1"
+                    and $val['error_check_types'] != ""
+                    and stripos($val['error_check_types'], "EXIST_CHECK") !== FALSE) {
+                //必須フィールド
+                $result = false;
+            }
+        }
+        return $result;
+    }
+    
+    /**
+     * CSVが出力設定で更新可能かのチェック
+     *
+     * @param array sfgetCsvOutputで取得した内容(またはそれと同等の配列)
+     * @return boolean true:更新可能、false:新規追加のみ不可
+     */
+    function sfIsUpdateCSVFrame(&$arrCSVFrame) {
+        $result = true;
+        foreach($arrCSVFrame as $key => $val) {
+            if($val['status'] != "1"
+                    and $val['rw_flg'] == "3") {
+                //キーフィールド
+                $result = false;
+            }
+        }
+        return $result;
+    }
+    
+    /**
+     * CSVファイルのカウント数を得る.
+     *
+     * @param resource $fp fopenを使用して作成したファイルポインタ
+     * @return integer CSV のカウント数
+     */
+    function sfGetCSVRecordCount($fp) {
+
+        $count = 0;
+        while(!feof($fp)) {
+            $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
+            $count++;
+        }
+        // ファイルポインタを戻す
+        if (rewind($fp)) {
+            return $count-1;
+        } else {
+            return FALSE;
+        }
+    }
+
     //  CSV作成 コールバック関数
     function cbOutputProductCSV($data) {
         $line = $this->sfArrayToCSV($data);
@@ -139,12 +182,14 @@
         if (count($arrOutput) <= 0) return false; // 失敗終了
         $arrOutputCols = $arrOutput['col'];
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->setOrder($order);
         
         $objProduct = new SC_Product();
         $cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true);
-        $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL(),$where);
+        // このWhereを足さないと無効な規格も出力される。現行仕様と合わせる為追加。
+        $inner_where = 'dtb_products_class.del_flg = 0';
+        $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL($inner_where),$where);
         $header = $this->sfArrayToCSV($arrOutput['disp_name']);
         $header = mb_convert_encoding($header, 'SJIS-Win');
         $header .= "\r\n";
@@ -181,7 +226,7 @@
         $from = "dtb_review AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id ";
         $cols = SC_Utils_Ex::sfGetCommaList($this->arrREVIEW_CVSCOL);
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->setOption($option);
 
         $list_data = $objQuery->select($cols, $from, $where, $arrval);
@@ -200,7 +245,7 @@
         $from = "dtb_trackback AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id ";
         $cols = SC_Utils_Ex::sfGetCommaList($this->arrTRACKBACK_CVSCOL);
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->setOption($option);
 
         $list_data = $objQuery->select($cols, $from, $where, $arrval);
@@ -222,7 +267,7 @@
         if (count($arrOutput) <= 0) return false; // 失敗終了
         $arrOutputCols = $arrOutput['col'];
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->setOrder('rank DESC');
 
         $dataRows = $objQuery->select(
@@ -253,7 +298,7 @@
 
         $cols = SC_Utils_Ex::sfGetCommaList($arrCsvOutputCols);
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->setOption($option);
 
         $list_data = $objQuery->select($cols, $from, $where, $arrval, MDB2_FETCHMODE_ORDERED);

変更: branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php	2010-12-19 23:43:06 UTC (rev 19751)
+++ branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php	2010-12-19 23:53:26 UTC (rev 19752)
@@ -23,6 +23,7 @@
 
 // {{{ requires
 require_once(CLASS_PATH . "pages/admin/LC_Page_Admin.php");
+require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_CSV_Ex.php");
 
 /**
  * 商品登録CSVのページクラス.
@@ -43,7 +44,19 @@
 
     /** SC_UploadFile インスタンス */
     var $objUpfile;
+    
+    /** TAGエラーチェックフィールド情報 */
+    var $arrTagCheckItem;
+    
+    /** 商品テーブルカラム情報 (登録処理用) **/
+    var $arrProductColumn;
+    
+    /** 商品規格テーブルカラム情報 (登録処理用) **/
+    var $arrProductClassColumn;
 
+    /** 登録フォームカラム情報 **/
+    var $arrFormKeyList;
+
     /**
      * Page を初期化する.
      *
@@ -56,6 +69,16 @@
         $this->tpl_mainno = 'products';
         $this->tpl_subno = 'upload_csv';
         $this->tpl_subtitle = '商品登録CSV';
+        $this->csv_id = '1';
+
+        $masterData = new SC_DB_MasterData_Ex();
+        $this->arrDISP = $masterData->getMasterData("mtb_disp");
+        $this->arrSTATUS = $masterData->getMasterData("mtb_status");
+        $this->arrDELIVERYDATE = $masterData->getMasterData("mtb_delivery_date");
+        $this->arrProductType = $masterData->getMasterData("mtb_product_type");
+        $this->arrMaker = SC_Helper_DB_Ex::sfGetIDValueList("dtb_maker", "maker_id", "name");
+        $this->arrPayments = SC_Helper_DB_Ex::sfGetIDValueList("dtb_payment", "payment_id", "payment_method");            $this->arrAllowedTag = $masterData->getMasterData("mtb_allowed_tag");
+        $this->arrTagCheckItem = array();
     }
 
     /**
@@ -75,7 +98,7 @@
      */
     function action() {
         $objSess = new SC_Session();
-        $objDb = new SC_Helper_DB_Ex();
+        $this->objDb = new SC_Helper_DB_Ex();
         $objView = new SC_SiteView();
 
         // 認証可否の判定
@@ -83,12 +106,29 @@
 
         // ファイル管理クラス
         $this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR);
-        // ファイル情報の初期化
+        // サイト基本情報 (ポイントレート初期値用)
+        $this->arrInfo = $this->objDb->sfGetBasisData();
+        // CSV管理ヘルパー
+        $this->objCSV = new SC_Helper_CSV();
+        // CSV構造読み込み
+        $arrCSVFrame = $this->objCSV->sfgetCsvOutput($this->csv_id);
+        
+        // CSV構造がインポート可能かのチェック
+        if( !$this->objCSV->sfIsImportCSVFrame($arrCSVFrame) ) {
+            // 無効なフォーマットなので初期状態に強制変更
+            $arrCSVFram = $this->objCSV->sfgetCsvOutput($this->csv_id, '', array(), $order ='no');
+            $this->tpl_is_format_default = true;
+        }
+        // CSV構造は更新可能なフォーマットかのフラグ取得
+        $this->tpl_is_update = $this->objCSV->sfIsUpdateCSVFrame($arrCSVFrame);
+
+        // CSVファイルアップロード情報の初期化
         $this->lfInitFile();
         // パラメータ管理クラス
         $this->objFormParam = new SC_FormParam();
         // パラメータ情報の初期化
-        $this->lfInitParam();
+        $this->lfInitParam($arrCSVFrame);
+        
         $colmax = $this->objFormParam->getCount();
         $this->objFormParam->setHtmlDispNameArray();
         $this->arrTitle = $this->objFormParam->getHtmlDispNameArray();
@@ -97,8 +137,13 @@
 
         switch($_POST['mode']) {
         case 'csv_upload':
+            // 登録先テーブル カラム情報の初期化
+            $this->lfInitTableInfo();
+            // 登録フォーム カラム情報
+            $this->arrFormKeyList = $this->objFormParam->getKeyList();
+            
             $err = false;
-            // エラーチェック
+            // CSVファイルアップロード エラーチェック
             $arrErr['csv_file'] = $this->objUpFile->makeTempFile('csv_file');
 
             if($arrErr['csv_file'] == "") {
@@ -131,12 +176,15 @@
                 }
 
                 // レコード数を得る
-                $rec_count = $this->lfCSVRecordCount($fp);
+                $rec_count = $this->objCSV->sfGetCSVRecordCount($fp);
+                if($rec_count === FALSE) {
+                    SC_Utils_Ex::sfDispError("");
+                }
 
                 $line = 0;      // 行数
                 $regist = 0;    // 登録数
 
-                $objQuery = new SC_Query();
+                $objQuery =& SC_Query::getSingletonInstance();
                 $objQuery->begin();
 
                 echo "■ CSV登録進捗状況 <br/><br/>\n";
@@ -174,9 +222,6 @@
                         $arrCSVErr = $this->lfCheckError();
                     }
 
-                    //販売方法チェックを行う
-                    $this->checkSalesKind( $this->objFormParam->keyname ,$arrCSV , $arrCSVErr );
-
                     // 入力エラーチェック
                     if(count($arrCSVErr) > 0) {
                         echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n";
@@ -201,8 +246,8 @@
                     $objQuery->commit();
                     echo "■" . $regist . "件のレコードを登録しました。";
                     // 商品件数カウント関数の実行
-                    $objDb->sfCategory_Count($objQuery);
-                    $objDb->sfMaker_Count($objQuery);
+                    $this->objDb->sfCategory_Count($objQuery);
+                    $this->objDb->sfMaker_Count($objQuery);
                 } else {
                     $objQuery->rollback();
                 }
@@ -232,7 +277,6 @@
         parent::destroy();
     }
 
-
     /**
      * ファイル情報の初期化を行う.
      *
@@ -246,186 +290,141 @@
     /**
      * 入力情報の初期化を行う.
      *
+     * @param array CSV構造設定配列
      * @return void
      */
-    function lfInitParam() {
-
-        // 商品ステータスの上限文字数の算出
-        $masterData = new SC_DB_MasterData_Ex();
-        $arrSTATUS = $masterData->getMasterData("mtb_status");
-        $product_flag_maxlen = max(array_keys($arrSTATUS));
-        unset($arrSTATUS);
-        unset($masterData);
-
-        $this->objFormParam->addParam("商品ID", "product_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-
-        $this->objFormParam->addParam("規格名1", "dummy1");
-        $this->objFormParam->addParam("規格名2", "dummy2");
-
-        $this->objFormParam->addParam("商品名", "name", STEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("公開フラグ(1:公開 2:非公開)", "status", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("商品ステータス", "product_flag", $product_flag_maxlen, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("商品コード", "product_code", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam(NORMAL_PRICE_TITLE, "price01", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam(SALE_PRICE_TITLE, "price02", PRICE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("在庫数", "stock", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("送料", "deliv_fee", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("ポイント付与率", "point_rate", PERCENTAGE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("購入制限", "sale_limit", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("メーカーURL", "comment1", URL_LEN, "KVa", array("SPTAB_CHECK","URL_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("検索ワード", "comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("備考欄(SHOP専用)", "note", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("一覧-メインコメント", "main_list_comment", MTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("一覧-メイン画像", "main_list_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("メインコメント", "main_comment", LLTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("メイン画像", "main_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("メイン拡大画像", "main_large_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブタイトル(1)", "sub_title1", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブコメント(1)", "sub_comment1", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ画像(1)", "sub_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ拡大画像(1)", "sub_large_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-
-        $this->objFormParam->addParam("詳細-サブタイトル(2)", "sub_title2", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブコメント(2)", "sub_comment2", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ画像(2)", "sub_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ拡大画像(2)", "sub_large_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-
-        $this->objFormParam->addParam("詳細-サブタイトル(3)", "sub_title3", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブコメント(3)", "sub_comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ画像(3)", "sub_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ拡大画像(3)", "sub_large_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-
-        $this->objFormParam->addParam("詳細-サブタイトル(4)", "sub_title4", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブコメント(4)", "sub_comment4", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ画像(4)", "sub_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ拡大画像(4)", "sub_large_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-
-        $this->objFormParam->addParam("詳細-サブタイトル(5)", "sub_title5", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブコメント(5)", "sub_comment5", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ画像(5)", "sub_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("詳細-サブ拡大画像(5)", "sub_large_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-
-        $this->objFormParam->addParam("発送日目安", "deliv_date_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-
-        for ($cnt = 1; $cnt <= RECOMMEND_PRODUCT_MAX; $cnt++) {
-            $this->objFormParam->addParam("関連商品($cnt)", "recommend_product_id$cnt", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK"));
-            $this->objFormParam->addParam("関連商品コメント($cnt)", "recommend_comment$cnt", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
+    function lfInitParam(&$arrCSVFrame) {
+        // 固有の初期値調整
+        $arrCSVFrame = $this->lfSetParamDefaultValue($arrCSVFrame);
+        // CSV項目毎の処理
+        foreach($arrCSVFrame as $item) {
+            if($item['status'] == '2') continue;
+            //サブクエリ構造の場合は AS名 を使用
+            if(preg_match_all('/\(.+\) as (.+)$/i', $item['col'], $match, PREG_SET_ORDER)) {
+                $col = $match[0][1];
+            }else{
+                $col = $item['col'];
+            }
+            // HTML_TAG_CHECKは別途実行なので除去し、別保存しておく
+            if(stripos($item['error_check_types'], 'HTML_TAG_CHECK') !== FALSE) {
+                $this->arrTagCheckItem[] = $item;
+                $error_check_types = str_replace('HTML_TAG_CHECK', '', $item['error_check_types']);
+            }else{
+                $error_check_types = $item['error_check_types'];
+            }
+            $arrErrorCheckTypes = explode(',', $error_check_types);
+            foreach($arrErrorCheckTypes as $key => $val) {
+                if(trim($val) == "") {
+                    unset($arrErrorCheckTypes[$key]);
+                }else{
+                    $arrErrorCheckTypes[$key] = trim($val);
+                }
+            }
+            // パラメーター登録
+            $this->objFormParam->addParam(
+                    $item['disp_name']
+                    , $col
+                    , constant($item['size_const_type'])
+                    , $item['mb_convert_kana_option']
+                    , $arrErrorCheckTypes
+                    , $item['default']
+                    , ($item['rw_flg'] != 2) ? true : false
+                    );
         }
-
-        $this->objFormParam->addParam("実商品・ダウンロード(1:実商品 2:ダウンロード)", "down", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK"));
-        $this->objFormParam->addParam("ダウンロードファイル名", "down_filename", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("ダウンロード商品用ファイル", "down_realfilename", LTEXT_LEN, "KVa", array("DOWN_FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK"));
-
-        $this->objFormParam->addParam("商品カテゴリ", "category_id", STEXT_LEN, "n", array("EXIST_CHECK", "SPTAB_CHECK"));
     }
+    
+    /**
+     * 入力チェックを行う.
+     *
+     * @return void
+     */
+    function lfCheckError() {
+        // 入力データを渡す。
+        $arrRet =  $this->objFormParam->getHashArray();
+        $objErr = new SC_CheckError($arrRet);
+        $objErr->arrErr = $this->objFormParam->checkError(false);
+        // HTMLタグチェックの実行
+        foreach($this->arrTagCheckItem as $item) {
+            $objErr->doFunc(array( $item['disp_name'], $item['col'], $this->arrAllowedTag), array("HTML_TAG_CHECK"));
+        }
+        // このフォーム特有の複雑系のエラーチェックを行う
+        if(count($objErr->arrErr) == 0) {
+            $objErr->arrErr = $this->lfCheckErrorDetail($arrRet, $objErr->arrErr);
+        }
+        return $objErr->arrErr;
+    }
 
     /**
+     * 保存先テーブル情報の初期化を行う.
+     *
+     * @return void
+     */
+    function lfInitTableInfo() {
+        $objQuery =& SC_Query::getSingletonInstance();
+        $this->arrProductColumn = $objQuery->listTableFields('dtb_products');
+        $this->arrProductClassColumn = $objQuery->listTableFields('dtb_products_class');
+    }
+    
+    /**
      * 商品登録を行う.
      *
+     * FIXME: 商品登録の実処理自体は、LC_Page_Admin_Products_Productと共通化して欲しい。
+     *
      * @param SC_Query $objQuery SC_Queryインスタンス
      * @param string|integer $line 処理中の行数
      * @return void
      */
     function lfRegistProduct($objQuery, $line = "") {
+        $objProduct = new SC_Product();
+        // 登録データ対象取得
+        $arrList = $this->objFormParam->getHashArray();
+        // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう)
+        $arrList['update_date'] = $this->lfGetDbFormatTimeWithLine($line);
 
-        $objDb = new SC_Helper_DB_Ex();
+        // 商品登録情報を生成する。
+        // 商品テーブルのカラムに存在しているもののうち、Form投入設定されていないデータは上書きしない。
+        $sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $this->arrProductColumn);
 
-        $arrRet = $this->objFormParam->getHashArray();
+        // 必須入力では無い項目だが、空文字では問題のある特殊なカラム値の初期値設定
+        $sqlval = $this->lfSetProductDefaultData($sqlval);
 
-        // dtb_products以外に登録される値を除外する。
-        foreach($arrRet as $key => $val) {
-            switch($key) {
-            case 'product_code':
-            case 'price01':
-            case 'price02':
-            case 'stock':
-            case 'product_class_id':
-            case 'recommend_product_id1':
-            case 'recommend_product_id2':
-            case 'recommend_product_id3':
-            case 'recommend_product_id4':
-            case 'recommend_product_id5':
-            case 'recommend_product_id6':
-            case 'recommend_comment1':
-            case 'recommend_comment2':
-            case 'recommend_comment3':
-            case 'recommend_comment4':
-            case 'recommend_comment5':
-            case 'recommend_comment6':
-            case 'category_id':
-                break;
-            default:
-                if(!ereg("^dummy", $key)) {
-                    $sqlval[$key] = $val;
-                }
-                break;
-            }
-        }
-
-        // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう)
-        $time = date("Y-m-d H:i:s");
-        // 秒以下を生成
-        if($line != "") {
-            $microtime = sprintf("%06d", $line);
-            $time .= ".$microtime";
-        }
-        $sqlval['update_date'] = $time;
-        $sqlval['creator_id'] = $_SESSION['member_id'];
-
-        if($sqlval['status'] == "") {
-            $sqlval['status'] = 2;
-        }
-
         if($sqlval['product_id'] != "") {
-
             // UPDATEの実行
             $where = "product_id = ?";
             $objQuery->update("dtb_products", $sqlval, $where, array($sqlval['product_id']));
-
             $product_id = $sqlval['product_id'];
         } else {
             // 新規登録
-
             $sqlval['product_id'] = $objQuery->nextVal('dtb_products_product_id');
             $product_id = $sqlval['product_id'];
-            $sqlval['create_date'] = $time;
-
+            $sqlval['create_date'] = $arrList['update_date'];
             // INSERTの実行
             $objQuery->insert("dtb_products", $sqlval);
         }
 
         // カテゴリ登録
-        $arrCategory_id = explode("|", $arrRet["category_id"]);
-        $objDb->updateProductCategories($arrCategory_id, $product_id);
+        if($arrList['category_ids'] != "") {
+            $arrCategory_id = explode(',', $arrList['category_ids']);
+            $this->objDb->updateProductCategories($arrCategory_id, $product_id);
+        }
+        // ステータス登録
+        if($arrList['product_statuses'] != "") {
+            $arrStatus_id = explode(',', $arrList['product_statuses']);
+            $objProduct->setProductStatus($product_id, $arrStatus_id);
+        }
+        
+        // 商品規格情報を登録する
+        $this->lfRegistProductClass($objQuery, $arrList, $product_id, $arrList['product_class_id']);
 
-        // 規格登録
-        $this->lfRegistProductClass($objQuery, $arrRet, $product_id, $arrRet['product_class_id']);
-
         // 関連商品登録
-        $objQuery->delete("dtb_recommend_products", "product_id = ?", array($product_id));
-        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) {
-            $keyname = "recommend_product_id" . $i;
-            $comment_key = "recommend_comment" . $i;
-            if($arrRet[$keyname] != "") {
-                $arrProduct = $objQuery->select("product_id", "dtb_products", "product_id = ?", array($arrRet[$keyname]));
-                if($arrProduct[0]['product_id'] != "") {
-                    $arrval['product_id'] = $product_id;
-                    $arrval['recommend_product_id'] = $arrProduct[0]['product_id'];
-                    $arrval['comment'] = $arrRet[$comment_key];
-                    $arrval['update_date'] = "Now()";
-                    $arrval['create_date'] = "Now()";
-                    $arrval['creator_id'] = $_SESSION['member_id'];
-                    $arrval['rank'] = RECOMMEND_PRODUCT_MAX - $i + 1;
-                    $objQuery->insert("dtb_recommend_products", $arrval);
-                }
-            }
-        }
+        $this->lfRegistReccomendProducts($objQuery, $arrList, $product_id);
     }
 
     /**
      * 商品規格登録を行う.
      *
+     * FIXME: 商品規格登録の実処理自体は、LC_Page_Admin_Products_Productと共通化して欲しい。
+     *
      * @param SC_Query $objQuery SC_Queryインスタンス
      * @param array $arrList 商品規格情報配列
      * @param integer $product_id 商品ID
@@ -433,106 +432,396 @@
      * @return void
      */
     function lfRegistProductClass($objQuery, $arrList, $product_id, $product_class_id) {
-        $sqlval['product_code'] = $arrList["product_code"];
-        $sqlval['stock'] = $arrList["stock"];
-        if($sqlval['stock'] == "") {
-            $sqlval['stock_unlimited'] = '1';
-        } else {
-            $sqlval['stock_unlimited'] = '0';
-        }
-        $sqlval['price01'] = $arrList['price01'];
-        $sqlval['price02'] = $arrList['price02'];
-        $sqlval['creator_id'] = $_SESSION['member_id'];
+        $objProduct = new SC_Product();
+        // 商品規格登録情報を生成する。
+        // 商品規格テーブルのカラムに存在しているもののうち、Form投入設定されていないデータは上書きしない。
+        $sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $this->arrProductClassColumn);
+        // 必須入力では無い項目だが、空文字では問題のある特殊なカラム値の初期値設定
+        $sqlval = $this->lfSetProductClassDefaultData($sqlval);
 
-        // TODO $sqlval['member_id'] は何処から出てくる?
-        if($sqlval['member_id'] == "") {
-            $sqlval['creator_id'] = '0';
-        }
-
         if($product_class_id == "") {
             // 新規登録
-            $where = "product_id = ?";
-            // 念のために既存の規格を削除
-            $objQuery->delete("dtb_products_class", $where, array($product_id));
             $sqlval['product_id'] = $product_id;
-            $sqlval['classcategory_id1'] = '0';
-            $sqlval['classcategory_id2'] = '0';
-            $sqlval['create_date'] = "now()";
             $sqlval['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id');
+            $sqlval['create_date'] = $arrList['update_date'];
+            // INSERTの実行
             $objQuery->insert("dtb_products_class", $sqlval);
+            $product_class_id = $sqlval['product_class_id'];
         } else {
-            // 既存編集
-            $where = "product_id = ? AND product_class_id = ?";
-            $objQuery->update("dtb_products_class", $sqlval, $where, array($product_id, $product_class_id));
+            // UPDATEの実行
+            $where = "product_class_id = ?";
+            $objQuery->update("dtb_products_class", $sqlval, $where, array($product_class_id));
         }
+        // 支払い方法登録
+        if($arrList['product_payment_ids'] != "") {
+            $arrPayment_id = explode(',', $arrList['product_payment_ids']);
+            $objProduct->setPaymentOptions($product_class_id, $arrPayment_id);
+        }
     }
 
     /**
-     * 入力チェックを行う.
+     * 関連商品登録を行う.
      *
+     * FIXME: 商品規格登録の実処理自体は、LC_Page_Admin_Products_Productと共通化して欲しい。
+     *        DELETE/INSERT ではなく UPDATEへの変更も・・・
+     *
+     * @param SC_Query $objQuery SC_Queryインスタンス
+     * @param array $arrList 商品規格情報配列
+     * @param integer $product_id 商品ID
      * @return void
      */
-    function lfCheckError() {
+    function lfRegistReccomendProducts($objQuery, $arrList, $product_id) {
+        $objQuery->delete("dtb_recommend_products", "product_id = ?", array($product_id));
+        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) {
+            $keyname = "recommend_product_id" . $i;
+            $comment_key = "recommend_comment" . $i;
+            if($arrList[$keyname] != "") {
+                $arrProduct = $objQuery->select("product_id", "dtb_products", "product_id = ?", array($arrList[$keyname]));
+                if($arrProduct[0]['product_id'] != "") {
+                    $arrval['product_id'] = $product_id;
+                    $arrval['recommend_product_id'] = $arrProduct[0]['product_id'];
+                    $arrval['comment'] = $arrList[$comment_key];
+                    $arrval['update_date'] = $arrList['update_date'];
+                    $arrval['create_date'] = $arrList['update_date'];
+                    $arrval['creator_id'] = $_SESSION['member_id'];
+                    $arrval['rank'] = RECOMMEND_PRODUCT_MAX - $i + 1;
+                    $objQuery->insert("dtb_recommend_products", $arrval);
+                }
+            }
+        }
+    }
 
-        // 入力データを渡す。
-        $arrRet =  $this->objFormParam->getHashArray();
-        $objErr = new SC_CheckError($arrRet);
-        $objErr->arrErr = $this->objFormParam->checkError(false);
+    /**
+     * 初期値の設定
+     *
+     * @param array $arrCSVFrame CSV構造配列
+     * @return array $arrCSVFrame CSV構造配列
+     */
+    function lfSetParamDefaultValue(&$arrCSVFrame) {
+        foreach($arrCSVFrame as $key => $val) {
+            switch($val['col']) {
+                case 'status':
+                    $arrCSVFrame[$key]['default'] = DEFAULT_PRODUCT_DISP;
+                    break;
+                case 'del_flg':
+                    $arrCSVFrame[$key]['default'] = '0';
+                    break;
+                case 'point_rate':
+                    $arrCSVFrame[$key]['default'] = $this->arrInfo['point_rate'];
+                    break;
+                case 'product_type_id':
+                    $arrCSVFrame[$key]['default'] = DEFAULT_PRODUCT_DOWN;
+                    break;
+                case 'product_payment_ids':
+                    $arrCSVFrame[$key]['default'] = implode(',',array_keys($this->arrPayments));
+                    break;
+                default:
+                    break;
+            }
+        }
+        return $arrCSVFrame;
+    }
 
-        if(count($objErr->arrErr) == 0) {
-            $objQuery = new SC_Query();
-            // 商品ID、規格IDの存在チェック
-            if($arrRet['product_id'] != "") {
-                $count = $objQuery->count("dtb_products", "product_id = ?", array($arrRet['product_id']));
-                if($count == 0) {
-                    $objErr->arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。";
-                }
+    /**
+     * 商品データ登録前に特殊な値の持ち方をする部分のデータ部分の初期値補正を行う
+     *
+     * @param array $sqlval 商品登録情報配列
+     * @return $sqlval 登録情報配列
+     */
+    function lfSetProductDefaultData(&$sqlval) {
+        //新規登録時のみ設定する項目
+        if( $sqlval['product_id'] == "") {
+            if($sqlval['status'] == "") {
+                $sqlval['status'] = DEFAULT_PRODUCT_DISP;
             }
+        }
+        //共通で空欄時に上書きする項目
+        if($sqlval['del_flg'] == ""){
+            $sqlval['del_flg'] = '0'; //有効
+        }
+        if($sqlval['creator_id'] == "") {
+            $sqlval['creator_id'] = $_SESSION['member_id'];
+        }
+        return $sqlval;
+    }
 
-            if($arrRet['product_class_id'] != "") {
-                $count = 0;
-                if($arrRet['product_id'] != "") {
-                    $count = $objQuery->count("dtb_products_class", "product_id = ? AND product_class_id = ?", array($arrRet['product_id'], $arrRet['product_class_id']));
-                }
-                if($count == 0) {
-                    $objErr->arrErr['product_class_id'] = "※ 指定の規格IDは、登録されていません。";
-                }
+    /**
+     * 商品規格データ登録前に特殊な値の持ち方をする部分のデータ部分の初期値補正を行う
+     *
+     * @param array $sqlval 商品登録情報配列
+     * @return $sqlval 登録情報配列
+     */
+    function lfSetProductClassDefaultData(&$sqlval) {
+        //新規登録時のみ設定する項目
+        if($sqlval['product_class_id'] == "") {
+            if($sqlval['point_rate'] == "") {
+                $sqlval['point_rate'] = $this->arrInfo['point_rate'];
             }
+            if($sqlval['product_type_id'] == "") {
+                $sqlval['product_type_id'] = DEFAULT_PRODUCT_DOWN;
+            }
+            // TODO: 在庫数、無制限フラグの扱いについて仕様がぶれているので要調整
+            if($sqlval['stock'] == "" and $sqlval['stock_unlimited'] != '1') {
+                //在庫数設定がされておらず、かつ無制限フラグが設定されていない場合、強制無制限
+                $sqlval['stock_unlimited'] = '1';
+            }elseif($sqlval['stock'] != "" and $sqlval['stock_unlimited'] != '1') {
+                //在庫数設定時は在庫無制限フラグをクリア
+                $sqlval['stock_unlimited'] = '0';
+            }elseif($sqlval['stock'] != "" and $sqlval['stock_unlimited'] == '1') {
+                //在庫無制限フラグ設定時は在庫数をクリア
+                $sqlval['stock'] = '';
+            }
+        }else{
+            //更新時のみ設定する項目
+            if(array_key_exists('stock_unlimited', $sqlval) and $sqlval['stock_unlimited'] == '1') {
+                $sqlval['stock'] = '';
+            }
+        }
+        //共通で設定する項目
+        if($sqlval['del_flg'] == ""){
+            $sqlval['del_flg'] = '0'; //有効
+        }
+        if($sqlval['creator_id'] == "") {
+            $sqlval['creator_id'] = $_SESSION['member_id'];
+        }
+        return $sqlval;
+    }
 
-            // 存在するカテゴリIDかチェック
-            $arrCategory_id = explode("|", $arrRet['category_id']);
-            foreach ($arrCategory_id as $category_id) {
-                $count = $objQuery->count("dtb_category", "category_id = ?", array($category_id));
-                if($count == 0) {
-                    $objErr->arrErr['product_id'] = "※ 指定のカテゴリIDは、登録されていません。";
+    /**
+     * このフォーム特有の複雑な入力チェックを行う.
+     *
+     * @param array 確認対象データ
+     * @param array エラー配列
+     * @return array エラー配列
+     */
+    function lfCheckErrorDetail($item, $arrErr) {
+        // 商品IDの存在チェック
+        if(!$this->lfIsDbRecord('dtb_products', 'product_id', $item)) {
+            $arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。";
+        }
+        // 規格IDの存在チェック
+        if(!$this->lfIsDbRecord('dtb_products_class', 'product_class_id', $item)) {
+            $arrErr['product_class_id'] = "※ 指定の商品規格IDは、登録されていません。";
+        }
+        // 商品ID、規格IDの組合せチェック
+        if(array_search('product_class_id', $this->arrFormKeyList) !== FALSE
+                and $item['product_class_id'] != "") {
+            if($item['product_id'] == "") {
+                $arrErr['product_class_id'] = "※ 商品規格ID指定時には商品IDの指定が必須です。";
+            }else{
+                if(!$this->objDb->sfIsRecord('dtb_products_class', 'product_id, product_class_id'
+                        , array($item['product_id'], $item['product_class_id']))) {
+                    $arrErr['product_class_id'] = "※ 指定の商品IDと商品規格IDの組合せは正しくありません。";
                 }
             }
         }
-        return $objErr->arrErr;
+        // 規格組合せIDの存在チェック
+//        if(!$this->lfIsDbRecord('dtb_class_combination', 'class_combination_id', $item)) {
+//      SC_Utils::sfIsRecord が del_flg が無いと使えない為、個別処理
+        if(array_search('class_combination_id', $this->arrFormKeyList) !== FALSE
+                and $item['class_combination_id'] != "" ) {
+            $objQuery =& SC_Query::getSingletonInstance();
+            $ret = $objQuery->get('class_combination_id', 'dtb_class_combination', 'class_combination_id = ?', array($item['class_combination_id']));
+            if($ret == "") {
+                $arrErr['class_combination_id'] = "※ 指定の規格組合せIDは、登録されていません。";
+            }
+        }
+        // 表示ステータスの存在チェック
+        if(!$this->lfIsArrayRecord($this->arrDISP, 'status', $item)) {
+            $arrErr['status'] = "※ 指定の表示ステータスは、登録されていません。";
+        }
+        // メーカーIDの存在チェック
+        if(!$this->lfIsArrayRecord($this->arrMaker, 'maker_id', $item)) {
+            $arrErr['maker_id'] = "※ 指定のメーカーIDは、登録されていません。";
+        }
+        // 発送日目安IDの存在チェック
+        if(!$this->lfIsArrayRecord($this->arrDELIVERYDATE, 'deliv_date_id', $item)) {
+            $arrErr['deliv_date_id'] = "※ 指定の発送日目安IDは、登録されていません。";
+        }
+        // 発送日目安IDの存在チェック
+        if(!$this->lfIsArrayRecord($this->arrProductType, 'product_type_id', $item)) {
+            $arrErr['product_type_id'] = "※ 指定の商品種別IDは、登録されていません。";
+        }
+        // 関連商品IDの存在チェック
+        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) {
+            if(array_search('recommend_product_id' . $i, $this->arrFormKeyList) !== FALSE
+                    and $item['recommend_product_id' . $i] != ""
+                    and !$this->objDb->sfIsRecord('dtb_products', 'product_id', (array)$item['recommend_product_id' . $i]) ) {
+                $arrErr['recommend_product_id' . $i] = "※ 指定の関連商品ID($i)は、登録されていません。";
+            }
+        }
+        // カテゴリIDの存在チェック
+        if(!$this->lfIsDbRecordMulti('dtb_category', 'category_id', 'category_ids', $item, ',')) {
+            $arrErr['category_ids'] = "※ 指定のカテゴリIDは、登録されていません。";
+        }
+        // ステータスIDの存在チェック
+        if(!$this->lfIsArrayRecordMulti($this->arrSTATUS, 'product_statuses', $item, ',')) {
+            $arrErr['product_statuses'] = "※ 指定のステータスIDは、登録されていません。";
+        }
+        // 支払い方法IDの存在チェック
+        if(!$this->lfIsArrayRecordMulti($this->arrPayments, 'product_payment_ids', $item, ',')) {
+            $arrErr['product_payment_ids'] = "※ 指定の支払い方法IDは、登録されていません。";
+        }
+        // 削除フラグのチェック
+        if(array_search('del_flg', $this->arrFormKeyList) !== FALSE
+                and $item['del_flg'] != "") {
+            if(!($item['del_flg'] == "0" or $item['del_flg'] == "1")) {
+                $arrErr['del_flg'] = "※ 削除フラグは「0」(有効)、「1」(削除)のみが有効な値です。";
+            }
+        }
+/*
+    TODO: 在庫数の扱いが2.4仕様ではぶれているのでどうするか・・
+        // 在庫数/在庫無制限フラグの有効性に関するチェック
+        if($item['stock'] == "") {
+            if(array_search('stock_unlimited', $this->arrFormKeyList) === FALSE) {
+                $arrErr['stock'] = "※ 在庫数は必須です(無制限フラグ項目がある場合のみ空欄許可)。";
+            }else if($item['stock_unlimited'] != "1") {
+                $arrErr['stock'] = "※ 在庫数または在庫無制限フラグのいずれかの入力が必須です。";
+            }
+        }
+*/        
+        // ダウンロード商品チェック
+        if(array_search('product_type_id', $this->arrFormKeyList) !== FALSE
+                 and $item['product_type_id'] == PRODUCT_TYPE_NORMAL) {
+            //実商品の場合
+            if( $item['down_filename'] != "") {
+                $arrErr['down_filename'] = "※ 実商品の場合はダウンロードファイル名は入力できません。";
+            }
+            if( $item['down_realfilename'] != "") {
+                $arrErr['down_realfilename'] = "※ 実商品の場合はダウンロード商品用ファイルアップロードは入力できません。";
+            }
+        }elseif(array_search('product_type_id', $this->arrFormKeyList) !== FALSE
+                and $item['product_type_id'] == PRODUCT_TYPE_DOWNLOAD) {
+            //ダウンロード商品の場合
+            if( $item['down_filename'] == "") {
+                $arrErr['down_filename'] = "※ ダウンロード商品の場合はダウンロードファイル名は必須です。";
+            }
+            if( $item['down_realfilename'] == "") {
+                $arrErr['down_realfilename'] = "※ ダウンロード商品の場合はダウンロード商品用ファイルアップロードは必須です。";
+            }
+        }
+        return $arrErr;
     }
 
+    // TODO: ここから下のルーチンは汎用ルーチンとして移動が望ましい
+
     /**
-     * CSVのカウント数を得る.
+     * 指定された行番号をmicrotimeに付与してDB保存用の時間を生成する。
+     * トランザクション内のnow()は全てcommit()時の時間に統一されてしまう為。
      *
-     * @param resource $fp fopenを使用して作成したファイルポインタ
-     * @return integer CSV のカウント数
+     * @param string $line_no 行番号
+     * @return string $time DB保存用の時間文字列
      */
-    function lfCSVRecordCount($fp) {
+    function lfGetDbFormatTimeWithLine($line_no = '') {
+        $time = date("Y-m-d H:i:s");
+        // 秒以下を生成
+        if($line != '') {
+            $microtime = sprintf("%06d", $line_no);
+            $time .= ".$microtime";
+        }
+        return $time;
+    }
 
-        $count = 0;
-        while(!feof($fp)) {
-            $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
-            $count++;
+    /**
+     * 指定されたキーと複数値の有効性の配列内確認
+     *
+     * @param string $arr チェック対象配列
+     * @param string $keyname フォームキー名
+     * @param array  $item 入力データ配列
+     * @param string $delimiter 分割文字
+     * @return boolean true:有効なデータがある false:有効ではない
+     */
+    function lfIsArrayRecordMulti($arr, $keyname, $item, $delimiter = ',') {
+        if(array_search($keyname, $this->arrFormKeyList) === FALSE) {
+            return true;
         }
-        // ファイルポインタを戻す
-        if (rewind($fp)) {
-            return $count-1;
-        } else {
-            SC_Utils_Ex::sfDispError("");
+        if($item[$keyname] == "") {
+            return true;
         }
+        $arrItems = explode($delimiter, $item[$keyname]);
+        //空項目のチェック 1つでも空指定があったら不正とする。
+        if(array_search("", $arrItems) !== FALSE) {
+            return false;
+        }
+        //キー項目への存在チェック
+        foreach($arrItems as $item) {
+            if(!array_key_exists($item, $arr)) {
+                return false;
+            }
+        }
+        return true;
     }
 
     /**
+     * 指定されたキーと複数値の有効性のDB確認
+     *
+     * @param string $table テーブル名
+     * @param string $tblkey テーブルキー名
+     * @param string $keyname フォームキー名
+     * @param array  $item 入力データ配列
+     * @param string $delimiter 分割文字
+     * @return boolean true:有効なデータがある false:有効ではない
+     */
+    function lfIsDbRecordMulti($table, $tblkey, $keyname, $item, $delimiter = ',') {
+        if(array_search($keyname, $this->arrFormKeyList) === FALSE) {
+            return true;
+        }
+        if($item[$keyname] == "") {
+            return true;
+        }
+        $arrItems = explode($delimiter, $item[$keyname]);
+        //空項目のチェック 1つでも空指定があったら不正とする。
+        if(array_search("", $arrItems) !== FALSE) {
+            return false;
+        }
+        $count = count($arrItems);
+        $where = $tblkey ." IN (" . implode(",", array_fill(0, $count, "?")) . ")";
+        
+        $objQuery =& SC_Query::getSingletonInstance();
+        $db_count = $objQuery->count($table, $where, $arrItems);
+        if($count != $db_count) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 指定されたキーと値の有効性のDB確認
+     *
+     * @param string $table テーブル名
+     * @param string $keyname キー名
+     * @param array  $item 入力データ配列
+     * @return boolean true:有効なデータがある false:有効ではない
+     */
+    function lfIsDbRecord($table, $keyname, $item) {
+        if(array_search($keyname, $this->arrFormKeyList) !== FALSE  //入力対象である
+                and $item[$keyname] != ""   // 空ではない
+                and !$this->objDb->sfIsRecord($table, $keyname, (array)$item[$keyname]) //DBに存在するか
+                ) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 指定されたキーと値の有効性の配列内確認
+     *
+     * @param string $arr チェック対象配列
+     * @param string $keyname キー名
+     * @param array  $item 入力データ配列
+     * @return boolean true:有効なデータがある false:有効ではない
+     */
+    function lfIsArrayRecord($arr, $keyname, $item) {
+        if(array_search($keyname, $this->arrFormKeyList) !== FALSE //入力対象である
+                and $item[$keyname] != "" // 空ではない
+                and !array_key_exists($item[$keyname], $arr) //配列に存在するか
+                ) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
      * 引数の文字列をエラー出力する.
      *
      * 引数 $val の内容は, htmlspecialchars() によってサニタイズされる
@@ -543,54 +832,7 @@
     function printError($val) {
          echo "<font color=\"red\">"
              . htmlspecialchars($val, ENT_QUOTES)
-             . "</font></br>\n";
+             . "</font><br />\n";
     }
-
-    /**
-     * 実商品・ダウンロード判定チェック処理
-     *
-     * @param $p_keyname    csv項目番号配列
-     * @param $p_arrCSV     csv入力データ配列
-     * @param $p_arrCSVErr  エラー格納配列
-     */
-    function checkSalesKind( $p_keyname , $p_arrCSV , &$p_arrCSVErr ){
-
-        //実商品・ダウンロードカラムの値を取得する
-        $sDownFlg_Key = array_search('down', $p_keyname );
-        if( $sDownFlg_Key != '' ){
-            //実商品・ダウンロードカラムが存在する場合
-            //実商品・ダウンロードカラムの値を取得する
-            $sDownFlg = $p_arrCSV[$sDownFlg_Key];
-
-            //ダウンロードファイル名を取得する
-            $sFilename_Key = array_search('down_filename', $p_keyname );
-            $sFilename = $p_arrCSV[$sFilename_Key];
-
-            //ダウンロード商品用ファイルアップロードを取得する
-            $sRealdown_filename_Key = array_search('down_realfilename', $p_keyname );
-            $sRealdown_filename = $p_arrCSV[$sRealdown_filename_Key];
-
-            if( $sDownFlg == 1 ){
-                //実商品の場合
-                if( mb_strlen($sFilename) > 0 ){
-                    $p_arrCSVErr["down_filename"] = "※ 実商品の場合はダウンロードファイル名は入力できません。\n";
-                }
-                if( mb_strlen($sRealdown_filename) > 0 ){
-                    $p_arrCSVErr["down_realfilename"] = "※ 実商品の場合はダウンロード商品用ファイルアップロードは入力できません。\n";
-                }
-            }else if( $sDownFlg == 2 ){
-                //ダウンロード商品の場合
-                if( mb_strlen($sFilename) <= 0 ){
-                    $p_arrCSVErr["down_filename"] = "※ ダウンロード商品の場合はダウンロードファイル名は必須です。\n";
-                }
-                if( mb_strlen($sRealdown_filename) <=  0 ){
-                    $p_arrCSVErr["down_realfilename"] = "※ ダウンロード商品の場合はダウンロード商品用ファイルアップロードは必須です。\n";
-                }
-            }else{
-                //その他
-                $p_arrCSVErr["down"] = "※ 実商品・ダウンロード(1:実商品 2:ダウンロード)の設定が不正です。\n";
-            }
-        }
-    }
 }
 ?>




Svn-src-all メーリングリストの案内