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

Revision 23605, 33.2 KB checked in by kimoto, 10 years ago (diff)

#2448 typo修正・ソース整形・ソースコメントの改善 for 2.13.3

Scrutinizer Auto-Fixes

This patch was automatically generated as part of the following inspection:
 https://scrutinizer-ci.com/g/nobuhiko/EC-CUBE/inspections/d8722894-69a6-4b1b-898d-43618035c60d

Enabled analysis tools:

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