source: branches/camp/camp-2_13-tax/data/class/pages/admin/products/LC_Page_Admin_Products_ProductClass.php @ 22653

Revision 22653, 33.2 KB checked in by maeken, 11 years ago (diff)

商品規格登録(編集)にて税情報設定対応

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