source: branches/camp/camp-2_5-C/data/class/pages/admin/products/LC_Page_Admin_Products.php @ 19337

Revision 19337, 19.6 KB checked in by kishik, 12 years ago (diff)

商品一覧での在庫変更

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id Revision Date
  • 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_PATH . "pages/LC_Page.php");
26
27/**
28 * 商品管理 のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id:LC_Page_Admin_Products.php 15532 2007-08-31 14:39:46Z nanasess $
33 */
34class LC_Page_Admin_Products extends LC_Page {
35
36    // }}}
37    // {{{ functions
38
39    /**
40     * Page を初期化する.
41     *
42     * @return void
43     */
44    function init() {
45        parent::init();
46        $this->tpl_mainpage = 'products/index.tpl';
47        $this->tpl_mainno = 'products';
48        $this->tpl_subnavi = 'products/subnavi.tpl';
49        $this->tpl_subno = 'index';
50        $this->tpl_pager = TEMPLATE_DIR . 'admin/pager.tpl';
51        $this->tpl_subtitle = '商品マスタ';
52
53        $masterData = new SC_DB_MasterData_Ex();
54        $this->arrPageMax = $masterData->getMasterData("mtb_page_max");
55        $this->arrDISP = $masterData->getMasterData("mtb_disp");
56        $this->arrSTATUS = $masterData->getMasterData("mtb_status");
57        $this->arrPRODUCTSTATUS_COLOR = $masterData->getMasterData("mtb_product_status_color");
58    }
59
60    /**
61     * Page のプロセス.
62     *
63     * @return void
64     */
65    function process() {
66        $objView = new SC_AdminView();
67        $objDb = new SC_Helper_DB_Ex();
68        $objDate = new SC_Date();
69
70        // 登録・更新検索開始年
71        $objDate->setStartYear(RELEASE_YEAR);
72        $objDate->setEndYear(DATE("Y"));
73        $this->arrStartYear = $objDate->getYear();
74        $this->arrStartMonth = $objDate->getMonth();
75        $this->arrStartDay = $objDate->getDay();
76        // 登録・更新検索終了年
77        $objDate->setStartYear(RELEASE_YEAR);
78        $objDate->setEndYear(DATE("Y"));
79        $this->arrEndYear = $objDate->getYear();
80        $this->arrEndMonth = $objDate->getMonth();
81        $this->arrEndDay = $objDate->getDay();
82
83        // 認証可否の判定
84        $objSess = new SC_Session();
85        SC_Utils_Ex::sfIsSuccess($objSess);
86
87        if (!isset($_POST['mode'])) $_POST['mode'] = "";
88
89        // 商品一覧での価格変更
90        if($_POST['mode'] === "price02_edit") {
91            $objQuery = new SC_Query();
92
93            //トランザクション開始
94            $objQuery->begin();
95            //エラーフラグ初期化
96            $err_flag = false;
97
98            // データ更新
99            $data["price02"] = $_POST['price02_edit_value'];
100            $where = "product_id=" . $_POST['price02_edit_id'];
101            $objQuery->update("dtb_products_class", $data, $where);
102            if($objQuery->isError())
103            {
104                $err_flag = true;
105            }
106
107            //トランザクション終了
108            if($err_flag)
109            {
110                $objQuery->rollback();
111                echo("error");
112            }
113            else
114            {
115                $objQuery->commit();
116                echo("ok");
117            }
118            //戻る
119            exit;
120        }
121
122        // 商品一覧での在庫変更
123        if($_POST['mode'] === "stock_edit") {
124            $objQuery = new SC_Query();
125
126            //トランザクション開始
127            $objQuery->begin();
128            //エラーフラグ初期化
129            $err_flag = false;
130
131            // データ更新
132            $data["stock"] = $_POST['stock_edit_value'];
133            $where = "product_id=" . $_POST['stock_edit_id'];
134            $objQuery->update("dtb_products_class", $data, $where);
135            if($objQuery->isError())
136            {
137                $err_flag = true;
138            }
139
140            //トランザクション終了
141            if($err_flag)
142            {
143                $objQuery->rollback();
144                echo("error");
145            }
146            else
147            {
148                $objQuery->commit();
149                echo("ok");
150            }
151            //戻る
152            exit;
153        }
154
155        //キャンペーンの編集時
156        if(isset($_POST['campaign_id']) && SC_Utils_Ex::sfIsInt($_POST['campaign_id'])
157                && $_POST['mode'] == "camp_search") {
158            $objQuery = new SC_Query();
159            $search_data = $objQuery->get("dtb_campaign", "search_condition", "campaign_id = ? ", array($_POST['campaign_id']));
160            $arrSearch = unserialize($search_data);
161            foreach ($arrSearch as $key => $val) {
162                $_POST[$key] = $val;
163            }
164        }
165
166        // POST値の引き継ぎ
167        $this->arrForm = $_POST;
168
169        // 検索ワードの引き継ぎ
170        foreach ($_POST as $key => $val) {
171            if (ereg("^search_", $key) || ereg("^campaign_", $key)) {
172                switch($key) {
173                    case 'search_product_flag':
174                    case 'search_status':
175                        $this->arrHidden[$key] = SC_Utils_Ex::sfMergeParamCheckBoxes($val);
176                        if(!is_array($val)) {
177                            $this->arrForm[$key] = split("-", $val);
178                        }
179                        break;
180                    default:
181                        $this->arrHidden[$key] = $val;
182                        break;
183                }
184            }
185        }
186
187        // ページ送り用
188        $this->arrHidden['search_pageno'] = isset($_POST['search_pageno']) ? $_POST['search_pageno'] : "";
189
190        // 商品削除
191        if ($_POST['mode'] == "delete") {
192
193            if($_POST['category_id'] != "") {
194                // ランク付きレコードの削除
195                $where = "category_id = " . SC_Utils_Ex::sfQuoteSmart($_POST['category_id']);
196                $objDb->sfDeleteRankRecord("dtb_products", "product_id", $_POST['product_id'], $where);
197            } else {
198                $objDb->sfDeleteRankRecord("dtb_products", "product_id", $_POST['product_id']);
199            }
200            // 子テーブル(商品規格)の削除
201            $objQuery = new SC_Query();
202            $objQuery->delete("dtb_products_class", "product_id = ?", array($_POST['product_id']));
203
204            // お気に入り商品削除
205            $objQuery->delete("dtb_customer_favorite_products", "product_id = ?", array($_POST['product_id']));
206
207            // 件数カウントバッチ実行
208            $objDb->sfCategory_Count($objQuery);
209            $objDb->sfMaker_Count($objQuery);
210        }
211
212
213        if ($_POST['mode'] == "search" || $_POST['mode'] == "csv"  || $_POST['mode'] == "delete" || $_POST['mode'] == "delete_all" || $_POST['mode'] == "camp_search") {
214            // 入力文字の強制変換
215            $this->lfConvertParam();
216            // エラーチェック
217            $this->arrErr = $this->lfCheckError();
218
219            $where = "del_flg = 0";
220            $view_where = "del_flg = 0";
221
222            // 入力エラーなし
223            if (count($this->arrErr) == 0) {
224
225                $arrval = array();
226                foreach ($this->arrForm as $key => $val) {
227
228                    if($val == "") {
229                        continue;
230                    }
231
232                    switch ($key) {
233                        case 'search_product_id': // 商品ID
234                            $where .= " AND product_id = ?";
235                            $view_where .= " AND product_id = ?";
236                            $arrval[] = $val;
237                            break;
238                        case 'search_product_class_name': //規格名称
239                            $where_in = " (SELECT classcategory_id FROM dtb_classcategory WHERE class_id IN (SELECT class_id FROM dtb_class WHERE name LIKE ?)) ";
240                            $where .= " AND product_id IN (SELECT product_id FROM dtb_products_class WHERE classcategory_id1 IN " . $where_in;
241                            $where .= " OR classcategory_id2 IN" . $where_in . ")";
242                            $view_where .= " AND product_id IN (SELECT product_id FROM dtb_products_class WHERE classcategory_id1 IN " . $where_in;
243                            $view_where .= " OR classcategory_id2 IN" . $where_in . ")";
244                            $arrval[] = "%$val%";
245                            $arrval[] = "%$val%";
246                            $view_where = $where;
247                            break;
248                        case 'search_name': // 商品名
249                            $where .= " AND name ILIKE ?";
250                            $view_where .= " AND name ILIKE ?";
251                            $arrval[] = "%$val%";
252                            break;
253                        case 'search_category_id': // カテゴリー
254                            list($tmp_where, $tmp_arrval) = $objDb->sfGetCatWhere($val);
255                            if($tmp_where != "") {
256                                $where.= " AND product_id IN (SELECT product_id FROM dtb_product_categories WHERE " . $tmp_where . ")";
257                                $view_where.= " AND product_id IN (SELECT product_id FROM dtb_product_categories WHERE " . $tmp_where . ")";
258                                $arrval = array_merge((array)$arrval, (array)$tmp_arrval);
259                            }
260                            break;
261                        case 'search_product_code': // 商品コード
262                            $where .= " AND product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code ILIKE ? GROUP BY product_id)";
263                            $view_where .= " AND EXISTS (SELECT product_id FROM dtb_products_class as cls WHERE cls.product_code ILIKE ? AND dtb_products.product_id = cls.product_id GROUP BY cls.product_id )";
264                            $arrval[] = "%$val%";
265                            break;
266                        case 'search_startyear': // 登録更新日(FROM)
267                            // FIXME POST の値をチェックする
268                            $date = SC_Utils_Ex::sfGetTimestamp($_POST['search_startyear'], $_POST['search_startmonth'], $_POST['search_startday']);
269                            $where.= " AND update_date >= '" . $_POST['search_startyear'] . "/" . $_POST['search_startmonth']. "/" .$_POST['search_startday'] . "'";
270                            $view_where.= " AND update_date >= '" . $_POST['search_startyear'] . "/" . $_POST['search_startmonth']. "/" .$_POST['search_startday'] . "'";
271                            break;
272                        case 'search_endyear': // 登録更新日(TO)
273                            $date = SC_Utils_Ex::sfGetTimestamp($_POST['search_endyear'], $_POST['search_endmonth'], $_POST['search_endday']);
274                            $date = date('Y/m/d', strtotime($date) + 86400);
275                            $where.= " AND update_date < date('" . $date . "')";
276                            $view_where.= " AND update_date < date('" . $date . "')";
277                            break;
278                        case 'search_product_flag': //種別
279                            global $arrSTATUS;
280                            $search_product_flag = SC_Utils_Ex::sfSearchCheckBoxes($val);
281                            if($search_product_flag != "") {
282                                $where.= " AND product_flag LIKE ?";
283                                $view_where.= " AND product_flag LIKE ?";
284                                $arrval[] = $search_product_flag;
285                            }
286                            break;
287                        case 'search_status': // ステータス
288                            $tmp_where = "";
289                            foreach ($val as $element){
290                                if ($element != ""){
291                                    if ($tmp_where == ""){
292                                        $tmp_where.="AND (status = ? ";
293                                    }else{
294                                        $tmp_where.="OR status = ? ";
295                                    }
296                                    $arrval[]=$element;
297                                }
298                            }
299                            if ($tmp_where != ""){
300                                $tmp_where.=")";
301                                $where.= " $tmp_where";
302                                $view_where.= " $tmp_where";
303                            }
304                            break;
305                        default:
306                            break;
307                    }
308                }
309
310                $order = "update_date DESC, product_id DESC";
311                $objQuery = new SC_Query();
312                $objProduct = new SC_Product();
313                switch($_POST['mode']) {
314                    case 'csv':
315                        require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_CSV_Ex.php");
316
317                        $objCSV = new SC_Helper_CSV_Ex();
318
319                        // CSVを送信する。正常終了の場合、終了。
320                        $objCSV->sfDownloadProductsCsv($where, $arrval, $order) && exit;
321                        break;
322                    case 'delete_all':
323                        // 検索結果をすべて削除
324                        $where = "product_id IN (SELECT product_id FROM "
325                            . $objProduct->alldtlSQL() . " WHERE $where)";
326                        $sqlval['del_flg'] = 1;
327                        $objQuery->update("dtb_products", $sqlval, $where, $arrval);
328                        $objQuery->delete("dtb_customer_favorite_products", $where, $arrval);
329
330                        // 件数カウントバッチ実行
331                        $objDb->sfCategory_Count($objQuery);
332
333                        break;
334                    default:
335                        // 読み込む列とテーブルの指定
336                        $col = "product_id, name, main_list_image, status, product_code_min, product_code_max, price02_min, price02_max, stock_min, stock_max, stock_unlimited_min, stock_unlimited_max, update_date";
337                        $from = $objProduct->alldtlSQL();
338
339                        // 行数の取得
340                        $linemax = $objQuery->count("dtb_products", $view_where, $arrval);
341                        $this->tpl_linemax = $linemax; // 何件が該当しました。表示用
342
343                        // ページ送りの処理
344                        if(is_numeric($_POST['search_page_max'])) {
345                            $page_max = $_POST['search_page_max'];
346                        } else {
347                            $page_max = SEARCH_PMAX;
348                        }
349
350                        // ページ送りの取得
351                        $objNavi = new SC_PageNavi($this->arrHidden['search_pageno'], $linemax, $page_max, "fnNaviSearchPage", NAVI_PMAX);
352                        $startno = $objNavi->start_row;
353                        $this->arrPagenavi = $objNavi->arrPagenavi;
354
355                        //キャンペーン商品検索時は、全結果の商品IDを変数に格納する
356                        if(isset($_POST['search_mode']) && $_POST['search_mode'] == 'campaign') {
357                            $arrRet = $objQuery->select($col, $from, $where, $arrval);
358                            if(count($arrRet) > 0) {
359                                $arrRet = sfSwapArray($arrRet);
360                                $pid = implode("-", $arrRet['product_id']);
361                                $this->arrHidden['campaign_product_id'] = $pid;
362                            }
363                        }
364
365                        // 取得範囲の指定(開始行番号、行数のセット)
366                        $objQuery->setLimitOffset($page_max, $startno);
367                        // 表示順序
368                        $objQuery->setOrder($order);
369
370                        // 検索結果の取得
371                        $this->arrProducts = $objQuery->select($col, $from, $where, $arrval);
372                       
373                        // 各商品ごとのカテゴリIDを取得
374                        if (count($this->arrProducts) > 0) {
375                            foreach ($this->arrProducts as $key => $val) {
376                                $this->arrProducts[$key]["categories"] = $objDb->sfGetCategoryId($val["product_id"], 0, true);
377                                $objDb->g_category_on = false;
378                            }
379                        }
380                }
381            }
382        }
383
384        // カテゴリの読込
385        list($this->arrCatKey, $this->arrCatVal) = $objDb->sfGetLevelCatList(false);
386        $this->arrCatList = $this->lfGetIDName($this->arrCatKey, $this->arrCatVal);
387
388        // 画面の表示
389        $objView->assignobj($this);
390        $objView->display(MAIN_FRAME);
391    }
392
393    /**
394     * デストラクタ.
395     *
396     * @return void
397     */
398    function destroy() {
399        parent::destroy();
400    }
401
402    // 取得文字列の変換
403    function lfConvertParam() {
404        global $objPage;
405        /*
406         *  文字列の変換
407         *  K :  「半角(ハンカク)片仮名」を「全角片仮名」に変換
408         *  C :  「全角ひら仮名」を「全角かた仮名」に変換
409         *  V :  濁点付きの文字を一文字に変換。"K","H"と共に使用します
410         *  n :  「全角」数字を「半角(ハンカク)」に変換
411         */
412        $arrConvList['search_name'] = "KVa";
413        $arrConvList['search_product_code'] = "KVa";
414
415        // 文字変換
416        foreach ($arrConvList as $key => $val) {
417            // POSTされてきた値のみ変換する。
418            if(isset($objPage->arrForm[$key])) {
419                $objPage->arrForm[$key] = mb_convert_kana($objPage->arrForm[$key] ,$val);
420            }
421        }
422    }
423
424    // エラーチェック
425    // 入力エラーチェック
426    function lfCheckError() {
427        $objErr = new SC_CheckError();
428        $objErr->doFunc(array("商品ID", "search_product_id"), array("NUM_CHECK"));
429        $objErr->doFunc(array("開始日", "search_startyear", "search_startmonth", "search_startday"), array("CHECK_DATE"));
430        $objErr->doFunc(array("終了日", "search_endyear", "search_endmonth", "search_endday"), array("CHECK_DATE"));
431        $objErr->doFunc(array("開始日", "終了日", "search_startyear", "search_startmonth", "search_startday", "search_endyear", "search_endmonth", "search_endday"), array("CHECK_SET_TERM"));
432        return $objErr->arrErr;
433    }
434
435    // チェックボックス用WHERE文作成
436    function lfGetCBWhere($key, $max) {
437        $str = "";
438        $find = false;
439        for ($cnt = 1; $cnt <= $max; $cnt++) {
440            if ($_POST[$key . $cnt] == "1") {
441                $str.= "1";
442                $find = true;
443            } else {
444                $str.= "_";
445            }
446        }
447        if (!$find) {
448            $str = "";
449        }
450        return $str;
451    }
452
453    // カテゴリIDをキー、カテゴリ名を値にする配列を返す。
454    function lfGetIDName($arrCatKey, $arrCatVal) {
455        $max = count($arrCatKey);
456        for ($cnt = 0; $cnt < $max; $cnt++ ) {
457            $key = isset($arrCatKey[$cnt]) ? $arrCatKey[$cnt] : "";
458            $val = isset($arrCatVal[$cnt]) ? $arrCatVal[$cnt] : "";
459            $arrRet[$key] = $val;
460        }
461        return $arrRet;
462    }
463}
464?>
Note: See TracBrowser for help on using the repository browser.