source: branches/feature-module-update/data/class/pages/admin/customer/LC_Page_Admin_Customer.php @ 16379

Revision 16379, 24.4 KB checked in by nanasess, 14 years ago (diff)

addslashes() を SC_Utils_Ex::sfQuoteSmart() に修正

  • Property svn:keywords set to "Id Revision Date"
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8// {{{ requires
9require_once(CLASS_PATH . "pages/LC_Page.php");
10
11/**
12 * 顧客管理 のページクラス.
13 *
14 * @package Page
15 * @author LOCKON CO.,LTD.
16 * @version $Id$
17 */
18class LC_Page_Admin_Customer extends LC_Page {
19
20    // {{{ properties
21
22    // TODO
23    var $arrSession;
24    var $tpl_mode;
25    var $list_data;
26    var $search_data;
27    var $arrErr;
28    var $arrYear;
29    var $arrMonth;
30    var $arrDay;
31    var $arrJob;
32    var $arrSex;
33    var $arrPageMax;
34    var $count;
35    var $search_SQL;
36    var $tpl_strnavi;
37    var $arrHtmlmail;
38
39
40    // }}}
41    // {{{ functions
42
43    /**
44     * Page を初期化する.
45     *
46     * @return void
47     */
48    function init() {
49        parent::init();
50        $this->tpl_mainpage = 'customer/index.tpl';
51        $this->tpl_mainno = 'customer';
52        $this->tpl_subnavi = 'customer/subnavi.tpl';
53        $this->tpl_subno = 'index';
54        $this->tpl_pager = TEMPLATE_DIR . 'admin/pager.tpl';
55        $this->tpl_subtitle = '顧客マスタ';
56
57        $masterData = new SC_DB_MasterData_Ex();
58        $this->arrPref = $masterData->getMasterData("mtb_pref",
59                             array("pref_id", "pref_name", "rank"));
60
61        $this->arrJob = $masterData->getMasterData("mtb_job");
62        $this->arrJob["不明"] = "不明";
63        $this->arrSex = $masterData->getMasterData("mtb_sex");
64        $this->arrPageRows = $masterData->getMasterData("mtb_page_rows");
65        $this->arrMAILMAGATYPE = $masterData->getMasterData("mtb_mail_magazine_type");
66        $this->arrHtmlmail[''] = "すべて";
67        $this->arrHtmlmail[1] = $this->arrMAILMAGATYPE[1];
68        $this->arrHtmlmail[2] = $this->arrMAILMAGATYPE[2];
69
70        //---- CSVダウンロード用
71        $this->arrColumnCSV = array(0  => array("sql" => "customer_id",
72                                                "csv" => "customer_id",
73                                                "header" => "顧客ID"),
74                                    1  => array("sql" => "name01",
75                                                "csv" => "name01",
76                                                "header" => "名前1"),
77                                    2  => array("sql" => "name02",
78                                                "csv" => "name02",
79                                                "header" => "名前2"),
80                                    3  => array("sql" => "kana01",
81                                                "csv" => "kana01",
82                                                "header" => "フリガナ1"),
83                                    4  => array("sql" => "kana02",
84                                                "csv" => "kana02",
85                                                "header" => "フリガナ2"),
86                                    5  => array("sql" => "zip01",
87                                                "csv" => "zip01",
88                                                "header" => "郵便番号1"),
89                                    6  => array("sql" => "zip02",
90                                                "csv" => "zip02",
91                                                "header" => "郵便番号2"),
92                                    7  => array("sql" => "pref",
93                                                "csv" => "pref",
94                                                "header" => "都道府県"),
95                                    8  => array("sql" => "addr01",
96                                                "csv" => "addr01",
97                                                "header" => "住所1"),
98                                    9  => array("sql" => "addr02",
99                                                "csv" => "addr02",
100                                                "header" => "住所2"),
101                                    10 => array("sql" => "email",
102                                                "csv" => "email",
103                                                "header" => "E-MAIL"),
104                                    11 => array("sql" => "tel01",
105                                                "csv" => "tel01",
106                                                "header" => "TEL1"),
107                                    12 => array("sql" => "tel02",
108                                                "csv" => "tel02",
109                                                "header" => "TEL2"),
110                                    13 => array("sql" => "tel03",
111                                                "csv" => "tel03",
112                                                "header" => "TEL3"),
113                                    14 => array("sql" => "fax01",
114                                                "csv" => "fax01",
115                                                "header" => "FAX1"),
116                                    15 => array("sql" => "fax02",
117                                                "csv" => "fax02",
118                                                "header" => "FAX2"),
119                                    16 => array("sql" => "fax03",
120                                                "csv" => "fax03",
121                                                "header" => "FAX3"),
122                                    17 => array("sql" => "CASE WHEN sex = 1 "
123                                                . " THEN '男性' "
124                                                . " ELSE '女性' END AS sex",
125                                                "csv" => "sex",
126                                                "header" => "性別"),
127                                    18 => array("sql" => "job",
128                                                "csv" => "job",
129                                                "header" => "職業"),
130                                    19 => array("sql" => "cast(birth as date) AS birth",
131                                                "csv" => "birth",
132                                                "header" => "誕生日"),
133                                    20 => array("sql" => "cast(first_buy_date as date) AS first_buy_date",
134                                                "csv" => "first_buy_date",
135                                                "header" => "初回購入日"),
136                                    21 => array("sql" => "cast(last_buy_date as date) AS last_buy_date",
137                                                "csv" => "last_buy_date",
138                                                "header" => "最終購入日"),
139                                    22 => array("sql" => "buy_times",
140                                                "csv" => "buy_times",
141                                                "header" => "購入回数"),
142                                    23 => array("sql" => "point",
143                                                "csv" => "point",
144                                                "header" => "ポイント残高"),
145                                    24 => array("sql" => "note",
146                                                "csv" => "note",
147                                                "header" => "備考"),
148                                    25 => array("sql" => "cast(create_date as date) AS create_date",
149                                                "csv" => "create_date",
150                                                "header" => "登録日"),
151                                    26 => array("sql" => "cast(update_date as date) AS update_date",
152                                                "csv" => "update_date",
153                                                "header" => "更新日")
154                                    );
155    }
156
157    /**
158     * Page のプロセス.
159     *
160     * @return void
161     */
162    function process() {
163        //---- ページ初期設定
164        $objQuery = new SC_Query();
165        $objView = new SC_AdminView();
166        $objDate = new SC_Date(1901);
167        $objDb = new SC_Helper_DB_Ex();
168        $this->arrYear = $objDate->getYear();   // 日付プルダウン設定
169        $this->arrMonth = $objDate->getMonth();
170        $this->arrDay = $objDate->getDay();
171        $this->objDate = $objDate;
172
173        // 認証可否の判定
174        $objSess = new SC_Session();
175        SC_Utils_Ex::sfIsSuccess($objSess);
176
177        // POST値の引き継ぎ
178        $this->arrForm = $_POST;
179
180        // ページ送り用
181        $this->arrHidden['search_pageno'] =
182                isset($_POST['search_pageno']) ? $_POST['search_pageno'] : "";
183
184        // 検索ワードの引き継ぎ
185        foreach ($_POST as $key => $val) {
186            switch($key) {
187            case 'sex':
188                $this->arrHidden[$key] = SC_Utils_Ex::sfMergeParamCheckBoxes($val);
189                if(!is_array($val)) {
190                    $this->arrForm[$key] = split("-", $val);
191                }
192                break;
193            default:
194                $this->arrHidden[$key] = $val;
195                break;
196            }
197        }
198
199        if (!isset($_POST['mode'])) $_POST['mode'] = "";
200
201        // 顧客削除
202        if ($_POST['mode'] == "delete") {
203            $sql = "SELECT status,email FROM dtb_customer WHERE customer_id = ? AND del_flg = 0";
204            $result_customer = $objQuery->conn->getAll($sql, array($_POST["edit_customer_id"]));
205
206            if ($result_customer[0]["status"] == 2) {           //本会員削除
207                $arrDel = array("del_flg" => 1, "update_date" => "NOW()");
208                $objQuery->conn->autoExecute("dtb_customer", $arrDel, "customer_id = " . SC_Utils_Ex::sfQuoteSmart($_POST["edit_customer_id"]) );
209            } elseif ($result_customer[0]["status"] == 1) {     //仮会員削除
210                $sql = "DELETE FROM dtb_customer WHERE customer_id = ?";
211                $objQuery->conn->query($sql, array($_POST["edit_customer_id"]));
212            }
213        }
214        if ($_POST['mode'] == "search" || $_POST['mode'] == "csv"  || $_POST['mode'] == "delete" || $_POST['mode'] == "delete_all") {
215            // 入力文字の強制変換
216            $this->lfConvertParam();
217            // エラーチェック
218            $this->arrErr = $this->lfCheckError($this->arrForm);
219
220            $where = "del_flg = 0";
221
222            /* 入力エラーなし */
223            if (count($this->arrErr) == 0) {
224
225                //-- 検索データ取得
226                $objSelect = new SC_CustomerList($this->arrForm, "customer");
227
228                // 表示件数設定
229                $page_rows = $this->arrForm['page_rows'];
230                if(is_numeric($page_rows)) {
231                    $page_max = $page_rows;
232                } else {
233                    $page_max = SEARCH_PMAX;
234                }
235
236                if (!isset($this->arrForm['search_pageno'])) $this->arrForm['search_pageno'] = "";
237
238                if ($this->arrForm['search_pageno'] == 0){
239                    $this->arrForm['search_pageno'] = 1;
240                }
241
242                $offset = $page_max * ($this->arrForm['search_pageno'] - 1);
243                $objSelect->setLimitOffset($page_max, $offset);
244
245                if ($_POST["mode"] == 'csv') {
246                    $searchSql = $objSelect->getListCSV($this->arrColumnCSV);
247                }else{
248                    $searchSql = $objSelect->getList();
249                }
250
251                $this->search_data = $objQuery->conn->getAll($searchSql, $objSelect->arrVal);
252
253                switch($_POST['mode']) {
254                case 'csv':
255                    require_once(CLASS_EX_PATH . "helper_extends/SC_Helper_CSV_Ex.php");
256
257                    $objCSV = new SC_Helper_CSV_Ex();
258                    $i = 0;
259                    $header = "";
260
261                    // CSVカラム取得
262                    $arrCsvOutput = ($objCSV->sfgetCsvOutput(2, " WHERE csv_id = 2 AND status = 1"));
263
264                    if (count($arrCsvOutput) <= 0) break;
265
266                    foreach($arrCsvOutput as $data) {
267                        $arrColumn[] = $data["col"];
268                        if ($i != 0) $header .= ", ";
269                        $header .= $data["disp_name"];
270                        $i ++;
271                    }
272                    $header .= "\n";
273
274                    //- 都道府県/職業の変換
275                    for($i = 0; $i < count($this->search_data); $i ++) {
276                        $this->search_data[$i]["pref"] = $arrPref[ $this->search_data[$i]["pref"] ];
277                        $this->search_data[$i]["job"]  = $arrJob[ $this->search_data[$i]["job"] ];
278                    }
279
280                    //- CSV出力
281                    $data = $this->lfGetCSVData($this->search_data, $arrColumn);
282
283                    SC_Utils_Ex::sfCSVDownload($header.$data);
284                    exit;
285                    break;
286                case 'delete_all':
287                    // 検索結果をすべて削除
288                    $where = "product_id IN (SELECT product_id FROM vw_products_nonclass AS noncls WHERE $where)";
289                    $sqlval['del_flg'] = 1;
290                    $objQuery->update("dtb_products", $sqlval, $where, $arrval);
291
292                    $sql = "SELECT status,email FROM dtb_customer WHERE customer_id = ? AND del_flg = 0";
293                    $result_customer = $objQuery->conn->getAll($sql, array($_POST["del_customer_id"]));
294
295                    if ($result_customer[0]["status"] == 2) {           //本会員削除
296                        $arrDel = array("del_flg" => 1, "update_date" => "NOW()");
297                        $objQuery->conn->autoExecute("dtb_customer", $arrDel, "customer_id = " . SC_Utils_Ex::sfQuoteSmart($_POST["del_customer_id"]) );
298                    } elseif ($result_customer[0]["status"] == 1) {     //仮会員削除
299                        $sql = "DELETE FROM dtb_customer WHERE customer_id = ?";
300                        $objQuery->conn->query($sql, array($_POST["del_customer_id"]));
301                    }
302
303                    break;
304                default:
305
306                    // 行数の取得
307                    $linemax = $objQuery->conn->getOne( $objSelect->getListCount(), $objSelect->arrVal);
308                    $this->tpl_linemax = $linemax;              // 何件が該当しました。表示用
309
310                    // ページ送りの取得
311                    $objNavi = new SC_PageNavi($this->arrHidden['search_pageno'],
312                                               $linemax, $page_max,
313                                               "fnCustomerPage", NAVI_PMAX);
314                    $startno = $objNavi->start_row;
315                    $this->arrPagenavi = $objNavi->arrPagenavi;
316                }
317            }
318        }
319
320        $this->arrCatList = $objDb->sfGetCategoryList();
321
322        //---- ページ表示
323        $objView->assignobj($this);
324        $objView->display(MAIN_FRAME);
325    }
326
327    /**
328     * デストラクタ.
329     *
330     * @return void
331     */
332    function destroy() {
333        parent::destroy();
334    }
335
336    //---- 取得文字列の変換
337    function lfConvertParam() {
338        /*
339         *  文字列の変換
340         *  K :  「半角(ハンカク)片仮名」を「全角片仮名」に変換
341         *  C :  「全角ひら仮名」を「全角かた仮名」に変換
342         *  V :  濁点付きの文字を一文字に変換。"K","H"と共に使用します
343         *  n :  「全角」数字を「半角(ハンカク)」に変換
344         *  a :  全角英数字を半角英数字に変換する
345         */
346        // カラム名とコンバート情報
347        $arrConvList['customer_id'] = "n" ;
348        $arrConvList['name'] = "aKV" ;
349        $arrConvList['pref'] = "n" ;
350        $arrConvList['kana'] = "CKV" ;
351        $arrConvList['b_start_year'] = "n" ;
352        $arrConvList['b_start_month'] = "n" ;
353        $arrConvList['b_start_day'] = "n" ;
354        $arrConvList['b_end_year'] = "n" ;
355        $arrConvList['b_end_month'] = "n" ;
356        $arrConvList['b_end_day'] = "n" ;
357        $arrConvList['tel'] = "n" ;
358        $arrConvList['birth_month'] = "n" ;
359        $arrConvList['email'] = "a" ;
360        $arrConvList['buy_total_from'] = "n" ;
361        $arrConvList['buy_total_to'] = "n" ;
362        $arrConvList['buy_times_from'] = "n" ;
363        $arrConvList['buy_times_to'] = "n" ;
364        $arrConvList['start_year'] = "n" ;
365        $arrConvList['start_month'] = "n" ;
366        $arrConvList['start_day'] = "n" ;
367        $arrConvList['end_year'] = "n" ;
368        $arrConvList['end_month'] = "n" ;
369        $arrConvList['end_day'] = "n" ;
370        $arrConvList['page_rows'] = "n" ;
371        $arrConvList['buy_start_year'] = "n" ;      // 最終購入日 START 年
372        $arrConvList['buy_start_month'] = "n" ;     // 最終購入日 START 月
373        $arrConvList['buy_start_day'] = "n" ;       // 最終購入日 START 日
374        $arrConvList['buy_end_year'] = "n" ;            // 最終購入日 END 年
375        $arrConvList['buy_end_month'] = "n" ;       // 最終購入日 END 月
376        $arrConvList['buy_end_day'] = "n" ;         // 最終購入日 END 日
377        $arrConvList['buy_product_name'] = "aKV" ;  // 購入商品名
378        $arrConvList['buy_product_code'] = "aKV" ;  // 購入商品コード
379        $arrConvList['category_id'] = "" ;          // カテゴリ
380
381        // 文字変換
382        foreach ($arrConvList as $key => $val) {
383            // POSTされてきた値のみ変換する。
384            if(isset($this->arrForm[$key])) {
385                $this->arrForm[$key] = mb_convert_kana($this->arrForm[$key] ,$val);
386            }
387        }
388    }
389
390    //---- 入力エラーチェック
391    function lfCheckError($array) {
392
393        $objErr = new SC_CheckError($array);
394
395        $objErr->doFunc(array("顧客コード", "customer_id", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
396        $objErr->doFunc(array("都道府県", "pref", 2), array("NUM_CHECK","MAX_LENGTH_CHECK"));
397        $objErr->doFunc(array("顧客名", "name", STEXT_LEN), array("MAX_LENGTH_CHECK"));
398        $objErr->doFunc(array("顧客名(カナ)", "kana", STEXT_LEN), array("SPTAB_CHECK" ,"MAX_LENGTH_CHECK", "KANABLANK_CHECK"));
399        $objErr->doFunc(array("誕生日(開始日)", "b_start_year", "b_start_month", "b_start_day"), array("CHECK_DATE"));
400        $objErr->doFunc(array("誕生日(終了日)", "b_end_year", "b_end_month", "b_end_day"), array("CHECK_DATE"));
401        $objErr->doFunc(array("誕生日(開始日)","誕生日(終了日)", "b_start_year", "b_start_month", "b_start_day", "b_end_year", "b_end_month", "b_end_day"), array("CHECK_SET_TERM"));
402        $objErr->doFunc(array("誕生月", "birth_month", 2), array("NUM_CHECK","MAX_LENGTH_CHECK"));
403        $objErr->doFunc(array('メールアドレス', "email", STEXT_LEN) ,array("EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
404        $objErr->doFunc(array('携帯メールアドレス', "email_mobile", STEXT_LEN) ,array("EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
405        $objErr->doFunc(array("電話番号", "tel", TEL_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
406        $objErr->doFunc(array("購入金額(開始)", "buy_total_from", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
407        $objErr->doFunc(array("購入金額(終了)", "buy_total_to", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
408        if ( (is_numeric($array["buy_total_from"]) && is_numeric($array["buy_total_to"]) ) && ($array["buy_total_from"] > $array["buy_total_to"]) ) $objErr->arrErr["buy_total_from"] .= "※ 購入金額の指定範囲が不正です。";
409        $objErr->doFunc(array("購入回数(開始)", "buy_times_from", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
410        $objErr->doFunc(array("購入回数(終了)", "buy_times_to", INT_LEN), array("NUM_CHECK","MAX_LENGTH_CHECK"));
411        if ( (is_numeric($array["buy_times_from"]) && is_numeric($array["buy_times_to"]) ) && ($array["buy_times_from"] > $array["buy_times_to"]) ) $objErr->arrErr["buy_times_from"] .= "※ 購入回数の指定範囲が不正です。";
412        $objErr->doFunc(array("登録・更新日(開始日)", "start_year", "start_month", "start_day",), array("CHECK_DATE"));
413        $objErr->doFunc(array("登録・更新日(終了日)", "end_year", "end_month", "end_day"), array("CHECK_DATE"));
414        $objErr->doFunc(array("登録・更新日(開始日)","登録・更新日(終了日)", "start_year", "start_month", "start_day", "end_year", "end_month", "end_day"), array("CHECK_SET_TERM"));
415        $objErr->doFunc(array("表示件数", "page_rows", 3), array("NUM_CHECK","MAX_LENGTH_CHECK"));
416        $objErr->doFunc(array("最終購入日(開始日)", "buy_start_year", "buy_start_month", "buy_start_day",), array("CHECK_DATE"));   //最終購入日(開始日)
417        $objErr->doFunc(array("最終購入(終了日)", "buy_end_year", "buy_end_month", "buy_end_day"), array("CHECK_DATE"));            //最終購入日(終了日)
418        //購入金額(from) > 購入金額(to) の場合はエラーとする
419        $objErr->doFunc(array("最終購入日(開始日)","登録・更新日(終了日)", "buy_start_year", "buy_start_month", "buy_start_day", "buy_end_year", "buy_end_month", "buy_end_day"), array("CHECK_SET_TERM"));
420        $objErr->doFunc(array("購入商品コード", "buy_product_code", STEXT_LEN), array("MAX_LENGTH_CHECK"));                     //購入商品コード
421        $objErr->doFunc(array("購入商品名", "buy_product_name", STEXT_LEN), array("MAX_LENGTH_CHECK"));                         //購入商品名称
422
423        return $objErr->arrErr;
424    }
425
426    function lfSetWhere($arrForm){
427        foreach ($arrForm as $key => $val) {
428
429            $val = sfManualEscape($val);
430
431            if($val == "") continue;
432
433            switch ($key) {
434            case 'product_id':
435                $where .= " AND product_id = ?";
436                $arrval[] = $val;
437                break;
438            case 'product_class_id':
439                $where .= " AND product_id IN (SELECT product_id FROM dtb_products_class WHERE product_class_id = ?)";
440                $arrval[] = $val;
441                break;
442            case 'name':
443                $where .= " AND name ILIKE ?";
444                $arrval[] = "%$val%";
445                break;
446            case 'category_id':
447                list($tmp_where, $tmp_arrval) = sfGetCatWhere($val);
448                if($tmp_where != "") {
449                    $where.= " AND $tmp_where";
450                    $arrval = array_merge($arrval, $tmp_arrval);
451                }
452                break;
453            case 'product_code':
454                $where .= " AND product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code ILIKE ? GROUP BY product_id)";
455                $arrval[] = "%$val%";
456                break;
457            case 'startyear':
458                $date = sfGetTimestamp($_POST['startyear'], $_POST['startmonth'], $_POST['startday']);
459                $where.= " AND update_date >= ?";
460                $arrval[] = $date;
461                break;
462            case 'endyear':
463                $date = sfGetTimestamp($_POST['endyear'], $_POST['endmonth'], $_POST['endday']);
464                $where.= " AND update_date <= ?";
465                $arrval[] = $date;
466                break;
467            case 'product_flag':
468                global $arrSTATUS;
469                $product_flag = sfSearchCheckBoxes($val);
470                if($product_flag != "") {
471                    $where.= " AND product_flag LIKE ?";
472                    $arrval[] = $product_flag;
473                }
474                break;
475            case 'status':
476                $tmp_where = "";
477                foreach ($val as $element){
478                    if ($element != ""){
479                        if ($tmp_where == ""){
480                            $tmp_where.="AND (status LIKE ? ";
481                        }else{
482                            $tmp_where.="OR status LIKE ? ";
483                        }
484                        $arrval[]=$element;
485                    }
486                }
487                if ($tmp_where != ""){
488                    $tmp_where.=")";
489                    $where.= "$tmp_where";
490                }
491                break;
492            default:
493                break;
494            }
495        }
496    }
497
498    //---- CSV出力用データ取得
499    function lfGetCSVData( $array, $arrayIndex){
500
501        for ($i=0; $i<count($array); $i++){
502
503            for ($j=0; $j<count($array[$i]); $j++ ){
504                if ( $j > 0 ) $return .= ",";
505                $return .= "\"";
506                if ( $arrayIndex ){
507                    $return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$arrayIndex[$j]] )) ."\"";
508                } else {
509                    $return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$j] )) ."\"";
510                }
511            }
512            $return .= "\n";
513        }
514
515        return $return;
516    }
517}
518?>
Note: See TracBrowser for help on using the repository browser.