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

Revision 20617, 31.3 KB checked in by nanasess, 13 years ago (diff)

#991 (商品規格登録での不具合)

  • r20612 の続き. ファイルアップロードに対応

#595 (不正なファイルアップロードが行われる可能性)

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