source: branches/version-2_11-dev/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVClass.php @ 20818

Revision 20818, 31.8 KB checked in by saiteisan, 13 years ago (diff)

refs #1195 (商品規格CSV登録部分作成更新は未完成)

Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ requires
25require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
26require_once CLASS_EX_REALDIR . 'helper_extends/SC_Helper_CSV_Ex.php';
27
28/**
29 * 規格登録CSVのページクラス.
30 *
31 * @package Page
32 * @author LOCKON CO.,LTD.
33 * @version $Id:LC_Page_Admin_Products_UploadCSVClass.php 15532 2007-08-31 14:39:46Z nanasess $
34 *
35 */
36class LC_Page_Admin_Products_UploadCSVClass extends LC_Page_Admin_Ex {
37
38    // }}}
39    // {{{ functions
40
41    /** TAGエラーチェックフィールド情報 */
42    var $arrTagCheckItem;
43
44    /** 商品規格テーブルカラム情報 (登録処理用) **/
45    var $arrProductClassColumn;
46
47    /** 登録フォームカラム情報 **/
48    var $arrFormKeyList;
49
50    var $arrRowErr;
51
52    var $arrRowResult;
53
54    /**
55     * Page を初期化する.
56     *
57     * @return void
58     */
59    function init() {
60        parent::init();
61        $this->tpl_mainpage = 'products/upload_csv_class.tpl';
62        $this->tpl_subnavi = 'products/subnavi.tpl';
63        $this->tpl_mainno = 'products';
64        $this->tpl_subno = 'upload_csv_class';
65        $this->tpl_subtitle = '規格登録CSV';
66        $this->csv_id = '6';
67
68        $masterData = new SC_DB_MasterData_Ex();
69        $this->arrProductType = $masterData->getMasterData("mtb_product_type");
70        $this->arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
71        $this->arrTagCheckItem = array();
72    }
73
74    /**
75     * Page のプロセス.
76     *
77     * @return void
78     */
79    function process() {
80        $this->action();
81        $this->sendResponse();
82    }
83
84    /**
85     * Page のアクション.
86     *
87     * @return void
88     */
89    function action() {
90        $this->objDb = new SC_Helper_DB_Ex();
91
92        // CSV管理ヘルパー
93        $objCSV = new SC_Helper_CSV_Ex();
94        // CSV構造読み込み
95        $arrCSVFrame = $objCSV->sfGetCsvOutput($this->csv_id);
96
97        // CSV構造がインポート可能かのチェック
98        if(!$objCSV->sfIsImportCSVFrame($arrCSVFrame) ) {
99            // 無効なフォーマットなので初期状態に強制変更
100            $arrCSVFrame = $objCSV->sfGetCsvOutput($this->csv_id, '', array(), 'no');
101            $this->tpl_is_format_default = true;
102        }
103        // CSV構造は更新可能なフォーマットかのフラグ取得
104        $this->tpl_is_update = $objCSV->sfIsUpdateCSVFrame($arrCSVFrame);
105
106        // CSVファイルアップロード情報の初期化
107        $objUpFile = new SC_UploadFile_Ex(IMAGE_TEMP_REALDIR, IMAGE_SAVE_REALDIR);
108        $this->lfInitFile($objUpFile);
109
110        // パラメータ情報の初期化
111        $objFormParam = new SC_FormParam_Ex();
112        $this->lfInitParam($objFormParam, $arrCSVFrame);
113
114        $objFormParam->setHtmlDispNameArray();
115        $this->arrTitle = $objFormParam->getHtmlDispNameArray();
116
117        switch($this->getMode()) {
118        case 'csv_upload':
119            $this->doUploadCsv($objFormParam, $objUpFile);
120            break;
121        default:
122            break;
123        }
124    }
125
126    /**
127     * 登録/編集結果のメッセージをプロパティへ追加する
128     *
129     * @param integer $line_count 行数
130     * @param stirng $message メッセージ
131     * @return void
132     */
133    function addRowResult($line_count, $message) {
134        $this->arrRowResult[] = $line_count . "行目:" . $message;
135    }
136
137    /**
138     * 登録/編集結果のエラーメッセージをプロパティへ追加する
139     *
140     * @param integer $line_count 行数
141     * @param stirng $message メッセージ
142     * @return void
143     */
144    function addRowErr($line_count, $message) {
145        $this->arrRowErr[] = $line_count . "行目:" . $message;
146    }
147
148    /**
149     * CSVアップロードを実行します.
150     *
151     * @return void
152     */
153    function doUploadCsv(&$objFormParam, &$objUpFile) {
154        // ファイルアップロードのチェック
155        $objUpFile->makeTempFile('csv_file');
156        $arrErr = $objUpFile->checkExists();
157        if (count($arrErr) > 0) {
158            $this->arrErr = $arrErr;
159            return;
160        }
161        // 一時ファイル名の取得
162        $filepath = $objUpFile->getTempFilePath('csv_file');
163        // CSVファイルの文字コード変換
164        $enc_filepath = SC_Utils_Ex::sfEncodeFile($filepath, CHAR_CODE, CSV_TEMP_REALDIR);
165        // CSVファイルのオープン
166        $fp = fopen($enc_filepath, 'r');
167        // 失敗した場合はエラー表示
168        if (!$fp) {
169             SC_Utils_Ex::sfDispError("");
170        }
171
172        // 登録先テーブル カラム情報の初期化
173        $this->lfInitTableInfo();
174
175        // 登録フォーム カラム情報
176        $this->arrFormKeyList = $objFormParam->getKeyList();
177
178        // 登録対象の列数
179        $col_max_count = $objFormParam->getCount();
180        // 行数
181        $line_count = 0;
182
183        $objQuery =& SC_Query_Ex::getSingletonInstance();
184        $objQuery->begin();
185
186        $errFlag = false;
187        $all_line_checked = false;
188
189        while (!feof($fp)) {
190            $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
191
192            // 全行入力チェック後に、ファイルポインターを先頭に戻す
193            if (feof($fp) && !$all_line_checked) {
194                rewind($fp);
195                $line_count = 0;
196                $all_line_checked = true;
197                continue;
198            }
199
200            // 行カウント
201            $line_count++;
202            // ヘッダ行はスキップ
203            if ($line_count == 1) {
204                continue;
205            }
206            // 空行はスキップ
207            if (empty($arrCSV)) {
208                continue;
209            }
210            // 列数が異なる場合はエラー
211            $col_count = count($arrCSV);
212            if ($col_max_count != $col_count) {
213                $this->addRowErr($line_count, "※ 項目数が" . $col_count . "個検出されました。項目数は" . $col_max_count . "個になります。");
214                $errFlag = true;
215                break;
216            }
217            // シーケンス配列を格納する。
218            $objFormParam->setParam($arrCSV, true);
219            $arrRet = $objFormParam->getHashArray();
220            $objFormParam->setParam($arrRet);
221            // 入力値の変換
222            $objFormParam->convParam();
223            // <br>なしでエラー取得する。
224            $arrCSVErr = $this->lfCheckError($objFormParam);
225
226            // 入力エラーチェック
227            if (count($arrCSVErr) > 0) {
228                foreach ($arrCSVErr as $err) {
229                    $this->addRowErr($line_count, $err);
230                }
231                $errFlag = true;
232                break;
233            }
234
235            if ($all_line_checked) {
236                $this->lfRegistProduct($objQuery, $line_count, $objFormParam);
237                $arrParam = $objFormParam->getHashArray();
238
239                $this->addRowResult($line_count, "商品ID:".$arrParam['product_id'] . " / ".$arrParam['parent_class_name'].":".$arrParam['parent_classcategory_name']." ".$arrParam['class_name'].":".$arrParam['classcategory_name']);
240            }
241        }
242
243        // 実行結果画面を表示
244        $this->tpl_mainpage = 'products/upload_csv_class_complete.tpl';
245
246        fclose($fp);
247
248        if ($errFlag) {
249            $objQuery->rollback();
250            return;
251        }
252
253        $objQuery->commit();
254
255        // 商品件数カウント関数の実行
256        $this->objDb->sfCountCategory($objQuery);
257        $this->objDb->sfCountMaker($objQuery);
258        return;
259    }
260
261    /**
262     * デストラクタ.
263     *
264     * @return void
265     */
266    function destroy() {
267        parent::destroy();
268    }
269
270    /**
271     * ファイル情報の初期化を行う.
272     *
273     * @return void
274     */
275    function lfInitFile(&$objUpFile) {
276        $objUpFile->addFile("CSVファイル", 'csv_file', array('csv'), CSV_SIZE, true, 0, 0, false);
277    }
278
279    /**
280     * 入力情報の初期化を行う.
281     *
282     * @param array CSV構造設定配列
283     * @return void
284     */
285    function lfInitParam(&$objFormParam, &$arrCSVFrame) {
286        // 固有の初期値調整
287        $arrCSVFrame = $this->lfSetParamDefaultValue($arrCSVFrame);
288        // CSV項目毎の処理
289        foreach($arrCSVFrame as $item) {
290            if($item['status'] == CSV_COLUMN_STATUS_FLG_DISABLE) continue;
291            //サブクエリ構造の場合は AS名 を使用
292            if(preg_match_all('/\(.+\) as (.+)$/i', $item['col'], $match, PREG_SET_ORDER)) {
293                $col = $match[0][1];
294            }else{
295                $col = $item['col'];
296            }
297            // HTML_TAG_CHECKは別途実行なので除去し、別保存しておく
298            if(strpos(strtoupper($item['error_check_types']), 'HTML_TAG_CHECK') !== FALSE) {
299                $this->arrTagCheckItem[] = $item;
300                $error_check_types = str_replace('HTML_TAG_CHECK', '', $item['error_check_types']);
301            }else{
302                $error_check_types = $item['error_check_types'];
303            }
304            $arrErrorCheckTypes = explode(',', $error_check_types);
305            foreach($arrErrorCheckTypes as $key => $val) {
306                if(trim($val) == "") {
307                    unset($arrErrorCheckTypes[$key]);
308                }else{
309                    $arrErrorCheckTypes[$key] = trim($val);
310                }
311            }
312            // パラメーター登録
313            $objFormParam->addParam(
314                    $item['disp_name']
315                    , $col
316                    , constant($item['size_const_type'])
317                    , $item['mb_convert_kana_option']
318                    , $arrErrorCheckTypes
319                    , $item['default']
320                    , ($item['rw_flg'] != CSV_COLUMN_RW_FLG_READ_ONLY) ? true : false
321                    );
322        }
323    }
324
325    /**
326     * 入力チェックを行う.
327     *
328     * @return void
329     */
330    function lfCheckError(&$objFormParam) {
331        // 入力データを渡す。
332        $arrRet =  $objFormParam->getHashArray();
333        $objErr = new SC_CheckError_Ex($arrRet);
334        $objErr->arrErr = $objFormParam->checkError(false);
335        // HTMLタグチェックの実行
336        foreach($this->arrTagCheckItem as $item) {
337            $objErr->doFunc(array( $item['disp_name'], $item['col'], $this->arrAllowedTag), array("HTML_TAG_CHECK"));
338        }
339        // このフォーム特有の複雑系のエラーチェックを行う
340        if(count($objErr->arrErr) == 0) {
341            $objErr->arrErr = $this->lfCheckErrorDetail($arrRet, $objErr->arrErr);
342        }
343        return $objErr->arrErr;
344    }
345
346    /**
347     * 保存先テーブル情報の初期化を行う.
348     *
349     * @return void
350     */
351    function lfInitTableInfo() {
352        $objQuery =& SC_Query_Ex::getSingletonInstance();
353        $this->arrProductClassColumn = $objQuery->listTableFields('dtb_products_class');
354    }
355
356    /**
357     * 商品登録を行う.
358     *
359     * @param SC_Query $objQuery SC_Queryインスタンス
360     * @param string|integer $line 処理中の行数
361     * @return void
362     */
363    function lfRegistProduct($objQuery, $line = "", &$objFormParam) {
364        // 登録データ対象取得
365        $arrList = $objFormParam->getHashArray();
366        // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう)
367        $update_date = $this->lfGetDbFormatTimeWithLine($line);
368
369        $sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $this->arrProductClassColumn);
370        // 必須入力では無い項目だが、空文字では問題のある特殊なカラム値の初期値設定
371        $sqlval = $this->lfSetProductClassDefaultData($sqlval);
372
373        if($arrList['product_class_id'] == "") {
374            // 新規登録
375            $sqlval['product_id'] = $arrList['product_id'];
376            $product_class_id = $objQuery->nextVal('dtb_products_class_product_class_id');
377            $sqlval['product_class_id'] = $product_class_id;
378            $sqlval['create_date'] = $update_date;
379            $sqlval['update_date'] = $update_date;
380            // INSERTの実行
381            $objQuery->insert("dtb_products_class", $sqlval);
382            $product_class_id = $sqlval['product_class_id'];
383           
384            //親規格登録
385            $parent_class_id = $objQuery->getOne("SELECT class_id FROM dtb_class WHERE name = ?", array($arrList['parent_class_name']));
386            if($parent_class_id == ""){
387                $parent_class_id = $this->lfInsertClass($arrList['parent_class_name'], $update_date, $objQuery);
388            }
389           
390            //親規格カテゴリ登録
391            $parent_classcategory_id = $objQuery->getOne("SELECT classcategory_id FROM dtb_classcategory WHERE class_id =? AND name = ?", array($parent_class_id,$arrList['parent_classcategory_name']));
392            if($parent_classcategory_id == ""){
393                $parent_classcategory_id = $this->lfInsertClassCategory($parent_class_id, $arrList['parent_classcategory_name'], $update_date, $objQuery);
394            }
395           
396            //子規格名があれば子規格登録
397            if($arrList['class_name'] != ""){
398            $child_class_id = $objQuery->getOne("SELECT class_id FROM dtb_class WHERE name = ?", array($arrList['class_name']));
399            if($child_class_id == ""){
400                $child_class_id = $this->lfInsertClass($arrList['class_name'],$update_date, $objQuery);
401            }
402            }else{
403                $child_class_id = "";
404            }
405           
406            //子規格カテゴリ登録
407            if($arrList['classcategory_name'] != ""){
408            $child_classcategory_id = $objQuery->getOne("SELECT classcategory_id FROM dtb_classcategory WHERE class_id =? AND name = ?", array($parent_class_id,$arrList['classcategory_name']));
409            if($child_classcategory_id == ""){
410                $child_classcategory_id = $this->lfInsertClassCategory($child_class_id, $arrList['classcategory_name'], $update_date, $objQuery);
411            }
412            }else{
413                $child_classcategory_id = "";
414            }
415           
416            //親規格組み合わせ登録
417            $class_combination_id = $objQuery->nextVal('dtb_class_combination_class_combination_id');
418            $arrComb1['class_combination_id'] = $class_combination_id;
419            $arrComb1['classcategory_id'] = $parent_classcategory_id;
420            $arrComb1['level'] = 1;
421            $objQuery->insert('dtb_class_combination', $arrComb1);
422            // 子規格も登録する場合
423            if (!SC_Utils_Ex::isBlank($child_classcategory_id)) {
424                $class_combination_id = $objQuery->nextVal('dtb_class_combination_class_combination_id');
425                $arrComb2['class_combination_id'] = $class_combination_id;
426                $arrComb2['classcategory_id'] = $child_classcategory_id;
427                $arrComb2['parent_class_combination_id'] = $arrComb1['class_combination_id'];
428                $arrComb2['level'] = 2;
429                $objQuery->insert('dtb_class_combination', $arrComb2);
430            }
431           
432            //dtb_products_classの組み合わせIDを更新
433            $sqlval = array();
434            $sqlval['class_combination_id'] = $class_combination_id;
435            $where = "product_class_id = ?";
436            $objQuery->update("dtb_products_class", $sqlval, $where, array($product_class_id));
437        } else {
438            // UPDATEの実行
439            $where = "product_class_id = ?";
440            $sqlval['update_date'] = $update_date;
441            $objQuery->update("dtb_products_class", $sqlval, $where, array($product_class_id));
442        }
443        // 支払い方法登録
444        if($arrList['product_payment_ids'] != "") {
445            $arrPayment_id = explode(',', $arrList['product_payment_ids']);
446            $objProduct->setPaymentOptions($product_class_id, $arrPayment_id);
447        }
448    }
449
450    /**
451     * 初期値の設定
452     *
453     * @param array $arrCSVFrame CSV構造配列
454     * @return array $arrCSVFrame CSV構造配列
455     */
456    function lfSetParamDefaultValue(&$arrCSVFrame) {
457        foreach($arrCSVFrame as $key => $val) {
458            switch($val['col']) {
459                case 'product_type_id':
460                    $arrCSVFrame[$key]['default'] = DEFAULT_PRODUCT_DOWN;
461                    break;
462                case 'stock_unlimited':
463                    $arrCSVFrame[$key]['default'] = UNLIMITED_FLG_LIMITED;
464                default:
465                    break;
466            }
467        }
468        return $arrCSVFrame;
469    }
470
471   /**
472     * 規格情報を新規登録
473     *
474     * @return integer class_id
475     */
476    function lfInsertClass($name, $update_date, $objQuery) {
477        // INSERTする値を作成する。
478        $sqlval['name'] = $name;
479        $sqlval['creator_id'] = $_SESSION['member_id'];
480        $sqlval['rank'] = $objQuery->max('rank', "dtb_class") + 1;
481        $sqlval['create_date'] = $update_date;
482        $sqlval['update_date'] = $update_date;
483        // INSERTの実行
484        $sqlval['class_id'] = $objQuery->nextVal('dtb_class_class_id');
485        $objQuery->insert("dtb_class", $sqlval);
486        return $sqlval['class_id'];
487    }
488
489   /**
490     * 規格分類情報を新規登録
491     *
492     * @return integer 規格カテゴリID
493     */
494    function lfInsertClassCategory($class_id, $name, $update_date, $objQuery) {
495        // 親規格IDの存在チェック
496        $where = "del_flg <> 1 AND class_id = ?";
497        $class_id = $objQuery->get("class_id", "dtb_class", $where, array($class_id));
498        if(!SC_Utils_Ex::isBlank($class_id)) {
499            // INSERTする値を作成する。
500            $sqlval['name'] = $name;
501            $sqlval['class_id'] = $class_id;
502            $sqlval['creator_id'] = $_SESSION['member_id'];
503            $sqlval['rank'] = $objQuery->max('rank', "dtb_classcategory", $where, array($class_id)) + 1;
504            $sqlval['create_date'] = $update_date;
505            $sqlval['update_date'] = $update_date;
506            // INSERTの実行
507            $sqlval['classcategory_id'] = $objQuery->nextVal('dtb_classcategory_classcategory_id');
508            $objQuery->insert("dtb_classcategory", $sqlval);
509        }
510        return $sqlval['classcategory_id'];
511    }
512
513    /**
514     * 商品規格データ登録前に特殊な値の持ち方をする部分のデータ部分の初期値補正を行う
515     *
516     * @param array $sqlval 商品登録情報配列
517     * @return $sqlval 登録情報配列
518     */
519    function lfSetProductClassDefaultData(&$sqlval) {
520        //新規登録時のみ設定する項目
521        if($sqlval['product_class_id'] == "") {
522            if($sqlval['point_rate'] == "") {
523                $sqlval['point_rate'] = $this->arrInfo['point_rate'];
524            }
525            if($sqlval['product_type_id'] == "") {
526                $sqlval['product_type_id'] = DEFAULT_PRODUCT_DOWN;
527            }
528            // TODO: 在庫数、無制限フラグの扱いについて仕様がぶれているので要調整
529            if($sqlval['stock'] == "" and $sqlval['stock_unlimited'] != UNLIMITED_FLG_UNLIMITED) {
530                //在庫数設定がされておらず、かつ無制限フラグが設定されていない場合、強制無制限
531                $sqlval['stock_unlimited'] = UNLIMITED_FLG_UNLIMITED;
532            }elseif($sqlval['stock'] != "" and $sqlval['stock_unlimited'] != UNLIMITED_FLG_UNLIMITED) {
533                //在庫数設定時は在庫無制限フラグをクリア
534                $sqlval['stock_unlimited'] = UNLIMITED_FLG_LIMITED;
535            }elseif($sqlval['stock'] != "" and $sqlval['stock_unlimited'] == UNLIMITED_FLG_UNLIMITED) {
536                //在庫無制限フラグ設定時は在庫数をクリア
537                $sqlval['stock'] = '';
538            }
539        }else{
540            //更新時のみ設定する項目
541            if(array_key_exists('stock_unlimited', $sqlval) and $sqlval['stock_unlimited'] == UNLIMITED_FLG_UNLIMITED) {
542                $sqlval['stock'] = '';
543            }
544        }
545        //共通で設定する項目
546        if($sqlval['del_flg'] == ""){
547            $sqlval['del_flg'] = '0'; //有効
548        }
549        if($sqlval['creator_id'] == "") {
550            $sqlval['creator_id'] = $_SESSION['member_id'];
551        }
552        return $sqlval;
553    }
554
555    /**
556     * このフォーム特有の複雑な入力チェックを行う.
557     *
558     * @param array 確認対象データ
559     * @param array エラー配列
560     * @return array エラー配列
561     */
562    function lfCheckErrorDetail($item, $arrErr) {
563        // 商品IDの存在チェック
564        if(!$this->lfIsDbRecord('dtb_products', 'product_id', $item)) {
565            $arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。";
566        }
567        // 規格IDの存在チェック
568        if(!$this->lfIsDbRecord('dtb_products_class', 'product_class_id', $item)) {
569            $arrErr['product_class_id'] = "※ 指定の商品規格IDは、登録されていません。";
570        }
571        // 商品ID、規格IDの組合せチェック
572        if(array_search('product_class_id', $this->arrFormKeyList) !== FALSE
573                and $item['product_class_id'] != "") {
574            if($item['product_id'] == "") {
575                $arrErr['product_class_id'] = "※ 商品規格ID指定時には商品IDの指定が必須です。";
576            }else{
577                if(!$this->objDb->sfIsRecord('dtb_products_class', 'product_id, product_class_id'
578                        , array($item['product_id'], $item['product_class_id']))) {
579                    $arrErr['product_class_id'] = "※ 指定の商品IDと商品規格IDの組合せは正しくありません。";
580                }
581            }
582        }
583        // 規格組合せIDの存在チェック
584//        if(!$this->lfIsDbRecord('dtb_class_combination', 'class_combination_id', $item)) {
585//      SC_Utils::sfIsRecord が del_flg が無いと使えない為、個別処理
586        if(array_search('class_combination_id', $this->arrFormKeyList) !== FALSE
587                and $item['class_combination_id'] != "" ) {
588            $objQuery =& SC_Query_Ex::getSingletonInstance();
589            $ret = $objQuery->get('class_combination_id', 'dtb_class_combination', 'class_combination_id = ?', array($item['class_combination_id']));
590            if($ret == "") {
591                $arrErr['class_combination_id'] = "※ 指定の規格組合せIDは、登録されていません。";
592            }
593        }
594        // 表示ステータスの存在チェック
595        if(!$this->lfIsArrayRecord($this->arrDISP, 'status', $item)) {
596            $arrErr['status'] = "※ 指定の表示ステータスは、登録されていません。";
597        }
598        // メーカーIDの存在チェック
599        if(!$this->lfIsArrayRecord($this->arrMaker, 'maker_id', $item)) {
600            $arrErr['maker_id'] = "※ 指定のメーカーIDは、登録されていません。";
601        }
602        // 発送日目安IDの存在チェック
603        if(!$this->lfIsArrayRecord($this->arrDELIVERYDATE, 'deliv_date_id', $item)) {
604            $arrErr['deliv_date_id'] = "※ 指定の発送日目安IDは、登録されていません。";
605        }
606        // 発送日目安IDの存在チェック
607        if(!$this->lfIsArrayRecord($this->arrProductType, 'product_type_id', $item)) {
608            $arrErr['product_type_id'] = "※ 指定の商品種別IDは、登録されていません。";
609        }
610        // 関連商品IDの存在チェック
611        for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) {
612            if(array_search('recommend_product_id' . $i, $this->arrFormKeyList) !== FALSE
613                    and $item['recommend_product_id' . $i] != ""
614                    and !$this->objDb->sfIsRecord('dtb_products', 'product_id', (array)$item['recommend_product_id' . $i]) ) {
615                $arrErr['recommend_product_id' . $i] = "※ 指定の関連商品ID($i)は、登録されていません。";
616            }
617        }
618        // カテゴリIDの存在チェック
619        if(!$this->lfIsDbRecordMulti('dtb_category', 'category_id', 'category_ids', $item, ',')) {
620            $arrErr['category_ids'] = "※ 指定のカテゴリIDは、登録されていません。";
621        }
622        // ステータスIDの存在チェック
623        if(!$this->lfIsArrayRecordMulti($this->arrSTATUS, 'product_statuses', $item, ',')) {
624            $arrErr['product_statuses'] = "※ 指定のステータスIDは、登録されていません。";
625        }
626        // 支払い方法IDの存在チェック
627        if(!$this->lfIsArrayRecordMulti($this->arrPayments, 'product_payment_ids', $item, ',')) {
628            $arrErr['product_payment_ids'] = "※ 指定の支払い方法IDは、登録されていません。";
629        }
630        // 削除フラグのチェック
631        if(array_search('del_flg', $this->arrFormKeyList) !== FALSE
632                and $item['del_flg'] != "") {
633            if(!($item['del_flg'] == "0" or $item['del_flg'] == "1")) {
634                $arrErr['del_flg'] = "※ 削除フラグは「0」(有効)、「1」(削除)のみが有効な値です。";
635            }
636        }
637/*
638    TODO: 在庫数の扱いが2.4仕様ではぶれているのでどうするか・・
639        // 在庫数/在庫無制限フラグの有効性に関するチェック
640        if($item['stock'] == "") {
641            if(array_search('stock_unlimited', $this->arrFormKeyList) === FALSE) {
642                $arrErr['stock'] = "※ 在庫数は必須です(無制限フラグ項目がある場合のみ空欄許可)。";
643            }else if($item['stock_unlimited'] != UNLIMITED_FLG_UNLIMITED) {
644                $arrErr['stock'] = "※ 在庫数または在庫無制限フラグのいずれかの入力が必須です。";
645            }
646        }
647*/
648        // ダウンロード商品チェック
649        if(array_search('product_type_id', $this->arrFormKeyList) !== FALSE
650                 and $item['product_type_id'] == PRODUCT_TYPE_NORMAL) {
651            //実商品の場合
652            if( $item['down_filename'] != "") {
653                $arrErr['down_filename'] = "※ 実商品の場合はダウンロードファイル名は入力できません。";
654            }
655            if( $item['down_realfilename'] != "") {
656                $arrErr['down_realfilename'] = "※ 実商品の場合はダウンロード商品用ファイルアップロードは入力できません。";
657            }
658        }elseif(array_search('product_type_id', $this->arrFormKeyList) !== FALSE
659                and $item['product_type_id'] == PRODUCT_TYPE_DOWNLOAD) {
660            //ダウンロード商品の場合
661            if( $item['down_filename'] == "") {
662                $arrErr['down_filename'] = "※ ダウンロード商品の場合はダウンロードファイル名は必須です。";
663            }
664            if( $item['down_realfilename'] == "") {
665                $arrErr['down_realfilename'] = "※ ダウンロード商品の場合はダウンロード商品用ファイルアップロードは必須です。";
666            }
667        }
668        return $arrErr;
669    }
670
671    // TODO: ここから下のルーチンは汎用ルーチンとして移動が望ましい
672
673    /**
674     * 指定された行番号をmicrotimeに付与してDB保存用の時間を生成する。
675     * トランザクション内のnow()は全てcommit()時の時間に統一されてしまう為。
676     *
677     * @param string $line_no 行番号
678     * @return string $time DB保存用の時間文字列
679     */
680    function lfGetDbFormatTimeWithLine($line_no = '') {
681        $time = date("Y-m-d H:i:s");
682        // 秒以下を生成
683        if($line_no != '') {
684            $microtime = sprintf("%06d", $line_no);
685            $time .= ".$microtime";
686        }
687        return $time;
688    }
689
690    /**
691     * 指定されたキーと複数値の有効性の配列内確認
692     *
693     * @param string $arr チェック対象配列
694     * @param string $keyname フォームキー名
695     * @param array  $item 入力データ配列
696     * @param string $delimiter 分割文字
697     * @return boolean true:有効なデータがある false:有効ではない
698     */
699    function lfIsArrayRecordMulti($arr, $keyname, $item, $delimiter = ',') {
700        if(array_search($keyname, $this->arrFormKeyList) === FALSE) {
701            return true;
702        }
703        if($item[$keyname] == "") {
704            return true;
705        }
706        $arrItems = explode($delimiter, $item[$keyname]);
707        //空項目のチェック 1つでも空指定があったら不正とする。
708        if(array_search("", $arrItems) !== FALSE) {
709            return false;
710        }
711        //キー項目への存在チェック
712        foreach($arrItems as $item) {
713            if(!array_key_exists($item, $arr)) {
714                return false;
715            }
716        }
717        return true;
718    }
719
720    /**
721     * 指定されたキーと複数値の有効性のDB確認
722     *
723     * @param string $table テーブル名
724     * @param string $tblkey テーブルキー名
725     * @param string $keyname フォームキー名
726     * @param array  $item 入力データ配列
727     * @param string $delimiter 分割文字
728     * @return boolean true:有効なデータがある false:有効ではない
729     */
730    function lfIsDbRecordMulti($table, $tblkey, $keyname, $item, $delimiter = ',') {
731        if(array_search($keyname, $this->arrFormKeyList) === FALSE) {
732            return true;
733        }
734        if($item[$keyname] == "") {
735            return true;
736        }
737        $arrItems = explode($delimiter, $item[$keyname]);
738        //空項目のチェック 1つでも空指定があったら不正とする。
739        if(array_search("", $arrItems) !== FALSE) {
740            return false;
741        }
742        $count = count($arrItems);
743        $where = $tblkey ." IN (" . implode(",", array_fill(0, $count, "?")) . ")";
744
745        $objQuery =& SC_Query_Ex::getSingletonInstance();
746        $db_count = $objQuery->count($table, $where, $arrItems);
747        if($count != $db_count) {
748            return false;
749        }
750        return true;
751    }
752
753    /**
754     * 指定されたキーと値の有効性のDB確認
755     *
756     * @param string $table テーブル名
757     * @param string $keyname キー名
758     * @param array  $item 入力データ配列
759     * @return boolean true:有効なデータがある false:有効ではない
760     */
761    function lfIsDbRecord($table, $keyname, $item) {
762        if(array_search($keyname, $this->arrFormKeyList) !== FALSE  //入力対象である
763                and $item[$keyname] != ""   // 空ではない
764                and !$this->objDb->sfIsRecord($table, $keyname, (array)$item[$keyname]) //DBに存在するか
765                ) {
766            return false;
767        }
768        return true;
769    }
770
771    /**
772     * 指定されたキーと値の有効性の配列内確認
773     *
774     * @param string $arr チェック対象配列
775     * @param string $keyname キー名
776     * @param array  $item 入力データ配列
777     * @return boolean true:有効なデータがある false:有効ではない
778     */
779    function lfIsArrayRecord($arr, $keyname, $item) {
780        if(array_search($keyname, $this->arrFormKeyList) !== FALSE //入力対象である
781                and $item[$keyname] != "" // 空ではない
782                and !array_key_exists($item[$keyname], $arr) //配列に存在するか
783                ) {
784            return false;
785        }
786        return true;
787    }
788}
Note: See TracBrowser for help on using the repository browser.