tpl_title = "パスワードを忘れた方"; $this->tpl_mainpage = 'forgot/index.tpl'; $this->tpl_mainno = ''; $masterData = new SC_DB_MasterData_Ex(); $this->arrReminder = $masterData->getMasterData("mtb_reminder"); $this->device_type = SC_Display_Ex::detectDevice(); $this->httpCacheControl('nocache'); // デフォルトログインアドレスロード $objCookie = new SC_Cookie(COOKIE_EXPIRE); $this->tpl_login_email = $objCookie->getCookie('login_email'); } /** * Page のプロセス. * * @return void */ function process() { $this->action(); $this->sendResponse(); } /** * Page のアクション. * * @return void */ function action() { // パラメータ管理クラス $objFormParam = new SC_FormParam(); switch($this->getMode()) { case 'mail_check': $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->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: break; } // ポップアップ用テンプレート設定 if($this->device_type == DEVICE_TYPE_PC) { $this->setTemplate($this->tpl_mainpage); } } /** * メールアドレス・名前確認 * * @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アドレスは現在仮登録中です。
登録の際にお送りしたメールのURLにアクセスし、
本会員登録をお願いします。'; } } else { $errmsg = 'お名前に間違いがあるか、このメールアドレスは登録されていません。'; } return $errmsg; } /** * メールアドレス確認におけるパラメーター情報の初期化 * * @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 { $objFormParam->addParam('メールアドレス', "email", MTEXT_LEN, "a", array("NO_SPTAB", "EXIST_CHECK", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK")); } return; } /** * 秘密の質問確認 * * @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 { // 秘密の答えが一致しなかった $errmsg = '秘密の質問が一致しませんでした。'; } } else { //不正なアクセス リマインダー値が前画面と異なる。 // 新リファクタリング基準ではここで遷移は不許可なのでエラー表示 //SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, "", true); $errmsg = '秘密の質問が一致しませんでした。'; } return $errmsg; } /** * 秘密の質問確認におけるパラメーター情報の初期化 * * @param array $objFormParam フォームパラメータークラス * @param array $device_type デバイスタイプ * @return void */ function lfInitSecretCheckParam(&$objFormParam, $device_type) { // メールチェックと同等のチェックを再度行う $this->lfInitMailCheckParam($objFormParam, $device_type); // 秘密の質問チェックの追加 $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; } /** * デストラクタ. * * @return void */ function destroy() { parent::destroy(); } /** * パスワード変更お知らせメールを送信する. * * @param array $CONF 店舗基本情報の配列 * @param string $email 送信先メールアドレス * @param string $customer_name 送信先氏名 * @param string $new_password 変更後の新パスワード * @return void * * FIXME: メールテンプレート編集の方に足すのが望ましい */ function lfSendMail(&$CONF, $email, $customer_name, $new_password){ // パスワード変更お知らせメール送信 $objMailText = new SC_SiteView_Ex(false); $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( '' //宛先 , $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; } } ?>