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

Revision 20612, 29.9 KB checked in by nanasess, 13 years ago (diff)

#991 (商品規格登録での不具合)

  • r20595 の続き. 入力チェックを実装
  • 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-2010 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_subnavi = 'products/subnavi.tpl';
48        $this->tpl_mainno = 'products';
49        $this->tpl_subno = 'product';
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        // Downファイル管理クラスを初期化
83        $this->objDownFile = new SC_UploadFile_Ex(DOWN_TEMP_REALDIR, DOWN_SAVE_REALDIR);
84        $this->initDownFile($count, $this->objDownFile);
85
86        switch ($this->getMode()) {
87
88        // 編集実行
89        case 'edit':
90
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                $objFormParam->setParam($_POST);
98                $objFormParam->convParam();
99            }
100            // エラーが発生した場合
101            else {
102                $objFormParam->setParam($_POST);
103                $objFormParam->convParam();
104
105                /* TODO
106                // Hiddenからのデータを引き継ぐ
107                $this->objDownFile->setHiddenFileList($_POST);
108                // HIDDEN用に配列を渡す。
109                $this->arrHidden = array_merge((array)$this->arrHidden, (array)$this->objDownFile->getHiddenFileList());
110                // Form用に配列を渡す。
111                $this->arrForm = array_merge((array)$this->arrForm, (array)$this->objDownFile->getFormKikakuDownFile());
112                */
113            }
114            break;
115
116        // 削除
117        case 'delete':
118            $this->doDelete($objFormParam->getValue('product_id'));
119            break;
120
121        // 初期表示
122        case 'pre_edit':
123            $this->doPreEdit($objFormParam);
124
125            /* TODO
126            // HIDDEN用に配列を渡す。
127            $this->arrHidden = array_merge((array)$this->arrHidden, (array)$this->objDownFile->getHiddenFileList());
128            */
129            break;
130
131        // 「表示する」ボタン押下時
132        case 'disp':
133            $this->arrErr = $this->lfCheckSelectClass();
134            if (SC_Utils_Ex::isBlank($this->arrErr)) {
135                $this->doDisp($objFormParam);
136            }
137            break;
138
139        // ダウンロード商品ファイルアップロード
140        case 'upload_down':
141
142            /* TODO
143            $product_id = $objFormParam->getValue('product_id');
144            $down_key   = $objFormParam->getValue('down_key');
145            // 編集画面用パラメータをセット
146            $this->doPreEdit($product_id, true);
147            // Hiddenからのデータを引き継ぐ
148            $this->objDownFile->setHiddenKikakuFileList($_POST);
149            // ファイル存在チェック
150            $this->arrErr = array_merge((array)$this->arrErr, (array)$this->objDownFile->checkEXISTS($down_key));
151            // ファイル保存処理
152            $this->arrErr[$down_key] = $this->objDownFile->makeTempDownFile($down_key);
153            // HIDDEN用に配列を渡す。
154            $this->arrHidden = array_merge((array)$this->arrHidden, (array)$this->objDownFile->getHiddenFileList());
155            // Form用に配列を渡す。
156            $this->arrForm = array_merge((array)$this->arrForm, (array)$this->objDownFile->getFormKikakuDownFile());
157            // 規格の組み合わせ一覧を表示
158            $this->doDisp($product_id,
159                          $objFormParam->getValue('select_class_id1'),
160                          $objFormParam->getValue('select_class_id2'), $objFormParam);
161            */
162            break;
163
164        // ダウンロードファイルの削除
165        case 'delete_down':
166
167            /* TODO
168            $product_id = $objFormParam->getValue('product_id');
169            $down_key   = $objFormParam->getValue('down_key');
170            // 編集画面用パラメータをセット
171            $this->doPreEdit($product_id, true);
172            // Hiddenからのデータを引き継ぐ
173            $this->objDownFile->setHiddenKikakuFileList($_POST);
174            // ファイル削除処理
175            $this->objDownFile->deleteKikakuFile($down_key);
176            // HIDDEN用に配列を渡す。
177            $this->arrHidden = array_merge((array)$this->arrHidden, (array)$this->objDownFile->getHiddenFileList());
178            // Form用に配列を渡す。
179            $this->arrForm = array_merge((array)$this->arrForm, (array)$this->objDownFile->getFormKikakuDownFile());
180            // 規格の組み合わせ一覧を表示
181            $this->doDisp($product_id,
182                          $objFormParam->getValue('select_class_id1'),
183                          $objFormParam->getValue('select_class_id2'), $objFormParam);
184            */
185            break;
186
187        // 確認画面からの戻り
188        case 'confirm_return':
189            $this->doPreEdit($objFormParam);
190            $objFormParam->setParam($_POST);
191            $objFormParam->convParam();
192
193            /* TODO
194            // Hiddenからのデータを引き継ぐ
195            $this->objDownFile->setHiddenFileList($_POST);
196            // HIDDEN用に配列を渡す。
197            $this->arrHidden = array_merge((array)$this->arrHidden, (array)$this->objDownFile->getHiddenFileList());
198            // Form用に配列を渡す。
199            $this->arrForm = array_merge((array)$this->arrForm, (array)$this->objDownFile->getFormKikakuDownFile());
200            */
201
202            break;
203        case 'complete':
204            $this->tpl_mainpage = 'products/product_class_complete.tpl';
205            // TODO $this->objDownFile->setHiddenFileList($_POST);
206
207            $this->registerProductClass($objFormParam->getHashArray(), $objFormParam->getValue('product_id'),
208                                        $objFormParam->getValue('total'));
209            // TODO
210            // 一時ファイルを本番ディレクトリに移動する
211            // $this->objDownFile->moveTempDownFile();
212            break;
213
214        default:
215        }
216
217        // 登録対象の商品名を取得
218        $objFormParam->setValue('product_name',
219                $this->getProductName($objFormParam->getValue('product_id')));
220        $this->arrForm = $objFormParam->getFormParamList();
221    }
222
223    /**
224     * デストラクタ.
225     *
226     * @return void
227     */
228    function destroy() {
229        parent::destroy();
230    }
231    /**
232     * パラメータ初期化
233     *
234     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
235     * @return void
236     */
237    function initParam(&$objFormParam) {
238        // 商品マスタ検索パラメータ引き継ぎ
239        $objFormParam->addParam("商品ID", "product_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
240        $objFormParam->addParam("カテゴリID", "category_id", STEXT_LEN, 'n', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
241        $objFormParam->addParam("ページ送り番号","search_pageno", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
242        $objFormParam->addParam("表示件数", "search_page_max", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
243        $objFormParam->addParam("商品ID", "search_product_id", INT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
244        $objFormParam->addParam("商品コード", "search_product_code", STEXT_LEN, 'KVna', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
245        $objFormParam->addParam("商品名", "search_name", STEXT_LEN, 'KVa', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
246        $objFormParam->addParam("カテゴリ", "search_category_id", STEXT_LEN, 'n', array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
247        $objFormParam->addParam("種別", "search_status", INT_LEN, 'n', array("MAX_LENGTH_CHECK"));
248        $objFormParam->addParam("開始年", "search_startyear", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
249        $objFormParam->addParam("開始月", "search_startmonth", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
250        $objFormParam->addParam("開始日", "search_startday", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
251        $objFormParam->addParam("終了年", "search_endyear", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
252        $objFormParam->addParam("終了月", "search_endmonth", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
253        $objFormParam->addParam("終了日", "search_endday", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
254        $objFormParam->addParam("ステータス", "search_product_flag", INT_LEN, 'n', array("MAX_LENGTH_CHECK"));
255
256        // 規格プルダウン
257        $objFormParam->addParam("規格1", "select_class_id1", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
258        $objFormParam->addParam("規格2", "select_class_id2", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
259        $objFormParam->addParam("規格1", "class_id1", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
260        $objFormParam->addParam("規格2", "class_id2", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
261
262        // 商品規格
263        $objFormParam->addParam("商品規格数", "total", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
264        $objFormParam->addParam("商品名", "product_name", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
265        $objFormParam->addParam("商品コード", "product_code", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
266        $objFormParam->addParam("規格ID1", "classcategory_id1", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
267        $objFormParam->addParam("規格ID2", "classcategory_id2", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
268        $objFormParam->addParam("規格名1", "classcategory_name1", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
269        $objFormParam->addParam("規格名2", "classcategory_name2", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
270        $objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
271        $objFormParam->addParam("在庫数", "stock", AMOUNT_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
272        $objFormParam->addParam("在庫数", "stock_unlimited", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
273        $objFormParam->addParam(NORMAL_PRICE_TITLE, "price01", PRICE_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
274        $objFormParam->addParam(SALE_PRICE_TITLE, "price02", PRICE_LEN, 'n', array("NUM_CHECK", "MAX_LENGTH_CHECK"));
275        $objFormParam->addParam("商品種別", "product_type_id", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
276        $objFormParam->addParam("削除フラグ", "del_flg", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
277        $objFormParam->addParam("DLファイル名", "down_filename", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
278        $objFormParam->addParam("DLファイル名", "down_realfilename", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
279        $objFormParam->addParam("チェックボックス", "check", INT_LEN, 'n', array("MAX_LENGTH_CHECK", "NUM_CHECK"));
280        $objFormParam->addParam("ファイルアップロード用キー", "down_key", STEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
281    }
282
283    /**
284     * Downファイル管理クラスを初期化
285     *
286     * @param 行数 $count
287     * @param SC_FormParam $objDownFile
288     */
289    function initDownFile($count, &$objDownFile) {
290        $i = 1;
291        for ($i = 1; $i < $count; $i++) {
292            $objDownFile->addFile("ダウンロード販売用ファイル", 'down_realfilename'. ":" . $i, explode(",", DOWNLOAD_EXTENSION), DOWN_SIZE, true, 0, 0);
293        }
294    }
295
296    /**
297     * 規格の登録または更新を行う.
298     *
299     * TODO dtb_class_combination は, dtb_product_categories に倣って,
300     *      DELETE to INSERT だが, UPDATE を検討する.
301     *
302     * @param array $arrList 入力フォームの内容
303     * @param integer $product_id 登録を行う商品ID
304     */
305    function registerProductClass($arrList, $product_id, $total) {
306        $objQuery =& SC_Query_Ex::getSingletonInstance();
307        $objDb = new SC_Helper_DB_Ex();
308
309        $objQuery->begin();
310
311        $arrProductsClass = $objQuery->select("*", "dtb_products_class", "product_id = ?", array($product_id));
312        $arrExists = array();
313        foreach ($arrProductsClass as $val) {
314            $arrExists[$val['product_class_id']] = $val;
315        }
316
317        // デフォルト値として設定する値を取得しておく
318        $arrDefault = $this->getProductsClass($product_id);
319
320        for ($i = 0; $i < $total; $i++) {
321            $del_flg = SC_Utils_Ex::isBlank($arrList['check'][$i]) ? 1 : 0;
322            $stock_unlimited = SC_Utils_Ex::isBlank($arrList['stock_unlimited'][$i]) ? 0 : 1;
323
324            // dtb_products_class 登録/更新用
325            $registerKeys = array('product_code', 'stock',
326                                  'price01', 'price02', 'product_type_id',
327                                  'down_filename', 'down_realfilename');
328
329            $arrPC = array();
330            foreach ($registerKeys as $key) {
331                $arrPC[$key] = $arrList[$key][$i];
332            }
333            $arrPC['product_id'] = $product_id;
334            $arrPC['sale_limit'] = $arrDefault['sale_limit'];
335            $arrPC['deliv_fee'] = $arrDefault['deliv_fee'];
336            $arrPC['point_rate'] = $arrDefault['point_rate'];
337            $arrPC['stock_unlimited'] = $stock_unlimited;
338
339            // 該当関数が無いため, セッションの値を直接代入
340            $arrPC['creator_id'] = $_SESSION['member_id'];
341            $arrPC['update_date'] = 'now()';
342            $arrPC['del_flg'] = $del_flg;
343
344            // 登録 or 更新
345            $is_update = false;
346            if (!SC_Utils_Ex::isBlank($arrList['product_class_id'][$i])) {
347                $is_update = true;
348
349                // 更新の場合は規格組み合わせを検索し, 削除しておく
350                $class_combination_id = $arrExists[$arrList['product_class_id'][$i]]['class_combination_id'];
351                $existsCombi = $objQuery->getRow(
352                    '*',
353                    'dtb_class_combination',
354                    'class_combination_id = ?',
355                    array($class_combination_id));
356
357                $objQuery->delete('dtb_class_combination',
358                                  'class_combination_id IN (?, ?)',
359                                  array($existsCombi['class_combination_id'],
360                                        $existsCombi['parent_class_combination_id']));
361            }
362
363            // 規格組み合わせを登録
364            $arrComb1['class_combination_id'] = $objQuery->nextVal('dtb_class_combination_class_combination_id');
365            $arrComb1['classcategory_id'] = $arrList['classcategory_id1'][$i];
366            $arrComb1['level'] = 1;
367            $objQuery->insert('dtb_class_combination', $arrComb1);
368
369            // 規格2も登録する場合
370            if (!SC_Utils_Ex::isBlank($arrList['classcategory_id2'][$i])) {
371                $arrComb2['class_combination_id'] = $objQuery->nextVal('dtb_class_combination_class_combination_id');
372                $arrComb2['classcategory_id'] = $arrList['classcategory_id2'][$i];
373                $arrComb2['parent_class_combination_id'] = $arrComb1['class_combination_id'];
374                $arrComb2['level'] = 2;
375                $objQuery->insert('dtb_class_combination', $arrComb2);
376
377                $arrPC['class_combination_id'] = $arrComb2['class_combination_id'];
378            } else {
379                $arrPC['class_combination_id'] = $arrComb1['class_combination_id'];
380            }
381
382            // 更新
383            if ($is_update) {
384                $arrPC['product_class_id'] = $arrList['product_class_id'][$i];
385                $objQuery->update("dtb_products_class", $arrPC,
386                                  "product_class_id = ?",
387                                  array($arrPC['product_class_id']));
388            }
389            // 新規登録
390            else {
391                $arrPC['create_date'] = "now()";
392                $arrPC['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id');
393                $objQuery->insert("dtb_products_class", $arrPC);
394            }
395        }
396
397        // 規格無し用の商品規格を非表示に
398        $arrBlank['del_flg'] = 1;
399        $arrBlank['update_date'] = 'now()';
400        $objQuery->update("dtb_products_class", $arrBlank,
401                          "product_id = ? AND class_combination_id IS NULL",
402                          array($product_id));
403
404        // 件数カウントバッチ実行
405        $objDb->sfCountCategory($objQuery);
406        $objQuery->commit();
407    }
408
409    /**
410     * 規格選択エラーチェックを行う
411     *
412     * ※SC_FormParamで対応していないエラーチェックのため, SC_CheckErrorを使用している.
413     *
414     * @return array エラーの配列
415     */
416    function lfCheckSelectClass() {
417        $objErr = new SC_CheckError_Ex();
418        $objErr->doFunc(array("規格1", "select_class_id1"), array("EXIST_CHECK"));
419        $objErr->doFunc(array("規格", "select_class_id1", "select_class_id2"), array("TOP_EXIST_CHECK"));
420        $objErr->doFunc(array("規格1", "規格2", "select_class_id1", "select_class_id2"), array("DIFFERENT_CHECK"));
421        return $objErr->arrErr;
422    }
423
424    /**
425     * 商品規格エラーチェック.
426     *
427     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
428     * @return array エラー結果の配列
429     */
430    function lfCheckProductsClass(&$objFormParam) {
431        $arrValues = $objFormParam->getHashArray();
432        $arrErr = $objFormParam->checkError();
433        $total = $objFormParam->getValue('total');
434
435        if (SC_Utils_Ex::isBlank($arrValues['check'])) {
436            $arrErr['check_empty'] = '※ 商品種別が選択されていません。<br />';
437        }
438
439        for ($i = 0; $i < $total; $i++) {
440
441            /*
442             * チェックボックスの入っている項目のみ, 必須チェックを行う.
443             * エラーを配列で返す必要があるため, SC_CheckError を使用しない.
444             */
445            if (!SC_Utils_Ex::isBlank($arrValues['check'][$i])) {
446
447                /*
448                 * 販売価格の必須チェック
449                 */
450                if (SC_Utils_Ex::isBlank($arrValues['price02'][$i])) {
451                    $arrErr['price02'][$i] = '※ ' . SALE_PRICE_TITLE . 'が入力されていません。<br />';
452                }
453                /*
454                 * 在庫数の必須チェック
455                 */
456                if ((SC_Utils_Ex::isBlank($arrValues['stock_unlimited'][$i])
457                     || $arrValues['stock_unlimited'][$i] != 1)
458
459                    && SC_Utils_Ex::isBlank($arrValues['stock'][$i])) {
460                    $arrErr['stock'][$i] = '※ 在庫数が入力されていません。<br />';
461                }
462                /*
463                 * 商品種別の必須チェック
464                 */
465                if (SC_Utils_Ex::isBlank($arrValues['product_type_id'][$i])) {
466                    $arrErr['product_type_id'][$i] = "※ 商品種別は、いずれかを選択してください。<br />";
467                }
468                /*
469                 * ダウンロード商品の必須チェック
470                 */
471                if($arrValues['product_type_id'][$i] == PRODUCT_TYPE_DOWNLOAD) {
472                    if (SC_Utils_Ex::isBlank($arrValues['down_filename'][$i])) {
473                        $arrErr['down_filename'][$i] = "※ ダウンロード商品の場合はダウンロードファイル名を入力してください。<br />";
474                    }
475                    if (SC_Utils_Ex::isBlank($arrValues['down_realfilename'][$i])) {
476                        $arrErr['down_realfilename'][$i] = "※ ダウンロード商品の場合はダウンロード商品用ファイルをアップロードしてください。<br />";
477                    }
478                }
479                /*
480                 * 通常商品チェック
481                 */
482                else if ($arrValues['product_type_id'][$i] == PRODUCT_TYPE_NORMAL) {
483                    if (!SC_Utils_Ex::isBlank($arrValues['down_filename'][$i])) {
484                        $arrErr['down_filename'] = "※ 通常商品の場合はダウンロードファイル名を設定できません。<br />";
485                    }
486                    if (!SC_Utils_Ex::isBlank($arrValues['down_realfilename'][$i])) {
487                        $arrErr['down_realfilename'][$i] = "※ 実商品の場合はダウンロード商品用ファイルをアップロードできません。<br />ファイルを取り消してください。<br />";
488                    }
489                }
490            }
491        }
492        return $arrErr;
493    }
494
495    /**
496     * 規格の組み合わせ一覧を表示する.
497     *
498     * 規格1, 規格2における規格分類のすべての組み合わせを取得し,
499     * 該当商品の商品規格の内容を取得後, フォームに設定する.
500     *
501     * @param SC_FormParam $objFormParam SC_FormParam インスタンス
502     * @return void
503     */
504    function doDisp(&$objFormParam) {
505        $product_id = $objFormParam->getValue('product_id');
506        $select_class_id1 = $objFormParam->getValue('select_class_id1');
507        $select_class_id2 = $objFormParam->getValue('select_class_id2');
508
509        // すべての組み合わせを取得し, フォームに設定
510        $arrClassCat = $this->getAllClassCategory($select_class_id1, $select_class_id2);
511        $total = count($arrClassCat);
512        $objFormParam->setValue('total', $total);
513        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($arrClassCat));
514
515        // class_id1, class_id2 は select_class_id1 で上書き
516        $objFormParam->setValue('class_id1', $select_class_id1);
517        $objFormParam->setValue('class_id2', $select_class_id2);
518
519        // 商品情報を取得し, フォームに設定
520        $arrProductsClass = $this->getProductsClass($product_id);
521
522        foreach ($arrProductsClass as $key => $val) {
523            // 組み合わせ数分の値の配列を生成する
524            $arrValues = array();
525            for ($i = 0; $i < $total; $i++) {
526                $arrValues[] = $val;
527            }
528            $objFormParam->setValue($key, $arrValues);
529        }
530    }
531
532    /**
533     * 規格編集画面を表示する
534     *
535     * @param integer $product_id 商品ID
536     * @param bool $existsValue
537     * @param bool $usepostValue
538     */
539    function doPreEdit(&$objFormParam) {
540        $product_id = $objFormParam->getValue('product_id');
541        $objProduct = new SC_Product_Ex();
542        $existsProductsClass = $objProduct->getProductsClassFullByProductId($product_id, true);
543
544        $class_id1 = $existsProductsClass[0]['class_id1'];
545        $class_id2 = $existsProductsClass[0]['class_id2'];
546        $objFormParam->setValue('class_id1', $class_id1);
547        $objFormParam->setValue('class_id2', $class_id2);
548        $objFormParam->setValue('select_class_id1', $class_id1);
549        $objFormParam->setValue('select_class_id2', $class_id2);
550        $this->doDisp($objFormParam);
551
552        // 登録済みのデータで上書き
553        $objFormParam->setParam(SC_Utils_Ex::sfSwapArray($existsProductsClass));
554
555        // $existsProductsClass で product_id が配列になってしまうため数値で上書き
556        $objFormParam->setValue('product_id', $product_id);
557
558        // check を設定
559        $arrChecks = array();
560        $index = 0;
561        foreach ($objFormParam->getValue('del_flg') as $key => $val) {
562            if ($val == 0) {
563                $arrChecks[$index] = 1;
564            }
565            $index++;
566        }
567        $objFormParam->setValue('check', $arrChecks);
568
569        // class_id1, class_id2 を上書き
570        $objFormParam->setValue('class_id1', $class_id1);
571        $objFormParam->setValue('class_id2', $class_id2);
572
573        // DBデータからダウンロードファイル名の読込
574        $this->objDownFile->setDBFileList($this->arrForm);
575        // PostデータからダウンロードTempファイル名の読込
576        $this->objDownFile->setPostFileList($_POST, $this->arrForm);
577    }
578
579    /**
580     * 規格の削除を実行する
581     *
582     * @param $product_id
583     * @return void
584     */
585    function doDelete($product_id) {
586        $objQuery =& SC_Query_Ex::getSingletonInstance();
587
588        $objQuery->begin();
589        $objQuery->update("dtb_products_class", array('del_flg' => 0),
590                          "product_id = ? AND class_combination_id IS NULL", array($product_id));
591        $objQuery->update("dtb_products_class", array('del_flg' => 1),
592                          "product_id = ? AND class_combination_id IS NOT NULL", array($product_id));
593        $objQuery->commit();
594
595        // 在庫無し商品の非表示対応
596        if (NOSTOCK_HIDDEN === true) {
597            // 件数カウントバッチ実行
598            $objDb = new SC_Helper_DB_Ex();
599            $objDb->sfCountCategory($objQuery);
600        }
601    }
602
603    /**
604     * 規格ID1, 規格ID2の規格分類すべてを取得する.
605     *
606     * @param integer $class_id1 規格ID1
607     * @param integer $class_id2 規格ID2
608     * @return array 規格と規格分類の配列
609     */
610    function getAllClassCategory($class_id1, $class_id2 = null) {
611        $objQuery =& SC_Query_Ex::getSingletonInstance();
612
613        $col = <<< __EOF__
614            T1.class_id AS class_id1,
615            T1.classcategory_id AS classcategory_id1,
616            T1.name AS classcategory_name1,
617            T1.rank AS rank1
618__EOF__;
619        $table = '';
620        $arrParams = array();
621        if(SC_Utils_Ex::isBlank($class_id2)) {
622            $table = "dtb_classcategory T1 ";
623            $objQuery->setWhere("T1.class_id = ?");
624            $objQuery->setOrder("T1.rank DESC");
625            $arrParams = array($class_id1);
626        } else {
627            $col .= <<< __EOF__
628                ,
629                T2.class_id AS class_id2,
630                T2.classcategory_id AS classcategory_id2,
631                T2.name AS classcategory_name2,
632                T2.rank AS rank2
633__EOF__;
634            $table = "dtb_classcategory AS T1, dtb_classcategory AS T2";
635            $objQuery->setWhere("T1.class_id = ? AND T2.class_id = ?");
636            $objQuery->setOrder("T1.rank DESC, T2.rank DESC");
637            $arrParams = array($class_id1, $class_id2);
638        }
639        return $objQuery->select($col, $table, "", $arrParams);
640    }
641
642    /**
643     * 商品名を取得する.
644     *
645     * @access private
646     * @param integer $product_id 商品ID
647     * @return string 商品名の文字列
648     */
649    function getProductName($product_id) {
650        $objQuery =& SC_Query_Ex::getSingletonInstance();
651        return $objQuery->get('name', 'dtb_products', 'product_id = ?', array($product_id));
652    }
653
654    /**
655     * 規格分類の登録された, すべての規格を取得する.
656     *
657     * @access private
658     * @return array 規格分類の登録された, すべての規格
659     */
660    function getAllClass() {
661        $arrClass = SC_Helper_DB_Ex::sfGetIDValueList("dtb_class", 'class_id', 'name');
662
663        // 規格分類が登録されていない規格は表示しないようにする。
664        $arrClassCatCount = SC_Utils_Ex::sfGetClassCatCount();
665
666        $results = array();
667        if (!SC_Utils_Ex::isBlank($arrClass)) {
668            foreach($arrClass as $key => $val) {
669                if($arrClassCatCount[$key] > 0) {
670                    $results[$key] = $arrClass[$key];
671                }
672            }
673        }
674        return $results;
675    }
676
677    /**
678     * 商品IDをキーにして, 商品規格の初期値を取得する.
679     *
680     * 商品IDをキーにし, デフォルトに設定されている商品規格を取得する.
681     *
682     * @param integer $product_id 商品ID
683     * @return array 商品規格の配列
684     */
685    function getProductsClass($product_id) {
686        $objQuery =& SC_Query_Ex::getSingletonInstance();
687        $col = "product_code, price01, price02, stock, stock_unlimited, sale_limit, deliv_fee, point_rate";
688        return $objQuery->getRow($col, "dtb_products_class", "product_id = ? AND class_combination_id IS NULL", array($product_id));
689    }
690}
Note: See TracBrowser for help on using the repository browser.