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

Revision 22489, 32.1 KB checked in by m_uehara, 11 years ago (diff)

#2084 r22432 - r22433 の逆マージを行いました。

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