source: branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products_ProductClass.php @ 20757

Revision 20757, 31.7 KB checked in by nanasess, 11 years ago (diff)

#1188 (規格の変更を重ねるとデータがおかしくなる)

  • 削除時に以前のデータを引き継いでしまうのを修正
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2010 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';
26
27/**
28 * 商品登録(商品規格)のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Admin_Products_ProductClass extends LC_Page_Admin_Ex {
35
36    // }}}
37    // {{{ functions
38
39    /**
40     * Page を初期化する.
41     *
42     * @return void
43     */
44    function init() {
45        parent::init();
46        $this->tpl_mainpage = 'products/product_class.tpl';
47        $this->tpl_subnavi = 'products/subnavi.tpl';
48        $this->tpl_mainno = 'products';
49        $this->tpl_subno = 'product';
50        $this->tpl_subtitle = '商品登録(商品規格)';
51        $masterData = new SC_DB_MasterData_Ex();
52        $this->arrProductType = $masterData->getMasterData("mtb_product_type");
53        // 規格プルダウンのリスト
54        $this->arrClass = $this->getAllClass();
55    }
56
57    /**
58     * Page のプロセス.
59     *
60     * @return void
61     */
62    function process() {
63        $this->action();
64        $this->sendResponse();
65    }
66
67    /**
68     * Page のアクション.
69     *
70     * @return void
71     */
72    function action() {
73        // 商品マスタの検索条件パラメータを初期化
74        $objFormParam = new SC_FormParam_Ex();
75        $this->initParam($objFormParam);
76
77        $objFormParam->setParam($_POST);
78        $objFormParam->convParam();
79
80        $this->arrSearchHidden = $objFormParam->getSearchArray();
81
82        switch ($this->getMode()) {
83
84        // 編集実行
85        case 'edit':
86            $this->arrErr = $this->lfCheckProductsClass($objFormParam);
87
88            // エラーの無い場合は確認画面を表示
89            if (SC_Utils_Ex::isBlank($this->arrErr)) {
90                $this->tpl_mainpage = 'products/product_class_confirm.tpl';
91                $this->doDisp($objFormParam);
92                $objFormParam->setParam($_POST);
93                $objFormParam->convParam();
94            }
95            // エラーが発生した場合
96            else {
97                $objFormParam->setParam($_POST);
98                $objFormParam->convParam();
99            }
100            break;
101
102        // 削除
103        case 'delete':
104            $this->doDelete($objFormParam->getValue('product_id'));
105            $objFormParam->setValue('class_id1', '');
106            $objFormParam->setValue('class_id2', '');
107            $this->doDisp($objFormParam);
108            break;
109
110        // 初期表示
111        case 'pre_edit':
112            $this->doPreEdit($objFormParam);
113            break;
114
115        // 「表示する」ボタン押下時
116        case 'disp':
117            $this->arrErr = $this->lfCheckSelectClass();
118            if (SC_Utils_Ex::isBlank($this->arrErr)) {
119                $this->doDisp($objFormParam);
120                $this->initDispParam($objFormParam);
121            }
122            break;
123
124        // ダウンロード商品ファイルアップロード
125        case 'file_upload':
126            $this->doFileUpload($objFormParam);
127            break;
128
129        // ダウンロードファイルの削除
130        case 'file_delete':
131            $this->doFileDelete($objFormParam);
132            break;
133
134        // 確認画面からの戻り
135        case 'confirm_return':
136            $this->doPreEdit($objFormParam);
137            $objFormParam->setParam($_POST);
138            $objFormParam->convParam();
139            break;
140
141        case 'complete':
142            $this->tpl_mainpage = 'products/product_class_complete.tpl';
143            $this->doUploadComplete($objFormParam);
144            $this->registerProductClass($objFormParam->getHashArray(),
145                                        $objFormParam->getValue('product_id'),
146                                        $objFormParam->getValue('total'));
147            break;
148
149        default:
150        }
151
152        // 登録対象の商品名を取得
153        $objFormParam->setValue('product_name',
154                $this->getProductName($objFormParam->getValue('product_id')));
155        $this->arrForm = $objFormParam->getFormParamList();
156    }
157
158    /**
159     * デストラクタ.
160     *
161     * @return void
162     */
163    function destroy() {
164        parent::destroy();
165    }
166
167    /**
168     * パラメータ初期化
169     *
170     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
171     * @return void
172     */
173    function initParam(&$objFormParam) {
174        // 商品マスタ検索パラメータ引き継ぎ
175        $objFormParam->addParam("商品ID", "product_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
176        $objFormParam->addParam("カテゴリID", "category_id", STEXT_LEN, 'n', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
177        $objFormParam->addParam("ページ送り番号","search_pageno", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
178        $objFormParam->addParam("表示件数", "search_page_max", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
179        $objFormParam->addParam("商品ID", "search_product_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
180        $objFormParam->addParam("商品コード", "search_product_code", STEXT_LEN, 'KVna', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
181        $objFormParam->addParam("商品名", "search_name", STEXT_LEN, 'KVa', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
182        $objFormParam->addParam("カテゴリ", "search_category_id", STEXT_LEN, 'n', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
183        $objFormParam->addParam("種別", "search_status", INT_LEN, 'n', array("MAX_LENGTH_CHECK"));
184        $objFormParam->addParam("開始年", "search_startyear", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
185        $objFormParam->addParam("開始月", "search_startmonth", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
186        $objFormParam->addParam("開始日", "search_startday", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
187        $objFormParam->addParam("終了年", "search_endyear", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
188        $objFormParam->addParam("終了月", "search_endmonth", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
189        $objFormParam->addParam("終了日", "search_endday", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
190        $objFormParam->addParam("ステータス", "search_product_flag", INT_LEN, 'n', array("MAX_LENGTH_CHECK"));
191
192        // 規格プルダウン
193        $objFormParam->addParam("規格1", "class_id1", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
194        $objFormParam->addParam("規格2", "class_id2", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
195
196        // 商品規格
197        $objFormParam->addParam("商品規格数", "total", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
198        $objFormParam->addParam("商品名", "product_name", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
199        $objFormParam->addParam("商品コード", "product_code", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
200        $objFormParam->addParam("規格ID1", "classcategory_id1", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
201        $objFormParam->addParam("規格ID2", "classcategory_id2", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
202        $objFormParam->addParam("規格名1", "classcategory_name1", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
203        $objFormParam->addParam("規格名2", "classcategory_name2", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
204        $objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
205        $objFormParam->addParam("在庫数", "stock", AMOUNT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
206        $objFormParam->addParam("在庫数", "stock_unlimited", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
207        $objFormParam->addParam(NORMAL_PRICE_TITLE, "price01", PRICE_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
208        $objFormParam->addParam(SALE_PRICE_TITLE, "price02", PRICE_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
209        $objFormParam->addParam("商品種別", "product_type_id", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
210        $objFormParam->addParam("削除フラグ", "del_flg", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
211        $objFormParam->addParam("ダウンロード販売用ファイル名", "down_filename", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
212        $objFormParam->addParam("ダウンロード販売用ファイル名", "down_realfilename", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
213        $objFormParam->addParam("チェックボックス", "check", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
214        $objFormParam->addParam("ファイルアップロード用キー", "upload_index", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
215    }
216
217    /**
218     * 規格の登録または更新を行う.
219     *
220     * @param array $arrList 入力フォームの内容
221     * @param integer $product_id 登録を行う商品ID
222     */
223    function registerProductClass($arrList, $product_id, $total) {
224        $objQuery =& SC_Query_Ex::getSingletonInstance();
225        $objDb = new SC_Helper_DB_Ex();
226
227        $objQuery->begin();
228
229        $arrProductsClass = $objQuery->select("*", "dtb_products_class", "product_id = ?", array($product_id));
230        $arrExists = array();
231        foreach ($arrProductsClass as $val) {
232            $arrExists[$val['product_class_id']] = $val;
233        }
234
235        // デフォルト値として設定する値を取得しておく
236        $arrDefault = $this->getProductsClass($product_id);
237
238        // XXX #1188 UPDATE だとデータの不整合が発生するため DELETE/INSERT を行う
239        $objQuery->delete('dtb_products_class', 'product_id = ? AND class_combination_id IS NOT NULL', array($product_id));
240
241        for ($i = 0; $i < $total; $i++) {
242            $del_flg = SC_Utils_Ex::isBlank($arrList['check'][$i]) ? 1 : 0;
243            $stock_unlimited = SC_Utils_Ex::isBlank($arrList['stock_unlimited'][$i]) ? 0 : $arrList['stock_unlimited'][$i];
244            $price02 = SC_Utils_Ex::isBlank($arrList['price02'][$i]) ? 0 : $arrList['price02'][$i];
245            // dtb_products_class 登録/更新用
246            $registerKeys = array('product_code', 'stock',
247                                  'price01', 'product_type_id',
248                                  'down_filename', 'down_realfilename');
249
250            $arrPC = array();
251            foreach ($registerKeys as $key) {
252                $arrPC[$key] = $arrList[$key][$i];
253            }
254            $arrPC['product_id'] = $product_id;
255            $arrPC['sale_limit'] = $arrDefault['sale_limit'];
256            $arrPC['deliv_fee'] = $arrDefault['deliv_fee'];
257            $arrPC['point_rate'] = $arrDefault['point_rate'];
258            $arrPC['stock_unlimited'] = $stock_unlimited;
259            $arrPC['price02'] = $price02;
260
261            // 該当関数が無いため, セッションの値を直接代入
262            $arrPC['creator_id'] = $_SESSION['member_id'];
263            $arrPC['update_date'] = 'now()';
264            $arrPC['del_flg'] = $del_flg;
265
266            $class_combination_id = $arrExists[$arrList['product_class_id'][$i]]['class_combination_id'];
267            $existsCombi = $objQuery->getRow('*', 'dtb_class_combination',
268                                             'class_combination_id = ?',
269                                             array($class_combination_id));
270
271            $objQuery->delete('dtb_class_combination',
272                              'class_combination_id IN (?, ?)',
273                              array($existsCombi['class_combination_id'],
274                                    $existsCombi['parent_class_combination_id']));
275
276            // 規格組み合わせを登録
277            $arrComb1['class_combination_id'] = $objQuery->nextVal('dtb_class_combination_class_combination_id');
278            $arrComb1['classcategory_id'] = $arrList['classcategory_id1'][$i];
279            $arrComb1['level'] = 1;
280            $objQuery->insert('dtb_class_combination', $arrComb1);
281
282            // 規格2も登録する場合
283            if (!SC_Utils_Ex::isBlank($arrList['classcategory_id2'][$i])) {
284                $arrComb2['class_combination_id'] = $objQuery->nextVal('dtb_class_combination_class_combination_id');
285                $arrComb2['classcategory_id'] = $arrList['classcategory_id2'][$i];
286                $arrComb2['parent_class_combination_id'] = $arrComb1['class_combination_id'];
287                $arrComb2['level'] = 2;
288                $objQuery->insert('dtb_class_combination', $arrComb2);
289
290                $arrPC['class_combination_id'] = $arrComb2['class_combination_id'];
291            } else {
292                $arrPC['class_combination_id'] = $arrComb1['class_combination_id'];
293            }
294
295            $arrPC['create_date'] = "now()";
296            $arrPC['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id');
297            /*
298             * チェックを入れない商品は product_type_id が NULL になるので, 0 を入れる
299             */
300            $arrPC['product_type_id'] = SC_Utils_Ex::isBlank($arrPC['product_type_id']) ? 0 : $arrPC['product_type_id'];
301
302            $objQuery->insert("dtb_products_class", $arrPC);
303        }
304
305        // 規格無し用の商品規格を非表示に
306        $arrBlank['del_flg'] = 1;
307        $arrBlank['update_date'] = 'now()';
308        $objQuery->update("dtb_products_class", $arrBlank,
309                          "product_id = ? AND class_combination_id IS NULL",
310                          array($product_id));
311
312        // 件数カウントバッチ実行
313        $objDb->sfCountCategory($objQuery);
314        $objQuery->commit();
315    }
316
317    /**
318     * 規格選択エラーチェックを行う
319     *
320     * ※SC_FormParamで対応していないエラーチェックのため, SC_CheckErrorを使用している.
321     *
322     * @return array エラーの配列
323     */
324    function lfCheckSelectClass() {
325        $objErr = new SC_CheckError_Ex();
326        $objErr->doFunc(array("規格1", "class_id1"), array("EXIST_CHECK"));
327        $objErr->doFunc(array("規格", "class_id1", "select_class_id2"), array("TOP_EXIST_CHECK"));
328        $objErr->doFunc(array("規格1", "規格2", "class_id1", "class_id2"), array("DIFFERENT_CHECK"));
329        return $objErr->arrErr;
330    }
331
332    /**
333     * 商品規格エラーチェック.
334     *
335     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
336     * @return array エラー結果の配列
337     */
338    function lfCheckProductsClass(&$objFormParam) {
339        $arrValues = $objFormParam->getHashArray();
340        $arrErr = $objFormParam->checkError();
341        $total = $objFormParam->getValue('total');
342
343        if (SC_Utils_Ex::isBlank($arrValues['check'])) {
344            $arrErr['check_empty'] = '※ 商品種別が選択されていません。<br />';
345        }
346
347        for ($i = 0; $i < $total; $i++) {
348
349            /*
350             * チェックボックスの入っている項目のみ, 必須チェックを行う.
351             * エラーを配列で返す必要があるため, SC_CheckError を使用しない.
352             */
353            if (!SC_Utils_Ex::isBlank($arrValues['check'][$i])) {
354
355                /*
356                 * 販売価格の必須チェック
357                 */
358                if (SC_Utils_Ex::isBlank($arrValues['price02'][$i])) {
359                    $arrErr['price02'][$i] = '※ ' . SALE_PRICE_TITLE . 'が入力されていません。<br />';
360                }
361                /*
362                 * 在庫数の必須チェック
363                 */
364                if ((SC_Utils_Ex::isBlank($arrValues['stock_unlimited'][$i])
365                     || $arrValues['stock_unlimited'][$i] != 1)
366
367                    && SC_Utils_Ex::isBlank($arrValues['stock'][$i])) {
368                    $arrErr['stock'][$i] = '※ 在庫数が入力されていません。<br />';
369                }
370                /*
371                 * 商品種別の必須チェック
372                 */
373                if (SC_Utils_Ex::isBlank($arrValues['product_type_id'][$i])) {
374                    $arrErr['product_type_id'][$i] = "※ 商品種別は、いずれかを選択してください。<br />";
375                }
376                /*
377                 * ダウンロード商品の必須チェック
378                 */
379                if($arrValues['product_type_id'][$i] == PRODUCT_TYPE_DOWNLOAD) {
380                    if (SC_Utils_Ex::isBlank($arrValues['down_filename'][$i])) {
381                        $arrErr['down_filename'][$i] = "※ ダウンロード商品の場合はダウンロードファイル名を入力してください。<br />";
382                    }
383                    if (SC_Utils_Ex::isBlank($arrValues['down_realfilename'][$i])) {
384                        $arrErr['down_realfilename'][$i] = "※ ダウンロード商品の場合はダウンロード商品用ファイルをアップロードしてください。<br />";
385                    }
386                }
387                /*
388                 * 通常商品チェック
389                 */
390                else if ($arrValues['product_type_id'][$i] == PRODUCT_TYPE_NORMAL) {
391                    if (!SC_Utils_Ex::isBlank($arrValues['down_filename'][$i])) {
392                        $arrErr['down_filename'][$i] = "※ 通常商品の場合はダウンロードファイル名を設定できません。<br />";
393                    }
394                    if (!SC_Utils_Ex::isBlank($arrValues['down_realfilename'][$i])) {
395                        $arrErr['down_realfilename'][$i] = "※ 実商品の場合はダウンロード商品用ファイルをアップロードできません。<br />ファイルを取り消してください。<br />";
396                    }
397                }
398            }
399        }
400        return $arrErr;
401    }
402
403    /**
404     * 規格の組み合わせ一覧を表示する.
405     *
406     * 規格1, 規格2における規格分類のすべての組み合わせを取得し,
407     * 該当商品の商品規格の内容を取得後, フォームに設定する.
408     *
409     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
410     * @return void
411     */
412    function doDisp(&$objFormParam) {
413        $product_id = $objFormParam->getValue('product_id');
414        $class_id1 = $objFormParam->getValue('class_id1');
415        $class_id2 = $objFormParam->getValue('class_id2');
416
417        // すべての組み合わせを取得し, フォームに設定
418        $arrClassCat = $this->getAllClassCategory($class_id1, $class_id2);
419        $total = count($arrClassCat);
420        $objFormParam->setValue('total', $total);
421        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrClassCat));
422
423        // class_id1, class_id2 を, 入力値で上書き
424        $objFormParam->setValue('class_id1', $class_id1);
425        $objFormParam->setValue('class_id2', $class_id2);
426
427        // 商品情報を取得し, フォームに設定
428        $arrProductsClass = $this->getProductsClass($product_id);
429
430        foreach ($arrProductsClass as $key => $val) {
431            // 組み合わせ数分の値の配列を生成する
432            $arrValues = array();
433            for ($i = 0; $i < $total; $i++) {
434                $arrValues[] = $val;
435            }
436            $objFormParam->setValue($key, $arrValues);
437        }
438
439        // 規格2未選択時は, 商品規格2を確実にクリアする
440        if (SC_Utils_Ex::isBlank($class_id2)) {
441            $objFormParam->setValue('classcategory_id2', array());
442        }
443
444        // 商品種別を 1 に初期化
445        $objFormParam->setValue('product_type_id', array_pad(array(), $total, 1));
446    }
447
448    /**
449     * 「表示する」ボタンをクリックされたときのパラメータ初期化処理
450     *
451     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
452     * @return void
453     */
454    function initDispParam(&$objFormParam) {
455        // 登録チェックボックス初期化(すべてチェックを外す)
456        $objFormParam->setValue('check', '');
457
458        // 規格2が選択されていない場合、規格2名称初期化
459        $class_id2 = $objFormParam->getValue('class_id2');
460        if(SC_Utils_Ex::isBlank($class_id2) == true) {
461            $objFormParam->setValue('classcategory_name2', '');
462        }
463    }
464
465    /**
466     * 規格編集画面を表示する
467     *
468     * @param integer $product_id 商品ID
469     * @param bool $existsValue
470     * @param bool $usepostValue
471     */
472    function doPreEdit(&$objFormParam) {
473        $product_id = $objFormParam->getValue('product_id');
474        $objProduct = new SC_Product_Ex();
475        $existsProductsClass = $objProduct->getProductsClassFullByProductId($product_id, true);
476
477        $class_id1 = $existsProductsClass[0]['class_id1'];
478        $class_id2 = $existsProductsClass[0]['class_id2'];
479        $objFormParam->setValue('class_id1', $class_id1);
480        $objFormParam->setValue('class_id2', $class_id2);
481        $this->doDisp($objFormParam);
482
483        // 登録済みのデータで上書き
484        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($existsProductsClass));
485
486        // $existsProductsClass で product_id が配列になってしまうため数値で上書き
487        $objFormParam->setValue('product_id', $product_id);
488
489        // check を設定
490        $arrChecks = array();
491        $index = 0;
492        foreach ($objFormParam->getValue('del_flg') as $key => $val) {
493            if ($val == 0) {
494                $arrChecks[$index] = 1;
495            }
496            $index++;
497        }
498        $objFormParam->setValue('check', $arrChecks);
499
500        // class_id1, class_id2 を取得値で上書き
501        $objFormParam->setValue('class_id1', $class_id1);
502        $objFormParam->setValue('class_id2', $class_id2);
503    }
504
505    /**
506     * 規格の削除を実行する
507     *
508     * @param $product_id
509     * @return void
510     */
511    function doDelete($product_id) {
512        $objQuery =& SC_Query_Ex::getSingletonInstance();
513
514        $objQuery->begin();
515        $arrClassCombi = $objQuery->getCol('class_combination_id',
516                                           'dtb_products_class',
517                                           'product_id = ?', array($product_id));
518
519        foreach ($arrClassCombi as $class_combination_id) {
520            if (SC_Utils_Ex::isBlank($class_combination_id)) {
521                continue;
522            }
523            $existsCombi = $objQuery->getRow('*', 'dtb_class_combination',
524                                             'class_combination_id = ?',
525                                             array($class_combination_id));
526
527            $objQuery->delete('dtb_class_combination',
528                              'class_combination_id IN (?, ?)',
529                              array($existsCombi['class_combination_id'],
530                                    $existsCombi['parent_class_combination_id']));
531        }
532        $objQuery->update("dtb_products_class", array('del_flg' => 0),
533                          "product_id = ? AND class_combination_id IS NULL",
534                          array($product_id));
535        $objQuery->delete("dtb_products_class",
536                          "product_id = ? AND class_combination_id IS NOT NULL",
537                          array($product_id));
538        $objQuery->commit();
539
540        // 在庫無し商品の非表示対応
541        if (NOSTOCK_HIDDEN === true) {
542            // 件数カウントバッチ実行
543            $objDb = new SC_Helper_DB_Ex();
544            $objDb->sfCountCategory($objQuery);
545        }
546    }
547
548    /**
549     * ファイルアップロードを行う.
550     *
551     * 以下のチェックを行い, ファイルを一時領域へアップロードする.
552     * 1. ファイルサイズチェック
553     * 2. 拡張子チェック
554     *
555     * TODO
556     * SC_CheckError クラスや, SC_UploadFile クラスが多次元配列に対応して
557     * いないため, 独自のロジックを使用している.
558     *
559     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
560     * @return void
561     */
562    function doFileUpload(&$objFormParam) {
563        $index   = $objFormParam->getValue('upload_index');
564        $arrDownRealFiles = $objFormParam->getValue('down_realfilename');
565
566        if ($_FILES['down_realfilename']['size'][$index] <= 0) {
567            $this->arrErr['down_realfilename'][$index] = '※ ファイルがアップロードされていません';
568        } else if ($_FILES['down_realfilename']['size'][$index] > DOWN_SIZE *  1024 ) {
569            $size = DOWN_SIZE;
570            $byte = 'KB';
571            if ($size >= 1000) {
572                $size = $size / 1000;
573                $byte = 'MB';
574            }
575            $this->arrErr['down_realfilename'][$index] = "※ ダウンロード販売用ファイル名のファイルサイズは" . $size . $byte . "以下のものを使用してください。<br />";
576        } else {
577            $array_ext = explode(".", $_FILES['down_realfilename']['name'][$index]);
578            $is_error = true;
579            $strExt = "";
580
581            foreach (explode(",", DOWNLOAD_EXTENSION) as $checkExt ) {
582                $ext = "";
583                // チェック拡張子のピリオドの数を取得('tar.gz'の場合1個、'jpg'のように通常は0個)
584                $count_period = substr_count($checkExt, ".");
585                if($count_period > 0) {
586                    for ($i = max(array_keys($array_ext)) - $count_period; $i < count($array_ext); $i++) {
587                        $ext .= $array_ext[$i] . ".";
588                    }
589                    $ext = preg_replace("/.$/", "" ,$ext);
590                } else {
591                    $ext = $array_ext[ count ( $array_ext ) - 1 ];
592                }
593                $ext = strtolower($ext);
594
595                if ($ext == $checkExt) {
596                    $is_error = false;
597                }
598                if($strExt == "") {
599                    $strExt .= $checkExt;
600                } else {
601                    $strExt .= "・$checkExt";
602                }
603            }
604            if ($is_error) {
605                $this->arrErr['down_realfilename'][$index] = "※ ダウンロード販売用ファイル名で許可されている形式は、" . $strExt . "です。<br />";
606            }
607
608            $uniqname = date('mdHi') . "_" . uniqid("").".";
609            $temp_file = preg_replace("/^.*\./", $uniqname, $_FILES['down_realfilename']['name'][$index]);
610
611            if (move_uploaded_file($_FILES['down_realfilename']['tmp_name'][$index], DOWN_TEMP_REALDIR . $temp_file)) {
612                $arrDownRealFiles[$index] = $temp_file;
613                $objFormParam->setValue('down_realfilename', $arrDownRealFiles);
614                GC_Utils_Ex::gfPrintLog($_FILES['down_realfilename']['name'][$index] ." -> ". realpath(DOWN_TEMP_REALDIR . $temp_file));
615            } else {
616                $objErr->arrErr[$keyname] = '※ ファイルのアップロードに失敗しました。<br />';
617                GC_Utils_Ex::gfPrintLog('File Upload Error!: ' . $_FILES['down_realfilename']['name'][$index] . " -> " . DOWN_TEMP_REALDIR . $temp_file);
618            }
619        }
620    }
621
622    /**
623     * アップロードしたファイルを削除する.
624     *
625     * TODO 一時ファイルの削除
626     *
627     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
628     * @return void
629     */
630    function doFileDelete(&$objFormParam) {
631        $objImage = new SC_Image_Ex(DOWN_TEMP_REALDIR);
632        $arrRealFileName = $objFormParam->getValue('down_realfilename');
633        $index = $objFormParam->getValue('upload_index');
634        $objImage->deleteImage($arrRealFileName[$index], DOWN_SAVE_REALDIR);
635        $arrRealFileName[$index] = '';
636        $objFormParam->setValue('down_realfilename', $arrRealFileName);
637    }
638
639    /**
640     * アップロードした一時ファイルを保存する.
641     *
642     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
643     * @return void
644     */
645    function doUploadComplete(&$objFormParam) {
646        $objImage = new SC_Image_Ex(DOWN_TEMP_REALDIR);
647        $arrRealFileName = $objFormParam->getValue('down_realfilename');
648        foreach ($arrRealFileName as $real_file_name) {
649            $objImage->moveTempImage($real_file_name, DOWN_SAVE_REALDIR);
650        }
651    }
652
653    /**
654     * 規格ID1, 規格ID2の規格分類すべてを取得する.
655     *
656     * @param integer $class_id1 規格ID1
657     * @param integer $class_id2 規格ID2
658     * @return array 規格と規格分類の配列
659     */
660    function getAllClassCategory($class_id1, $class_id2 = null) {
661        $objQuery =& SC_Query_Ex::getSingletonInstance();
662
663        $col = <<< __EOF__
664            T1.class_id AS class_id1,
665            T1.classcategory_id AS classcategory_id1,
666            T1.name AS classcategory_name1,
667            T1.rank AS rank1
668__EOF__;
669        $table = '';
670        $arrParams = array();
671        if(SC_Utils_Ex::isBlank($class_id2)) {
672            $table = "dtb_classcategory T1 ";
673            $objQuery->setWhere("T1.class_id = ?");
674            $objQuery->setOrder("T1.rank DESC");
675            $arrParams = array($class_id1);
676        } else {
677            $col .= <<< __EOF__
678                ,
679                T2.class_id AS class_id2,
680                T2.classcategory_id AS classcategory_id2,
681                T2.name AS classcategory_name2,
682                T2.rank AS rank2
683__EOF__;
684            $table = "dtb_classcategory AS T1, dtb_classcategory AS T2";
685            $objQuery->setWhere("T1.class_id = ? AND T2.class_id = ?");
686            $objQuery->setOrder("T1.rank DESC, T2.rank DESC");
687            $arrParams = array($class_id1, $class_id2);
688        }
689        return $objQuery->select($col, $table, "", $arrParams);
690    }
691
692    /**
693     * 商品名を取得する.
694     *
695     * @access private
696     * @param integer $product_id 商品ID
697     * @return string 商品名の文字列
698     */
699    function getProductName($product_id) {
700        $objQuery =& SC_Query_Ex::getSingletonInstance();
701        return $objQuery->get('name', 'dtb_products', 'product_id = ?', array($product_id));
702    }
703
704    /**
705     * 規格分類の登録された, すべての規格を取得する.
706     *
707     * @access private
708     * @return array 規格分類の登録された, すべての規格
709     */
710    function getAllClass() {
711        $arrClass = SC_Helper_DB_Ex::sfGetIDValueList("dtb_class", 'class_id', 'name');
712
713        // 規格分類が登録されていない規格は表示しないようにする。
714        $arrClassCatCount = SC_Utils_Ex::sfGetClassCatCount();
715
716        $results = array();
717        if (!SC_Utils_Ex::isBlank($arrClass)) {
718            foreach($arrClass as $key => $val) {
719                if($arrClassCatCount[$key] > 0) {
720                    $results[$key] = $arrClass[$key];
721                }
722            }
723        }
724        return $results;
725    }
726
727    /**
728     * 商品IDをキーにして, 商品規格の初期値を取得する.
729     *
730     * 商品IDをキーにし, デフォルトに設定されている商品規格を取得する.
731     *
732     * @param integer $product_id 商品ID
733     * @return array 商品規格の配列
734     */
735    function getProductsClass($product_id) {
736        $objQuery =& SC_Query_Ex::getSingletonInstance();
737        $col = "product_code, price01, price02, stock, stock_unlimited, sale_limit, deliv_fee, point_rate";
738        return $objQuery->getRow($col, "dtb_products_class", "product_id = ? AND class_combination_id IS NULL", array($product_id));
739    }
740}
Note: See TracBrowser for help on using the repository browser.