[Svn-src-all:1216] [version-2_5-dev 20104] #980 リファクタリング ([フロント]パスワードリマインダ―) の修正

AMUAMU admin @ mail.ec-cube.net
2011年 2月 6日 (日) 22:31:40 JST


Subversion committed to /home/svn/open 20104
http://svn.ec-cube.net/open_trac/changeset/20104
┌────────────────────────────┐
│更新者 :  AMUAMU                                       │
│更新日時:  2011-02-06 22:31:40 +0900 (日, 06  2月 2011)│
└────────────────────────────┘

Log:
--------------------------------------------------------
#980 リファクタリング ([フロント]パスワードリマインダ―) の修正

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl
U   branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php

変更: branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl
===================================================================
--- branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl	2011-02-06 08:26:43 UTC (rev 20103)
+++ branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl	2011-02-06 13:31:40 UTC (rev 20104)
@@ -27,7 +27,11 @@
     ※下記パスワードは、MYページの「会員登録内容変更」よりご変更いただけます。</p>
     <form action="?" method="post" name="form1">
       <div id="completebox">
-        <p><em><!--{$temp_password}--></em></p>
+		<!--{if $smarty.const.FORGOT_MAIL != 1}-->
+        <p><em><!--{$arrForm.new_password}--></em></p>
+		<!--{else}-->
+		<p><em>ご登録メールアドレスに送付致しました。</em></p>
+		<!--{/if}-->
       </div>
       <div class="btn">
         <a href="javascript:window.close()" onmouseover="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_close_on.gif','close');" onmouseout="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_close.gif','close');"><img src="<!--{$TPL_URLPATH}-->img/button/btn_close.gif" width="150" height="30" alt="閉じる" name="close" id="close" /></a>

変更: branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php	2011-02-06 08:26:43 UTC (rev 20103)
+++ branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php	2011-02-06 13:31:40 UTC (rev 20104)
@@ -62,8 +62,11 @@
         $this->tpl_mainno = '';
         $masterData = new SC_DB_MasterData_Ex();
         $this->arrReminder = $masterData->getMasterData("mtb_reminder");
-        $this->isMobile = Net_UserAgent_Mobile::isMobile();
+        $this->device_type = SC_Display::detectDevice();
         $this->httpCacheControl('nocache');
