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

Revision 20440, 31.7 KB checked in by nanasess, 13 years ago (diff)

#1063([管理画面]商品管理(商品規格登録):規格が無い商品に規格を新規登録するとエラー)

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