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

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