source: branches/comu-ver2/data/class/pages/campaign/LC_Page_CampaignEntry.php @ 18649

Revision 18649, 19.7 KB checked in by Seasoft, 14 years ago (diff)

merge r18555,r18560

  • 取得元: version-2_4
  • 「新着情報管理」と「お問い合わせ」については、Smrty変数 $arrForm を用いる実装に変更。

【取得元のログメッセージ】

  • POST値の格納方法を修正。
  • r18559 merged
    • 会員登録において入力内容の一部が正常に引き継がれない不具合(#599)
  • 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-2007 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$
33 */
34class LC_Page_CampaignEntry 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 = 'entry/index.tpl';                // メインテンプレート
47        $this->tpl_title .= '会員登録(入力ページ)';             // ページタイトル
48
49        $masterData = new SC_DB_MasterData_Ex();
50        $this->arrPref = $masterData->getMasterData("mtb_pref",
51                                array("pref_id", "pref_name", "rank"));
52        $this->arrJob = $masterData->getMasterData("mtb_job");
53        $this->arrReminder = $masterData->getMasterData("mtb_reminder");
54       
55        // 生年月日選択肢の取得
56        $objDate = new SC_Date(START_BIRTH_YEAR, date("Y",strtotime("now")));
57        $this->arrYear = $objDate->getYear('', 1950, '');
58        $this->arrMonth = $objDate->getMonth(true);
59        $this->arrDay = $objDate->getDay(true);
60    }
61
62    /**
63     * Page のプロセス.
64     *
65     * @return void
66     */
67    function process() {
68        global $objCampaignSess;
69
70        $objConn = new SC_DbConn();
71        $objQuery = new SC_Query();
72        $objView = new SC_SiteView();
73        $CONF = $objView->objSiteInfo->data;
74        $objCampaignSess = new SC_CampaignSession();
75
76        // レイアウトデザインを取得
77        $objLayout = new SC_Helper_PageLayout_Ex();
78        $objLayout->sfGetPageLayout($this, false, DEF_LAYOUT);
79
80        //---- 登録用カラム配列
81        $arrRegistColumn = array(
82                                 array(  "column" => "name01", "convert" => "aKV" ),
83                                 array(  "column" => "name02", "convert" => "aKV" ),
84                                 array(  "column" => "kana01", "convert" => "CKV" ),
85                                 array(  "column" => "kana02", "convert" => "CKV" ),
86                                 array(  "column" => "zip01", "convert" => "n" ),
87                                 array(  "column" => "zip02", "convert" => "n" ),
88                                 array(  "column" => "pref", "convert" => "n" ),
89                                 array(  "column" => "addr01", "convert" => "aKV" ),
90                                 array(  "column" => "addr02", "convert" => "aKV" ),
91                                 array(  "column" => "email", "convert" => "a" ),
92                                 array(  "column" => "email02", "convert" => "a" ),
93                                 array(  "column" => "email_mobile", "convert" => "a" ),
94                                 array(  "column" => "email_mobile02", "convert" => "a" ),
95                                 array(  "column" => "tel01", "convert" => "n" ),
96                                 array(  "column" => "tel02", "convert" => "n" ),
97                                 array(  "column" => "tel03", "convert" => "n" ),
98                                 array(  "column" => "fax01", "convert" => "n" ),
99                                 array(  "column" => "fax02", "convert" => "n" ),
100                                 array(  "column" => "fax03", "convert" => "n" ),
101                                 array(  "column" => "sex", "convert" => "n" ),
102                                 array(  "column" => "job", "convert" => "n" ),
103                                 array(  "column" => "birth", "convert" => "n" ),
104                                 array(  "column" => "year",  "convert" => "n"),
105                                 array(  "column" => "month", "convert" => "n"),
106                                 array(  "column" => "day",   "convert" => "n"),
107                                 array(  "column" => "reminder", "convert" => "n" ),
108                                 array(  "column" => "reminder_answer", "convert" => "aKV"),
109                                 array(  "column" => "password", "convert" => "a" ),
110                                 array(  "column" => "password02", "convert" => "a" ),
111                                 array(  "column" => "mailmaga_flg", "convert" => "n" )
112                                 );
113
114        //---- 登録除外用カラム配列
115        $arrRejectRegistColumn = array("year", "month", "day", "email02", "email_mobile02", "password02");
116
117        if ($_SERVER["REQUEST_METHOD"] == "POST") {
118
119            //-- POSTデータの引き継ぎ
120            $this->arrForm = $_POST;
121
122            $this->arrForm['email'] = strtolower($this->arrForm['email']);      // emailはすべて小文字で処理
123            $this->arrForm['email02'] = strtolower($this->arrForm['email02']);  // emailはすべて小文字で処理
124
125            //-- 入力データの変換
126            $this->arrForm = $this->lfConvertParam($this->arrForm, $arrRegistColumn);
127
128            //-- 入力エラーチェック
129            $this->arrErr = $this->lfErrorCheck($this->arrForm);
130
131            if ($this->arrErr || $_POST["mode"] == "return") {      // 入力エラーのチェック
132                foreach($arrRegistColumn as $key) {
133                    $this->$key['column'] = $this->arrForm[$key['column']];
134                }
135
136            } else {
137
138                //-- 確認
139                if ($_POST["mode"] == "confirm") {
140                    foreach($this->arrForm as $key => $val) {
141                        if ($key != "mode" && $key != "subm") $this->list_data[ $key ] = $val;
142                    }
143                    //パスワード表示
144                    $passlen = strlen($this->arrForm['password']);
145                    $this->passlen = $this->lfPassLen($passlen);
146
147                    $this->tpl_mainpage = 'entry/confirm.tpl';
148                    $this->tpl_title = '会員登録(確認ページ)';
149
150                }
151
152                //--仮登録と完了画面
153                if ($_POST["mode"] == "complete") {
154                    $this->uniqid = $this->lfRegistData ($this->arrForm, $arrRegistColumn, $arrRejectRegistColumn);
155
156                    if($objCampaignSess->getIsCampaign()) {
157                        $this->etc_value = "&cp=".$objCampaignSess->getCampaignId();
158                    }
159
160                    $this->tpl_css = '/css/layout/entry/complete.css';
161                    $this->tpl_mainpage = 'entry/complete.tpl';
162                    $this->tpl_title = '会員登録(完了ページ)';
163
164
165                    // 仮登録完了メール送信
166                    $this->CONF = $CONF;
167                    $this->name01 = $_POST['name01'];
168                    $this->name02 = $_POST['name02'];
169                    $objMailText = new SC_SiteView();
170                    $objMailText->assignobj($this);
171                    $objHelperMail = new SC_Helper_Mail_Ex();
172                    $objQuery = new SC_Query();
173
174                    $subject = $objHelperMail->sfMakeSubject('会員登録のご確認');
175
176                    $toCustomerMail = $objMailText->fetch("mail_templates/customer_mail.tpl");
177                    $objMail = new SC_SendMail();
178                    $objMail->setItem(
179                                      ''                                    // 宛先
180                                      , $subject                            // サブジェクト
181                                      , $toCustomerMail                 // 本文
182                                      , $CONF["email03"]                    // 配送元アドレス
183                                      , $CONF["shop_name"]              // 配送元 名前
184                                      , $CONF["email03"]                    // reply_to
185                                      , $CONF["email04"]                    // return_path
186                                      , $CONF["email04"]                    //  Errors_to
187                                      , $CONF["email01"]                    //  Bcc
188                                      );
189                    // 宛先の設定
190                    $name = $_POST["name01"] . $_POST["name02"] ." 様";
191                    $objMail->setTo($_POST["email"], $name);
192                    $objMail->sendMail();
193
194                    // キャンペーン受注情報を登録
195                    $this->lfRegistCampaignOrder($this->uniqid, $objQuery);
196
197                    // 完了ページに移動させる。
198                    $this->sendRedirect($this->getLocation("./complete.php"));
199                    exit;
200                }
201            }
202        }
203
204        //---- ページ表示
205        $objView->assignobj($this);
206        // フレームを選択(キャンペーンページから遷移なら変更)
207        $objCampaignSess->pageView($objView);
208
209    }
210
211    /**
212     * デストラクタ.
213     *
214     * @return void
215     */
216    function destroy() {
217        parent::destroy();
218    }
219
220    //---- function群
221    function lfRegistData ($array, $arrRegistColumn, $arrRejectRegistColumn) {
222        $objConn = new SC_DbConn();
223
224        // 仮登録
225        foreach ($arrRegistColumn as $data) {
226            if (strlen($array[ $data["column"] ]) > 0 && ! in_array($data["column"], $arrRejectRegistColumn)) {
227                $arrRegist[ $data["column"] ] = $array[ $data["column"] ];
228            }
229        }
230
231        // 誕生日が入力されている場合
232        if (strlen($array["year"]) > 0 ) {
233            $arrRegist["birth"] = $array["year"] ."/". $array["month"] ."/". $array["day"] ." 00:00:00";
234        }
235
236        // パスワードの暗号化
237        $arrRegist["password"] = sha1($arrRegist["password"] . ":" . AUTH_MAGIC);
238
239        $count = 1;
240        while ($count != 0) {
241            $uniqid = SC_Utils_Ex::sfGetUniqRandomId("t");
242            $count = $objConn->getOne("SELECT COUNT(*) FROM dtb_customer WHERE secret_key = ?", array($uniqid));
243        }
244
245        $arrRegist["secret_key"] = $uniqid;     // 仮登録ID発行
246        $arrRegist["create_date"] = "now()";    // 作成日
247        $arrRegist["update_date"] = "now()";    // 更新日
248        $arrRegist["first_buy_date"] = "";      // 最初の購入日
249
250        //-- 仮登録実行
251        $objConn->query("BEGIN");
252
253        $objQuery = new SC_Query();
254        $objQuery->insert("dtb_customer", $arrRegist);
255
256        /* メルマガ会員機能は現在停止中 2007/03/07
257
258        //-- 非会員でメルマガ登録しているかの判定
259        $sql = "SELECT count(*) FROM dtb_customer_mail WHERE email = ?";
260        $mailResult = $objConn->getOne($sql, array($arrRegist["email"]));
261
262        //-- メルマガ仮登録実行
263        $arrRegistMail["email"] = $arrRegist["email"];
264        if ($array["mailmaga_flg"] == 1) {
265        $arrRegistMail["mailmaga_flg"] = 4;
266        } elseif ($array["mailmaga_flg"] == 2) {
267        $arrRegistMail["mailmaga_flg"] = 5;
268        } else {
269        $arrRegistMail["mailmaga_flg"] = 6;
270        }
271        $arrRegistMail["update_date"] = "now()";
272
273        // 非会員でメルマガ登録している場合
274        if ($mailResult == 1) {
275        $objQuery->update("dtb_customer_mail", $arrRegistMail, "email = '" .addslashes($arrRegistMail["email"]). "'");
276        } else {                // 新規登録の場合
277        $arrRegistMail["create_date"] = "now()";
278        $objQuery->insert("dtb_customer_mail", $arrRegistMail);
279        }
280        */
281        $objConn->query("COMMIT");
282
283        return $uniqid;
284    }
285
286    //---- 取得文字列の変換
287    function lfConvertParam($array, $arrRegistColumn) {
288        /*
289         *  文字列の変換
290         *  K :  「半角(ハンカク)片仮名」を「全角片仮名」に変換
291         *  C :  「全角ひら仮名」を「全角かた仮名」に変換
292         *  V :  濁点付きの文字を一文字に変換。"K","H"と共に使用します
293         *  n :  「全角」数字を「半角(ハンカク)」に変換
294         *  a :  全角英数字を半角英数字に変換する
295         */
296        // カラム名とコンバート情報
297        foreach ($arrRegistColumn as $data) {
298            $arrConvList[ $data["column"] ] = $data["convert"];
299        }
300        // 文字変換
301        foreach ($arrConvList as $key => $val) {
302            // POSTされてきた値のみ変換する。
303            if(strlen(($array[$key])) > 0) {
304                $array[$key] = mb_convert_kana($array[$key] ,$val);
305            }
306        }
307        return $array;
308    }
309
310    //---- 入力エラーチェック
311    function lfErrorCheck($array) {
312
313        $objErr = new SC_CheckError($array);
314
315        $objErr->doFunc(array("お名前(姓)", 'name01', STEXT_LEN), array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
316        $objErr->doFunc(array("お名前(名)", 'name02', STEXT_LEN), array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
317        $objErr->doFunc(array("フリガナ(セイ)", 'kana01', STEXT_LEN), array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK", "KANA_CHECK"));
318        $objErr->doFunc(array("フリガナ(メイ)", 'kana02', STEXT_LEN), array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK", "KANA_CHECK"));
319        $objErr->doFunc(array("郵便番号1", "zip01", ZIP01_LEN ) ,array("EXIST_CHECK", "SPTAB_CHECK" ,"NUM_CHECK", "NUM_COUNT_CHECK"));
320        $objErr->doFunc(array("郵便番号2", "zip02", ZIP02_LEN ) ,array("EXIST_CHECK", "SPTAB_CHECK" ,"NUM_CHECK", "NUM_COUNT_CHECK"));
321        $objErr->doFunc(array("郵便番号", "zip01", "zip02"), array("ALL_EXIST_CHECK"));
322        $objErr->doFunc(array("都道府県", 'pref'), array("SELECT_CHECK","NUM_CHECK"));
323        $objErr->doFunc(array("ご住所1", "addr01", MTEXT_LEN), array("EXIST_CHECK","SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
324        $objErr->doFunc(array("ご住所2", "addr02", MTEXT_LEN), array("EXIST_CHECK","SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
325        $objErr->doFunc(array('メールアドレス', "email", MTEXT_LEN) ,array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
326        $objErr->doFunc(array('メールアドレス(確認)', "email02", MTEXT_LEN) ,array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK","SPTAB_CHECK" , "EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
327        $objErr->doFunc(array('メールアドレス', 'メールアドレス(確認)', "email", "email02") ,array("EQUAL_CHECK"));
328
329        //現会員の判定 → 現会員もしくは仮登録中は、メアド一意が前提になってるので同じメアドで登録不可
330        if (strlen($array["email"]) > 0) {
331            $array['email'] = strtolower($array['email']);
332            $objQuery = new SC_Query();
333            $arrRet = $objQuery->select("email, update_date, del_flg", "dtb_customer","email = ? ORDER BY del_flg", array($array["email"]));
334
335            if(count($arrRet) > 0) {
336                if($arrRet[0]['del_flg'] != '1') {
337                    // 会員である場合
338                    $objErr->arrErr["email"] .= "※ すでに会員登録で使用されているメールアドレスです。<br />";
339                } else {
340                    // 退会した会員である場合
341                    $leave_time = SC_Utils_Ex::sfDBDatetoTime($arrRet[0]['update_date']);
342                    $now_time = time();
343                    $pass_time = $now_time - $leave_time;
344                    // 退会から何時間-経過しているか判定する。
345                    $limit_time = ENTRY_LIMIT_HOUR * 3600;
346                    if($pass_time < $limit_time) {
347                        $objErr->arrErr["email"] .= "※ 退会から一定期間の間は、同じメールアドレスを使用することはできません。<br />";
348                    }
349                }
350            }
351        }
352
353        $objErr->doFunc(array("お電話番号1", 'tel01'), array("EXIST_CHECK","SPTAB_CHECK" ));
354        $objErr->doFunc(array("お電話番号2", 'tel02'), array("EXIST_CHECK","SPTAB_CHECK" ));
355        $objErr->doFunc(array("お電話番号3", 'tel03'), array("EXIST_CHECK","SPTAB_CHECK" ));
356        $objErr->doFunc(array("お電話番号", "tel01", "tel02", "tel03") ,array("TEL_CHECK"));
357        $objErr->doFunc(array("FAX番号1", 'fax01'), array("SPTAB_CHECK"));
358        $objErr->doFunc(array("FAX番号2", 'fax02'), array("SPTAB_CHECK"));
359        $objErr->doFunc(array("FAX番号3", 'fax03'), array("SPTAB_CHECK"));
360        $objErr->doFunc(array("FAX番号", "fax01", "fax02", "fax03") ,array("TEL_CHECK"));
361        $objErr->doFunc(array("ご性別", "sex") ,array("SELECT_CHECK", "NUM_CHECK"));
362        $objErr->doFunc(array("パスワード", 'password', PASSWORD_LEN1, PASSWORD_LEN2), array("EXIST_CHECK", "SPTAB_CHECK" ,"ALNUM_CHECK", "NUM_RANGE_CHECK"));
363        $objErr->doFunc(array("パスワード(確認)", 'password02', PASSWORD_LEN1, PASSWORD_LEN2), array("EXIST_CHECK", "SPTAB_CHECK" ,"ALNUM_CHECK", "NUM_RANGE_CHECK"));
364        $objErr->doFunc(array('パスワード', 'パスワード(確認)', "password", "password02") ,array("EQUAL_CHECK"));
365        $objErr->doFunc(array("パスワードを忘れたときのヒント 質問", "reminder") ,array("SELECT_CHECK", "NUM_CHECK"));
366        $objErr->doFunc(array("パスワードを忘れたときのヒント 答え", "reminder_answer", STEXT_LEN) ,array("EXIST_CHECK","SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
367        $objErr->doFunc(array("メールマガジン", "mailmaga_flg") ,array("SELECT_CHECK", "NUM_CHECK"));
368        $objErr->doFunc(array("生年月日", "year", "month", "day"), array("CHECK_BIRTHDAY"));
369
370
371        return $objErr->arrErr;
372    }
373
374    // キャンペーン受注テーブルへ登録
375    function lfRegistCampaignOrder($uniqid, &$objQuery) {
376        global $objCampaignSess;
377
378        $campaign_id = $objCampaignSess->getCampaignId();
379
380        // 顧客データを取得
381        $cols = "
382            customer_id,
383            name01 as order_name01,
384            name02 as order_name02,
385            kana01 as order_kana01,
386            kana02 as order_kana02,
387            zip01 as order_zip01,
388            zip02 as order_zip02,
389            pref as order_pref,
390            addr01 as order_addr01,
391            addr02 as order_addr02,
392            email as order_email,
393            tel01 as order_tel01,
394            tel02 as order_tel02,
395            tel03 as order_tel03,
396            fax01 as order_fax01,
397            fax02 as order_fax02,
398            fax03 as order_fax03,
399            sex as order_sex,
400            job as order_job,
401            birth as order_birth
402            ";
403
404        $arrCustomer = $objQuery->select($cols, "dtb_customer", "secret_key = ?", array($uniqid));
405
406        $sqlval = $arrCustomer[0];
407        $sqlval['campaign_id'] = $campaign_id;
408        $sqlval['create_date'] = 'now()';
409
410        // INSERTの実行
411        $objQuery->insert("dtb_campaign_order", $sqlval);
412
413        // 申し込み数の更新
414        $total_count = $objQuery->get("dtb_campaign", "total_count", "campaign_id = ?", array($campaign_id));
415        $arrCampaign['total_count'] = $total_count += 1;
416        $objQuery->update("dtb_campaign", $arrCampaign, "campaign_id = ?", array($campaign_id));
417    }
418
419    //確認ページ用パスワード表示用
420
421    function lfPassLen($passlen){
422        $ret = "";
423        for ($i=0;$i<$passlen;true){
424            $ret.="*";
425            $i++;
426        }
427        return $ret;
428    }
429
430}
431?>
Note: See TracBrowser for help on using the repository browser.