+        // デフォルトログインアドレスロード
+        $objCookie = new SC_Cookie(COOKIE_EXPIRE);
+        $this->tpl_login_email = $objCookie->getCookie('login_email');        
     }
 
     /**
@@ -82,167 +85,177 @@
      * @return void
      */
     function action() {
-        $objQuery = new SC_Query();
-
+        // 不正アクセスチェック
         if ($_SERVER["REQUEST_METHOD"] == "POST") {
             if (!SC_Helper_Session_Ex::isValidToken()) {
                 SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
             }
         }
+        
+        // パラメータ管理クラス
+        $objFormParam = new SC_FormParam();
+
         switch($this->getMode()) {
             case 'mail_check':
-                $this->lfForgotMailCheck();
+                $this->lfInitMailCheckParam($objFormParam, $this->device_type);
+                $objFormParam->setParam($_POST);
+                $objFormParam->convParam();
+                $objFormParam->toLower('email');
+                $this->arrForm = $objFormParam->getHashArray();
+                $this->arrErr = $objFormParam->checkError();
+                if (SC_Utils_Ex::isBlank($this->arrErr)) {
+                    $this->errmsg = $this->lfCheckForgotMail($this->arrForm, $this->arrReminder);
+                    if(SC_Utils_Ex::isBlank($this->errmsg)) {
+                        $this->tpl_mainpage = 'forgot/secret.tpl';
+                    }
+                }
                 break;
             case 'secret_check':
-                $this->lfForgotSecretCheck();
+                $this->lfInitSecretCheckParam($objFormParam, $this->device_type);
+                $objFormParam->setParam($_POST);
+                $objFormParam->convParam();
+                $objFormParam->toLower('email');
+                $this->arrForm = $objFormParam->getHashArray();
+                $this->arrErr = $objFormParam->checkError();
+                if (SC_Utils_Ex::isBlank($this->arrErr)) {
+                    $this->errmsg = $this->lfCheckForgotSecret($this->arrForm, $this->arrReminder);
+                    if(SC_Utils_Ex::isBlank($this->errmsg)) {
+                        // 完了ページへ移動する
+                        $this->tpl_mainpage = 'forgot/complete.tpl';
+                        // transactionidを更新させたいので呼び出し元(ログインフォーム側)をリロード。
+                        $this->tpl_onload .= 'opener.location.reload(true);';
+                    }else{
+                        // 秘密の答えが一致しなかった
+                        $this->tpl_mainpage = 'forgot/secret.tpl';
+                    }
+                }else{
+                    // 入力値エラー
+                    $this->tpl_mainpage = 'forgot/secret.tpl';
+                }
                 break;
             default:
-                $this->lfForgotDefault();
                 break;
         }
 
         $this->transactionid = SC_Helper_Session_Ex::getToken();
-
-        if ($this->isMobile) {
-            // モバイルサイトの場合はトークン生成
-            $this->createMobileToken();
-        } else {
-            // モバイルサイト以外の場合、ポップアップ用テンプレートファイル設定
+        
+        // ポップアップ用テンプレート設定
+        if($this->device_type == DEVICE_TYPE_PC) {
             $this->setTemplate($this->tpl_mainpage);
         }
     }
 
-    // 最初に開いた時の処理(メールアドレス入力画面)
-    function lfForgotDefault() {
-        // クッキー管理クラス
-        $objCookie = new SC_Cookie(COOKIE_EXPIRE);
-        $this->tpl_login_email = $objCookie->getCookie('login_email');
-    }
-
-    // メールアドレス確認(秘密の質問入力画面)
-    function lfForgotMailCheck() {
-        // パラメータ管理クラス,パラメータ情報の初期化
-        $this->objFormParam = new SC_FormParam();
-        $this->lfMailCheckInitParam();
-        // POST値の取得
-        $this->objFormParam->setParam($_POST);
-        $this->objFormParam->convParam();
-        $this->objFormParam->toLower('email');
-        $this->arrForm = $this->objFormParam->getHashArray();
-        //エラーチェック
-        $this->arrErr = $this->lfMailCheckErrorCheck();
-        if (count($this->arrErr) == 0) {
-            $email = $this->arrForm['email'];
-            $objQuery =& SC_Query::getSingletonInstance();
-            $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0";
-            $arrVal = array($this->arrForm['email'], $this->arrForm['email'], $this->arrForm['name01'], $this->arrForm['name02']);
-            $result = $objQuery->select("reminder, status", "dtb_customer", $where, $arrVal);
-            if (isset($result[0]['reminder']) and isset($this->arrReminder[$result[0]['reminder']])) {
-                if($result[0]['status'] == '2') {
-                    // 有効な情報であるため、秘密の質問確認へ遷移
-                    $this->tpl_mainpage = 'forgot/secret.tpl';
-                    $this->arrForm['reminder'] = $result[0]['reminder'];
-                } else if ($result[0]['status'] == '1') {
-                    $this->errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。';
-                }
-            } else {
-                $this->errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。';
+    /**
+     * メールアドレス・名前確認
+     *
+     * @param array $arrForm フォーム入力値
+     * @param array $arrReminder リマインダー質問リスト
+     * @return string エラー文字列 問題が無ければNULL
+     */
+    function lfCheckForgotMail(&$arrForm, &$arrReminder) {
+        $errmsg = NULL;
+        $objQuery =& SC_Query::getSingletonInstance();
+        $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0";
+        $arrVal = array($arrForm['email'], $arrForm['email'], $arrForm['name01'], $arrForm['name02']);
+        $result = $objQuery->select("reminder, status", "dtb_customer", $where, $arrVal);
+        if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])) {
+            // 会員状態の確認
+            if($result[0]['status'] == '2') {
+                // 正会員
+                $arrForm['reminder'] = $result[0]['reminder'];
+            } else if ($result[0]['status'] == '1') {
+                // 仮会員
+                $errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。';
             }
+        } else {
+            $errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。';
         }
+        return $errmsg;
     }
-
-    // メールアドレス確認におけるエラーチェック
-    function lfMailCheckErrorCheck() {
-        // 入力データを渡す
-        $arrRet = $this->objFormParam->getHashArray();
-        $objErr = new SC_CheckError($arrRet);
-        $objErr->arrErr = $this->objFormParam->checkError();
-        return $objErr->arrErr;
-    }
-
-    // メールアドレス確認におけるパラメーター情報の初期化
-    function lfMailCheckInitParam() {
-        $this->objFormParam->addParam("お名前(姓)", 'name01', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
-        $this->objFormParam->addParam("お名前(名)", 'name02', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
-        if ($this->isMobile == false){
-            $this->objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
+    
+    /**
+     * メールアドレス確認におけるパラメーター情報の初期化
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @param array $device_type デバイスタイプ
+     * @return void
+     */
+    function lfInitMailCheckParam(&$objFormParam, $device_type) {
+        $objFormParam->addParam("お名前(姓)", 'name01', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
+        $objFormParam->addParam("お名前(名)", 'name02', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
+        if ($device_type === DEVICE_TYPE_MOBILE){
+            $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("EXIST_CHECK", "EMAIL_CHECK", "NO_SPTAB" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK","MOBILE_EMAIL_CHECK"));
         } else {
-            $this->objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("EXIST_CHECK", "EMAIL_CHECK", "NO_SPTAB" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK","MOBILE_EMAIL_CHECK"));
+            $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK"));
         }
-
+        return;
     }
 
-    // 秘密の質問確認
-    function lfForgotSecretCheck() {
-        // パラメータ管理クラス,パラメータ情報の初期化
-        $this->objFormParam = new SC_FormParam();
-        $this->lfSecretCheckInitParam();
-        // POST値の取得
-        $this->objFormParam->setParam($_POST);
-        $this->objFormParam->convParam();
-        $this->objFormParam->toLower('email');
-        $this->arrForm = $this->objFormParam->getHashArray();
-        //エラーチェック
-        $this->arrErr = $this->lfSecretCheckErrorCheck();
-        if (count($this->arrErr) == 0) {
-            $email = $this->arrForm['email'];
-            $objQuery =& SC_Query::getSingletonInstance();
-            $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND status = 2 AND del_flg = 0";
-            $arrVal = array($this->arrForm['email'], $this->arrForm['email'], $this->arrForm['name01'], $this->arrForm['name02']);
-            $result = $objQuery->select("customer_id, reminder, reminder_answer, salt", "dtb_customer", $where, $arrVal);
-            if (isset($result[0]['reminder']) and isset($this->arrReminder[$result[0]['reminder']])
-                    and $result[0]['reminder'] == $this->arrForm['reminder']) {
-
-                if (SC_Utils_Ex::sfIsMatchHashPassword($this->arrForm['reminder_answer'], $result[0]['reminder_answer'], $result[0]['salt'])) {
-                    // 秘密の答えが一致
-                    // 新しいパスワードを設定する
-                    $this->temp_password = GC_Utils_Ex::gfMakePassword(8);
-
-                    if(FORGOT_MAIL == 1) {
-                        // メールで変更通知をする
-                        $objDb = new SC_Helper_DB_Ex();
-                        $CONF = $objDb->sfGetBasisData();
-                        $this->lfSendMail($CONF, $this->arrForm['email'], $this->arrForm['name01'], $this->temp_password);
-                    }
-                    $sqlval = array();
-                    $sqlval['password'] = $this->temp_password;
-                    SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']);
-
-                    // 完了ページへ移動する
-                    $this->tpl_mainpage = 'forgot/complete.tpl';
-                    // transactionidの都合で呼び出し元をリロード。
-                    $this->tpl_onload .= 'opener.location.reload(true);';
-                } else {
-                    // 秘密の答えが一致しなかった
-                    $this->tpl_mainpage = 'forgot/secret.tpl';
-                    $this->errmsg = '秘密の質問が一致しませんでした。';
+    /**
+     * 秘密の質問確認
+     *
+     * @param array $arrForm フォーム入力値
+     * @param array $arrReminder リマインダー質問リスト
+     * @return string エラー文字列 問題が無ければNULL
+     */
+    function lfCheckForgotSecret(&$arrForm, &$arrReminder) {
+        $errmsg = '';
+        $objQuery =& SC_Query::getSingletonInstance();
+        $cols = "customer_id, reminder, reminder_answer, salt";
+        $table = "dtb_customer";
+        $where = "(email Like ? OR email_mobile Like ?)"
+                    . " AND name01 Like ? AND name02 Like ?"
+                    . " AND status = 2 AND del_flg = 0";
+        $arrVal = array($arrForm['email'], $arrForm['email'],
+                            $arrForm['name01'], $arrForm['name02']);
+        $result = $objQuery->select($cols, $table, $where, $arrVal);
+        if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])
+                and $result[0]['reminder'] == $arrForm['reminder']) {
+            
+            if (SC_Utils_Ex::sfIsMatchHashPassword($arrForm['reminder_answer'],
+                     $result[0]['reminder_answer'], $result[0]['salt'])) {
+                // 秘密の答えが一致
+                // 新しいパスワードを設定する
+                $new_password = GC_Utils_Ex::gfMakePassword(8);
+                if(FORGOT_MAIL == 1) {
+                    // メールで変更通知をする
+                    $objDb = new SC_Helper_DB_Ex();
+                    $CONF = $objDb->sfGetBasisData();
+                    $this->lfSendMail($CONF, $arrForm['email'], $arrForm['name01'], $new_password);
                 }
+                $sqlval = array();
+                $sqlval['password'] = $new_password;
+                SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']);
+                $arrForm['new_password'] = $new_password;
             } else {
-                //不正なアクセス
-                SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
+                // 秘密の答えが一致しなかった
+                $errmsg = '秘密の質問が一致しませんでした。';
             }
         } else {
-            $this->tpl_mainpage = 'forgot/secret.tpl';
+            //不正なアクセス リマインダー値が前画面と異なる。
+            // 新リファクタリング基準ではここで遷移は不許可なのでエラー表示
+            //SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true);
+            $errmsg = '秘密の質問が一致しませんでした。';
         }
+        return $errmsg;
     }
 
-    function lfSecretCheckInitParam() {
+    /**
+     * 秘密の質問確認におけるパラメーター情報の初期化
+     *
+     * @param array $objFormParam フォームパラメータークラス
+     * @param array $device_type デバイスタイプ
+     * @return void
+     */
+    function lfInitSecretCheckParam(&$objFormParam, $device_type) {
         // メールチェックと同等のチェックを再度行う
-        $this->lfMailCheckInitParam();
+        $this->lfInitMailCheckParam($objFormParam, $device_type);
         // 秘密の質問チェックの追加
-        $this->objFormParam->addParam("パスワード確認用の質問", "reminder", STEXT_LEN, "n", array("EXIST_CHECK", "NUM_CHECK"));
-        $this->objFormParam->addParam("パスワード確認用の質問の答え", "reminder_answer", STEXT_LEN, "aKV", array("EXIST_CHECK","SPTAB_CHECK" , "MAX_LENGTH_CHECK"));
+        $objFormParam->addParam("パスワード確認用の質問", "reminder", STEXT_LEN, "n", array("EXIST_CHECK", "NUM_CHECK"));
+        $objFormParam->addParam("パスワード確認用の質問の答え", "reminder_answer", STEXT_LEN, "aKV", array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
+        return;
     }
 
-    // 秘密の答え確認におけるエラーチェック
-    function lfSecretCheckErrorCheck() {
-        // 入力データを渡す
-        $arrRet = $this->objFormParam->getHashArray();
-        $objErr = new SC_CheckError($arrRet);
-        $objErr->arrErr = $this->objFormParam->checkError();
-        return $objErr->arrErr;
-    }
-
     /**
      * デストラクタ.
      *
@@ -258,52 +271,32 @@
      * @param array $CONF 店舗基本情報の配列
      * @param string $email 送信先メールアドレス
      * @param string $customer_name 送信先氏名
-     * @param string $temp_password 変更後のパスワード
+     * @param string $new_password 変更後の新パスワード
      * @return void
      *
-     * FIXME: メールテンプレート編集の方に足すのが望ましい?
+     * FIXME: メールテンプレート編集の方に足すのが望ましい
      */
-    function lfSendMail($CONF, $email, $customer_name, $temp_password){
-        // パスワード変更お知らせメール送信
-        $this->customer_name = $customer_name;
-        $this->temp_password = $temp_password;
+    function lfSendMail(&$CONF, $email, $customer_name, $new_password){
+        // パスワード変更お知らせメール送信
         $objMailText = new SC_SiteView(false);
-        $objMailText->assignobj($this);
-
+        $objMailText->assign('customer_name', $customer_name);
+        $objMailText->assign('new_password', $new_password);
         $toCustomerMail = $objMailText->fetch("mail_templates/forgot_mail.tpl");
+        // メール送信オブジェクトによる送信処理
         $objMail = new SC_SendMail();
-
         $objMail->setItem(
-                              ''								// 宛先
-                            , "パスワードが変更されました" ."【" .$CONF["shop_name"]. "】"		// サブジェクト
-                            , $toCustomerMail					// 本文
-                            , $CONF["email03"]					// 配送元アドレス
-                            , $CONF["shop_name"]				// 配送元 名前
-                            , $CONF["email03"]					// reply_to
-                            , $CONF["email04"]					// return_path
-                            , $CONF["email04"]					//  Errors_to
-
-                                                            );
+            '' //宛先
+            , $toCustomerMail //本文
+            , $CONF['email03'] //配送元アドレス
+            , $CONF['shop_name'] // 配送元名
+            , $CONF['email03'] // reply to
+            , $CONF['email04'] //return_path
+            , $CONF['email04'] // errors_to
+            );
         $objMail->setTo($email, $customer_name ." 様");
         $objMail->sendMail();
+        return;
     }
 
-    /**
-     * モバイル空メール用のトークン作成
-     *
-     * @return void
-     *
-     * FIXME: この処理の有効性が不明
-     */
-    function createMobileToken() {
-        $objMobile = new SC_Helper_Mobile_Ex();
-        // 空メール用のトークンを作成。
-        if (MOBILE_USE_KARA_MAIL) {
-            $token = $objMobile->gfPrepareKaraMail('forgot/' . DIR_INDEX_PATH);
-            if ($token !== false) {
-                $objPage->tpl_kara_mail_to = MOBILE_KARA_MAIL_ADDRESS_USER . MOBILE_KARA_MAIL_ADDRESS_DELIMITER . 'forgot_' . $token . '@' . MOBILE_KARA_MAIL_ADDRESS_DOMAIN;
-            }
-        }
-    }
 }
 ?>




Svn-src-all メーリングリストの案内