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

Revision 21446, 34.7 KB checked in by Seasoft, 12 years ago (diff)

#1613 (ソース整形・ソースコメントの改善)

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