Changeset 20104


Ignore:
Timestamp:
2011/02/06 22:31:40 (13 years ago)
Author:
AMUAMU
Message:

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

Location:
branches/version-2_5-dev/data
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_5-dev/data/Smarty/templates/default/forgot/complete.tpl

    r19983 r20104  
    2828    <form action="?" method="post" name="form1"> 
    2929      <div id="completebox"> 
    30         <p><em><!--{$temp_password}--></em></p> 
     30        <!--{if $smarty.const.FORGOT_MAIL != 1}--> 
     31        <p><em><!--{$arrForm.new_password}--></em></p> 
     32        <!--{else}--> 
     33        <p><em>ご登録メールアドレスに送付致しました。</em></p> 
     34        <!--{/if}--> 
    3135      </div> 
    3236      <div class="btn"> 
  • branches/version-2_5-dev/data/class/pages/forgot/LC_Page_Forgot.php

    r20041 r20104  
    6363        $masterData = new SC_DB_MasterData_Ex(); 
    6464        $this->arrReminder = $masterData->getMasterData("mtb_reminder"); 
    65         $this->isMobile = Net_UserAgent_Mobile::isMobile(); 
     65        $this->device_type = SC_Display::detectDevice(); 
    6666        $this->httpCacheControl('nocache'); 
     67        // デフォルトログインアドレスロード 
     68        $objCookie = new SC_Cookie(COOKIE_EXPIRE); 
     69        $this->tpl_login_email = $objCookie->getCookie('login_email');         
    6770    } 
    6871 
     
    8386     */ 
    8487    function action() { 
    85         $objQuery = new SC_Query(); 
    86  
     88        // 不正アクセスチェック 
    8789        if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    8890            if (!SC_Helper_Session_Ex::isValidToken()) { 
     
    9092            } 
    9193        } 
     94         
     95        // パラメータ管理クラス 
     96        $objFormParam = new SC_FormParam(); 
     97 
    9298        switch($this->getMode()) { 
    9399            case 'mail_check': 
    94                 $this->lfForgotMailCheck(); 
     100                $this->lfInitMailCheckParam($objFormParam, $this->device_type); 
     101                $objFormParam->setParam($_POST); 
     102                $objFormParam->convParam(); 
     103                $objFormParam->toLower('email'); 
     104                $this->arrForm = $objFormParam->getHashArray(); 
     105                $this->arrErr = $objFormParam->checkError(); 
     106                if (SC_Utils_Ex::isBlank($this->arrErr)) { 
     107                    $this->errmsg = $this->lfCheckForgotMail($this->arrForm, $this->arrReminder); 
     108                    if(SC_Utils_Ex::isBlank($this->errmsg)) { 
     109                        $this->tpl_mainpage = 'forgot/secret.tpl'; 
     110                    } 
     111                } 
    95112                break; 
    96113            case 'secret_check': 
    97                 $this->lfForgotSecretCheck(); 
     114                $this->lfInitSecretCheckParam($objFormParam, $this->device_type); 
     115                $objFormParam->setParam($_POST); 
     116                $objFormParam->convParam(); 
     117                $objFormParam->toLower('email'); 
     118                $this->arrForm = $objFormParam->getHashArray(); 
     119                $this->arrErr = $objFormParam->checkError(); 
     120                if (SC_Utils_Ex::isBlank($this->arrErr)) { 
     121                    $this->errmsg = $this->lfCheckForgotSecret($this->arrForm, $this->arrReminder); 
     122                    if(SC_Utils_Ex::isBlank($this->errmsg)) { 
     123                        // 完了ページへ移動する 
     124                        $this->tpl_mainpage = 'forgot/complete.tpl'; 
     125                        // transactionidを更新させたいので呼び出し元(ログインフォーム側)をリロード。 
     126                        $this->tpl_onload .= 'opener.location.reload(true);'; 
     127                    }else{ 
     128                        // 秘密の答えが一致しなかった 
     129                        $this->tpl_mainpage = 'forgot/secret.tpl'; 
     130                    } 
     131                }else{ 
     132                    // 入力値エラー 
     133                    $this->tpl_mainpage = 'forgot/secret.tpl'; 
     134                } 
    98135                break; 
    99136            default: 
    100                 $this->lfForgotDefault(); 
    101137                break; 
    102138        } 
    103139 
    104140        $this->transactionid = SC_Helper_Session_Ex::getToken(); 
    105  
    106         if ($this->isMobile) { 
    107             // モバイルサイトの場合はトークン生成 
    108             $this->createMobileToken(); 
    109         } else { 
    110             // モバイルサイト以外の場合、ポップアップ用テンプレートファイル設定 
     141         
     142        // ポップアップ用テンプレート設定 
     143        if($this->device_type == DEVICE_TYPE_PC) { 
    111144            $this->setTemplate($this->tpl_mainpage); 
    112145        } 
    113146    } 
    114147 
    115     // 最初に開いた時の処理(メールアドレス入力画面) 
    116     function lfForgotDefault() { 
    117         // クッキー管理クラス 
    118         $objCookie = new SC_Cookie(COOKIE_EXPIRE); 
    119         $this->tpl_login_email = $objCookie->getCookie('login_email'); 
    120     } 
    121  
    122     // メールアドレス確認(秘密の質問入力画面) 
    123     function lfForgotMailCheck() { 
    124         // パラメータ管理クラス,パラメータ情報の初期化 
    125         $this->objFormParam = new SC_FormParam(); 
    126         $this->lfMailCheckInitParam(); 
    127         // POST値の取得 
    128         $this->objFormParam->setParam($_POST); 
    129         $this->objFormParam->convParam(); 
    130         $this->objFormParam->toLower('email'); 
    131         $this->arrForm = $this->objFormParam->getHashArray(); 
    132         //エラーチェック 
    133         $this->arrErr = $this->lfMailCheckErrorCheck(); 
    134         if (count($this->arrErr) == 0) { 
    135             $email = $this->arrForm['email']; 
    136             $objQuery =& SC_Query::getSingletonInstance(); 
    137             $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0"; 
    138             $arrVal = array($this->arrForm['email'], $this->arrForm['email'], $this->arrForm['name01'], $this->arrForm['name02']); 
    139             $result = $objQuery->select("reminder, status", "dtb_customer", $where, $arrVal); 
    140             if (isset($result[0]['reminder']) and isset($this->arrReminder[$result[0]['reminder']])) { 
    141                 if($result[0]['status'] == '2') { 
    142                     // 有効な情報であるため、秘密の質問確認へ遷移 
    143                     $this->tpl_mainpage = 'forgot/secret.tpl'; 
    144                     $this->arrForm['reminder'] = $result[0]['reminder']; 
    145                 } else if ($result[0]['status'] == '1') { 
    146                     $this->errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。'; 
    147                 } 
    148             } else { 
    149                 $this->errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。'; 
    150             } 
    151         } 
    152     } 
    153  
    154     // メールアドレス確認におけるエラーチェック 
    155     function lfMailCheckErrorCheck() { 
    156         // 入力データを渡す 
    157         $arrRet = $this->objFormParam->getHashArray(); 
    158         $objErr = new SC_CheckError($arrRet); 
    159         $objErr->arrErr = $this->objFormParam->checkError(); 
    160         return $objErr->arrErr; 
    161     } 
    162  
    163     // メールアドレス確認におけるパラメーター情報の初期化 
    164     function lfMailCheckInitParam() { 
    165         $this->objFormParam->addParam("お名前(姓)", 'name01', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK")); 
    166         $this->objFormParam->addParam("お名前(名)", 'name02', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK")); 
    167         if ($this->isMobile == false){ 
    168             $this->objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK")); 
    169         } else { 
    170             $this->objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("EXIST_CHECK", "EMAIL_CHECK", "NO_SPTAB" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK","MOBILE_EMAIL_CHECK")); 
    171         } 
    172  
    173     } 
    174  
    175     // 秘密の質問確認 
    176     function lfForgotSecretCheck() { 
    177         // パラメータ管理クラス,パラメータ情報の初期化 
    178         $this->objFormParam = new SC_FormParam(); 
    179         $this->lfSecretCheckInitParam(); 
    180         // POST値の取得 
    181         $this->objFormParam->setParam($_POST); 
    182         $this->objFormParam->convParam(); 
    183         $this->objFormParam->toLower('email'); 
    184         $this->arrForm = $this->objFormParam->getHashArray(); 
    185         //エラーチェック 
    186         $this->arrErr = $this->lfSecretCheckErrorCheck(); 
    187         if (count($this->arrErr) == 0) { 
    188             $email = $this->arrForm['email']; 
    189             $objQuery =& SC_Query::getSingletonInstance(); 
    190             $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND status = 2 AND del_flg = 0"; 
    191             $arrVal = array($this->arrForm['email'], $this->arrForm['email'], $this->arrForm['name01'], $this->arrForm['name02']); 
    192             $result = $objQuery->select("customer_id, reminder, reminder_answer, salt", "dtb_customer", $where, $arrVal); 
    193             if (isset($result[0]['reminder']) and isset($this->arrReminder[$result[0]['reminder']]) 
    194                     and $result[0]['reminder'] == $this->arrForm['reminder']) { 
    195  
    196                 if (SC_Utils_Ex::sfIsMatchHashPassword($this->arrForm['reminder_answer'], $result[0]['reminder_answer'], $result[0]['salt'])) { 
    197                     // 秘密の答えが一致 
    198                     // 新しいパスワードを設定する 
    199                     $this->temp_password = GC_Utils_Ex::gfMakePassword(8); 
    200  
    201                     if(FORGOT_MAIL == 1) { 
    202                         // メールで変更通知をする 
    203                         $objDb = new SC_Helper_DB_Ex(); 
    204                         $CONF = $objDb->sfGetBasisData(); 
    205                         $this->lfSendMail($CONF, $this->arrForm['email'], $this->arrForm['name01'], $this->temp_password); 
    206                     } 
    207                     $sqlval = array(); 
    208                     $sqlval['password'] = $this->temp_password; 
    209                     SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']); 
    210  
    211                     // 完了ページへ移動する 
    212                     $this->tpl_mainpage = 'forgot/complete.tpl'; 
    213                     // transactionidの都合で呼び出し元をリロード。 
    214                     $this->tpl_onload .= 'opener.location.reload(true);'; 
    215                 } else { 
    216                     // 秘密の答えが一致しなかった 
    217                     $this->tpl_mainpage = 'forgot/secret.tpl'; 
    218                     $this->errmsg = '秘密の質問が一致しませんでした。'; 
    219                 } 
    220             } else { 
    221                 //不正なアクセス 
    222                 SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true); 
     148    /** 
     149     * メールアドレス・名前確認 
     150     * 
     151     * @param array $arrForm フォーム入力値 
     152     * @param array $arrReminder リマインダー質問リスト 
     153     * @return string エラー文字列 問題が無ければNULL 
     154     */ 
     155    function lfCheckForgotMail(&$arrForm, &$arrReminder) { 
     156        $errmsg = NULL; 
     157        $objQuery =& SC_Query::getSingletonInstance(); 
     158        $where = "(email Like ? OR email_mobile Like ?) AND name01 Like ? AND name02 Like ? AND del_flg = 0"; 
     159        $arrVal = array($arrForm['email'], $arrForm['email'], $arrForm['name01'], $arrForm['name02']); 
     160        $result = $objQuery->select("reminder, status", "dtb_customer", $where, $arrVal); 
     161        if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']])) { 
     162            // 会員状態の確認 
     163            if($result[0]['status'] == '2') { 
     164                // 正会員 
     165                $arrForm['reminder'] = $result[0]['reminder']; 
     166            } else if ($result[0]['status'] == '1') { 
     167                // 仮会員 
     168                $errmsg = 'ご入力のemailアドレスは現在仮登録中です。<br/>登録の際にお送りしたメールのURLにアクセスし、<br/>本会員登録をお願いします。'; 
    223169            } 
    224170        } else { 
    225             $this->tpl_mainpage = 'forgot/secret.tpl'; 
    226         } 
    227     } 
    228  
    229     function lfSecretCheckInitParam() { 
     171            $errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。'; 
     172        } 
     173        return $errmsg; 
     174    } 
     175     
     176    /** 
     177     * メールアドレス確認におけるパラメーター情報の初期化 
     178     * 
     179     * @param array $objFormParam フォームパラメータークラス 
     180     * @param array $device_type デバイスタイプ 
     181     * @return void 
     182     */ 
     183    function lfInitMailCheckParam(&$objFormParam, $device_type) { 
     184        $objFormParam->addParam("お名前(姓)", 'name01', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK")); 
     185        $objFormParam->addParam("お名前(名)", 'name02', STEXT_LEN, "aKV", array("EXIST_CHECK", "NO_SPTAB", "SPTAB_CHECK" , "MAX_LENGTH_CHECK")); 
     186        if ($device_type === DEVICE_TYPE_MOBILE){ 
     187            $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("EXIST_CHECK", "EMAIL_CHECK", "NO_SPTAB" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK","MOBILE_EMAIL_CHECK")); 
     188        } else { 
     189            $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK")); 
     190        } 
     191        return; 
     192    } 
     193 
     194    /** 
     195     * 秘密の質問確認 
     196     * 
     197     * @param array $arrForm フォーム入力値 
     198     * @param array $arrReminder リマインダー質問リスト 
     199     * @return string エラー文字列 問題が無ければNULL 
     200     */ 
     201    function lfCheckForgotSecret(&$arrForm, &$arrReminder) { 
     202        $errmsg = ''; 
     203        $objQuery =& SC_Query::getSingletonInstance(); 
     204        $cols = "customer_id, reminder, reminder_answer, salt"; 
     205        $table = "dtb_customer"; 
     206        $where = "(email Like ? OR email_mobile Like ?)" 
     207                    . " AND name01 Like ? AND name02 Like ?" 
     208                    . " AND status = 2 AND del_flg = 0"; 
     209        $arrVal = array($arrForm['email'], $arrForm['email'], 
     210                            $arrForm['name01'], $arrForm['name02']); 
     211        $result = $objQuery->select($cols, $table, $where, $arrVal); 
     212        if (isset($result[0]['reminder']) and isset($arrReminder[$result[0]['reminder']]) 
     213                and $result[0]['reminder'] == $arrForm['reminder']) { 
     214             
     215            if (SC_Utils_Ex::sfIsMatchHashPassword($arrForm['reminder_answer'], 
     216                     $result[0]['reminder_answer'], $result[0]['salt'])) { 
     217                // 秘密の答えが一致 
     218                // 新しいパスワードを設定する 
     219                $new_password = GC_Utils_Ex::gfMakePassword(8); 
     220                if(FORGOT_MAIL == 1) { 
     221                    // メールで変更通知をする 
     222                    $objDb = new SC_Helper_DB_Ex(); 
     223                    $CONF = $objDb->sfGetBasisData(); 
     224                    $this->lfSendMail($CONF, $arrForm['email'], $arrForm['name01'], $new_password); 
     225                } 
     226                $sqlval = array(); 
     227                $sqlval['password'] = $new_password; 
     228                SC_Helper_Customer_Ex::sfEditCustomerData($sqlval, $result[0]['customer_id']); 
     229                $arrForm['new_password'] = $new_password; 
     230            } else { 
     231                // 秘密の答えが一致しなかった 
     232                $errmsg = '秘密の質問が一致しませんでした。'; 
     233            } 
     234        } else { 
     235            //不正なアクセス リマインダー値が前画面と異なる。 
     236            // 新リファクタリング基準ではここで遷移は不許可なのでエラー表示 
     237            //SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true); 
     238            $errmsg = '秘密の質問が一致しませんでした。'; 
     239        } 
     240        return $errmsg; 
     241    } 
     242 
     243    /** 
     244     * 秘密の質問確認におけるパラメーター情報の初期化 
     245     * 
     246     * @param array $objFormParam フォームパラメータークラス 
     247     * @param array $device_type デバイスタイプ 
     248     * @return void 
     249     */ 
     250    function lfInitSecretCheckParam(&$objFormParam, $device_type) { 
    230251        // メールチェックと同等のチェックを再度行う 
    231         $this->lfMailCheckInitParam(); 
     252        $this->lfInitMailCheckParam($objFormParam, $device_type); 
    232253        // 秘密の質問チェックの追加 
    233         $this->objFormParam->addParam("パスワード確認用の質問", "reminder", STEXT_LEN, "n", array("EXIST_CHECK", "NUM_CHECK")); 
    234         $this->objFormParam->addParam("パスワード確認用の質問の答え", "reminder_answer", STEXT_LEN, "aKV", array("EXIST_CHECK","SPTAB_CHECK" , "MAX_LENGTH_CHECK")); 
    235     } 
    236  
    237     // 秘密の答え確認におけるエラーチェック 
    238     function lfSecretCheckErrorCheck() { 
    239         // 入力データを渡す 
    240         $arrRet = $this->objFormParam->getHashArray(); 
    241         $objErr = new SC_CheckError($arrRet); 
    242         $objErr->arrErr = $this->objFormParam->checkError(); 
    243         return $objErr->arrErr; 
     254        $objFormParam->addParam("パスワード確認用の質問", "reminder", STEXT_LEN, "n", array("EXIST_CHECK", "NUM_CHECK")); 
     255        $objFormParam->addParam("パスワード確認用の質問の答え", "reminder_answer", STEXT_LEN, "aKV", array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 
     256        return; 
    244257    } 
    245258 
     
    259272     * @param string $email 送信先メールアドレス 
    260273     * @param string $customer_name 送信先氏名 
    261      * @param string $temp_password 変更後のパスワード 
    262      * @return void 
    263      * 
    264      * FIXME: メールテンプレート編集の方に足すのが望ましい? 
    265      */ 
    266     function lfSendMail($CONF, $email, $customer_name, $temp_password){ 
    267         // パスワード変更お知らせメール送信 
    268         $this->customer_name = $customer_name; 
    269         $this->temp_password = $temp_password; 
     274     * @param string $new_password 変更後の新パスワード 
     275     * @return void 
     276     * 
     277     * FIXME: メールテンプレート編集の方に足すのが望ましい 
     278     */ 
     279    function lfSendMail(&$CONF, $email, $customer_name, $new_password){ 
     280        // パスワード変更お知らせメール送信 
    270281        $objMailText = new SC_SiteView(false); 
    271         $objMailText->assignobj($this); 
    272  
     282        $objMailText->assign('customer_name', $customer_name); 
     283        $objMailText->assign('new_password', $new_password); 
    273284        $toCustomerMail = $objMailText->fetch("mail_templates/forgot_mail.tpl"); 
     285        // メール送信オブジェクトによる送信処理 
    274286        $objMail = new SC_SendMail(); 
    275  
    276287        $objMail->setItem( 
    277                               ''                                // 宛先 
    278                             , "パスワードが変更されました" ."【" .$CONF["shop_name"]. "】"     // サブジェクト 
    279                             , $toCustomerMail                   // 本文 
    280                             , $CONF["email03"]                  // 配送元アドレス 
    281                             , $CONF["shop_name"]                // 配送元 名前 
    282                             , $CONF["email03"]                  // reply_to 
    283                             , $CONF["email04"]                  // return_path 
    284                             , $CONF["email04"]                  //  Errors_to 
    285  
    286                                                             ); 
     288            '' //宛先 
     289            , $toCustomerMail //本文 
     290            , $CONF['email03'] //配送元アドレス 
     291            , $CONF['shop_name'] // 配送元名 
     292            , $CONF['email03'] // reply to 
     293            , $CONF['email04'] //return_path 
     294            , $CONF['email04'] // errors_to 
     295            ); 
    287296        $objMail->setTo($email, $customer_name ." 様"); 
    288297        $objMail->sendMail(); 
    289     } 
    290  
    291     /** 
    292      * モバイル空メール用のトークン作成 
    293      * 
    294      * @return void 
    295      * 
    296      * FIXME: この処理の有効性が不明 
    297      */ 
    298     function createMobileToken() { 
    299         $objMobile = new SC_Helper_Mobile_Ex(); 
    300         // 空メール用のトークンを作成。 
    301         if (MOBILE_USE_KARA_MAIL) { 
    302             $token = $objMobile->gfPrepareKaraMail('forgot/' . DIR_INDEX_PATH); 
    303             if ($token !== false) { 
    304                 $objPage->tpl_kara_mail_to = MOBILE_KARA_MAIL_ADDRESS_USER . MOBILE_KARA_MAIL_ADDRESS_DELIMITER . 'forgot_' . $token . '@' . MOBILE_KARA_MAIL_ADDRESS_DOMAIN; 
    305             } 
    306         } 
    307     } 
     298        return; 
     299    } 
     300 
    308301} 
    309302?> 
Note: See TracChangeset for help on using the changeset viewer.