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

Revision 21532, 32.3 KB checked in by Seasoft, 11 years ago (diff)

#1641 (商品規格における木構造の廃止)

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