[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 メーリングリストの案内