/** * 絵文字番号を絵文字を表す Shift JIS の文字列に変換する。 * * @param string $index 絵文字番号 * @return string 絵文字を表す Shift JIS の文字列を返す。 */ function indexToCode($index) { $carrier = SC_MobileUserAgent_Ex::getCarrier(); if ($carrier === false) { return MOBILE_EMOJI_SUBSTITUTE; } static $arrMap = array(); if (empty($arrMap)) { $arrMap = @(include_once dirname(__FILE__) . "/../include/mobile_emoji_map_{$carrier}.inc"); } return isset($arrMap[$index]) ? $arrMap[$index] : MOBILE_EMOJI_SUBSTITUTE; }
/** * 携帯端末IDを使用して会員を検索し、パスワードの照合を行う。 * パスワードが合っている場合は会員情報を取得する。 * * @param string $pass パスワード * @return boolean 該当する会員が存在し、パスワードが合っている場合は true、 * それ以外の場合は false を返す。 */ function getCustomerDataFromMobilePhoneIdPass($pass) { //docomo用にデータを取り出す。 if (SC_MobileUserAgent_Ex::getCarrier() == 'docomo') { if ($_SESSION['mobile']['phone_id'] == '' && strlen($_SESSION['mobile']['phone_id']) == 0) { $_SESSION['mobile']['phone_id'] = SC_MobileUserAgent_Ex::getId(); } } if (!isset($_SESSION['mobile']['phone_id']) || $_SESSION['mobile']['phone_id'] === false) { return false; } // 携帯端末IDが一致し、本登録された会員を検索する。 $sql = 'SELECT * FROM dtb_customer WHERE mobile_phone_id = ? AND del_flg = 0 AND status = 2'; $objQuery =& SC_Query_Ex::getSingletonInstance(); @(list($data) = $objQuery->getAll($sql, array($_SESSION['mobile']['phone_id']))); // パスワードが合っている場合は、会員情報をcustomer_dataに格納してtrueを返す。 if (SC_Utils_Ex::sfIsMatchHashPassword($pass, $data['password'], $data['salt'])) { $this->customer_data = $data; $this->startSession(); return true; } return false; }
/** * アプリケーション内でリダイレクトする * * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち) * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING'] * 2. $location に含まれる searchpart * 3. 引数 $arrQueryString * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。 * @param array $arrQueryString URL に付加する searchpart * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承 * @return void * @static */ function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null) { // url-path → URL 変換 if ($location[0] === '/') { $netUrl = new Net_URL($location); $location = $netUrl->getUrl(); } // URL の場合 if (preg_match('/^https?:/', $location)) { $url = $location; if (is_bool($useSsl)) { if ($useSsl) { $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/'; $replacement = HTTPS_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } else { $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/'; $replacement = HTTP_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } } } else { if (!is_bool($useSsl)) { $useSsl = SC_Utils_Ex::sfIsHTTPS(); } $netUrl = new Net_URL($useSsl ? HTTPS_URL : HTTP_URL); $netUrl->path = dirname($_SERVER['PHP_SELF']) . '/' . $location; $url = $netUrl->getUrl(); } $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/'; // アプリケーション外へのリダイレクトは扱わない if (preg_match($pattern, $url) === 0) { SC_Utils_Ex::sfDispException(); } $netUrl = new Net_URL($url); if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) { $arrQueryStringBackup = $netUrl->querystring; // XXX メソッド名は add で始まるが、実際には置換を行う $netUrl->addRawQueryString($_SERVER['QUERY_STRING']); $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup); } $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString); $session = SC_SessionFactory::getInstance(); if (SC_MobileUserAgent_Ex::isMobile() || $session->useCookie() == false) { $netUrl->addQueryString(session_name(), session_id()); } $netUrl->addQueryString(TRANSACTION_ID_NAME, SC_Helper_Session_Ex::getToken()); $url = $netUrl->getURL(); header("Location: {$url}"); exit; }
/** * 携帯のIDを登録する. * */ function updatePhoneId() { $this->setValue('phone_id', SC_MobileUserAgent_Ex::getId()); }
/** * 画像を端末の解像度に合わせて変換する * output buffering 用コールバック関数 * * @param string 入力 * @return string 出力 */ public static function handler($buffer) { // 端末情報を取得する $carrier = SC_MobileUserAgent_Ex::getCarrier(); $model = SC_MobileUserAgent_Ex::getModel(); // 携帯電話の場合のみ処理を行う if ($carrier !== FALSE) { // HTML中のIMGタグを取得する $images = array(); $pattern = '/<img\\s+[^<>]*src=[\'"]?([^>"\'\\s]+)[\'"]?[^>]*>/i'; $result = preg_match_all($pattern, $buffer, $images); // 端末の情報を取得する $fp = fopen(MOBILE_IMAGE_INC_REALDIR . "mobile_image_map_{$carrier}.csv", 'r'); // 取得できない場合は, 入力内容をそのまま返す if ($fp === false) { return $buffer; } while (($data = fgetcsv($fp, 1000, ',')) !== FALSE) { if ($data[1] == $model || $data[1] == '*') { $cacheSize = $data[2]; $imageFileSize = $data[7]; $imageType = $data[6]; $imageWidth = $data[5]; $imageHeight = $data[4]; break; } } fclose($fp); // docomoとsoftbankの場合は画像ファイル一つに利用可能なサイズの上限を計算する // auはHTMLのbyte数上限に画像ファイルサイズが含まれないのでimageFileSizeのまま。 if ($carrier == 'docomo' or $carrier == 'softbank') { if ($result != false && $result > 0) { // 計算式:(利用端末で表示可能なcacheサイズ - HTMLのバイト数 - 変換後の画像名のバイト数(目安値)) / HTML中の画像数 $temp_imagefilesize = ($cacheSize - strlen($buffer) - 140 * $result) / $result; } else { // 計算式:(利用端末で表示可能なcacheサイズ - HTMLのバイト数) $temp_imagefilesize = $cacheSize - strlen($buffer); } // 計算結果が端末の表示可能ファイルサイズ上限より小さい場合は計算結果の値を有効にする if ($temp_imagefilesize < $imageFileSize) { $imageFileSize = $temp_imagefilesize; } } // 画像変換の情報をセットする $imageConverter = new ImageConverter(); $imageConverter->setOutputDir(MOBILE_IMAGE_REALDIR); $imageConverter->setImageType($imageType); $imageConverter->setImageWidth($imageWidth); $imageConverter->setImageHeight($imageHeight); $imageConverter->setFileSize($imageFileSize); // HTML中のIMGタグを変換後のファイルパスに置換する foreach ($images[1] as $key => $path) { // resize_image.phpは除外 if (stripos($path, ROOT_URLPATH . 'resize_image.php') !== FALSE) { continue; } $realpath = html_entity_decode($path, ENT_QUOTES); $realpath = substr_replace($realpath, HTML_REALDIR, 0, strlen(ROOT_URLPATH)); $converted = $imageConverter->execute($realpath); if (isset($converted['outputImageName'])) { $buffer = str_replace($path, MOBILE_IMAGE_URLPATH . $converted['outputImageName'], $buffer); } else { $buffer = str_replace($images[0][$key], '<!--No image-->', $buffer); } } } return $buffer; }
/** * EC-CUBE がサポートする携帯キャリアかどうかを判別する。 * * @return boolean 携帯端末ではない場合は true、それ以外の場合は false を返す。 */ function isNonMobile() { return !SC_MobileUserAgent_Ex::isMobile(); }
/** * セッションデータが有効かどうかをチェックする。 * * FIXME '@' でエラーを抑制するのは良くない * * @return boolean セッションデータが有効な場合は true、無効な場合は false を返す。 */ function lfMobileValidateSession() { // 配列 mobile が登録されているかどうかをチェックする。 if (!is_array(@$_SESSION['mobile'])) { return false; } // 有効期限を過ぎていないかどうかをチェックする。 if (intval(@$_SESSION['mobile']['expires']) < time()) { $msg = 'Session expired at ' . date('Y/m/d H:i:s', @$_SESSION['mobile']['expires']) . ' : sid=' . session_id(); GC_Utils_Ex::gfPrintLog($msg); return false; } // 携帯端末の機種が一致するかどうかをチェックする。 $model = SC_MobileUserAgent_Ex::getModel(); if (@$_SESSION['mobile']['model'] != $model) { $msg = 'User agent model mismatch : ' . '"$model" != "' . @$_SESSION['mobile']['model'] . '" (expected), sid=' . session_id(); GC_Utils_Ex::gfPrintLog($msg); return false; } return true; }
/** * モバイルサイト用のセッション関連の初期処理を行う。 * * @return void */ function lfMobileInitSession() { // セッションIDの受け渡しにクッキーを使用しない。 ini_set('session.use_cookies', '0'); ini_set('session.use_only_cookies', '0'); // パラメーターから有効なセッションIDを取得する。 $sessionId = $this->lfMobileGetSessionId(); session_start(); // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成 // し、セッションデータを初期化する。 if ($sessionId === false || !$this->lfMobileValidateSession()) { session_regenerate_id(); $_SESSION = array('mobile' => array('model' => SC_MobileUserAgent_Ex::getModel(), 'phone_id' => SC_MobileUserAgent_Ex::getId(), 'expires' => time() + MOBILE_SESSION_LIFETIME)); // 新しいセッションIDを付加してリダイレクトする。 if ($_SERVER['REQUEST_METHOD'] == 'GET') { // GET の場合は同じページにリダイレクトする。 header('Location: ' . $this->gfAddSessionId()); } else { // GET 以外の場合はトップページへリダイレクトする。 header('Location: ' . TOP_URLPATH . '?' . SID); } exit; } // 携帯端末IDを取得できた場合はセッションデータに保存する。 $phoneId = SC_MobileUserAgent_Ex::getId(); if ($phoneId !== false) { $_SESSION['mobile']['phone_id'] = $phoneId; } // セッションの有効期限を更新する。 $_SESSION['mobile']['expires'] = time() + MOBILE_SESSION_LIFETIME; }
/** * 会員登録に必要なSQLパラメーターの配列を生成する. * * フォームに入力された情報を元に, SQLパラメーターの配列を生成する. * モバイル端末の場合は, email を email_mobile にコピーし, * mobile_phone_id に携帯端末IDを格納する. * * @param mixed $objFormParam * @access private * @return $arrResults */ public function lfMakeSqlVal(&$objFormParam) { $arrForm = $objFormParam->getHashArray(); $arrResults = $objFormParam->getDbArray(); // 生年月日の作成 $arrResults['birth'] = SC_Utils_Ex::sfGetTimestamp($arrForm['year'], $arrForm['month'], $arrForm['day']); // 仮会員 1 本会員 2 $arrResults['status'] = CUSTOMER_CONFIRM_MAIL == true ? '1' : '2'; /* * secret_keyは、テーブルで重複許可されていない場合があるので、 * 本会員登録では利用されないがセットしておく。 */ $arrResults['secret_key'] = SC_Helper_Customer_Ex::sfGetUniqSecretKey(); // 入会時ポイント $CONF = SC_Helper_DB_Ex::sfGetBasisData(); $arrResults['point'] = $CONF['welcome_point']; if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE) { // 携帯メールアドレス $arrResults['email_mobile'] = $arrResults['email']; // PHONE_IDを取り出す $arrResults['mobile_phone_id'] = SC_MobileUserAgent_Ex::getId(); } return $arrResults; }
/** * 受注完了メールを送信する. * * HTTP_USER_AGENT の種別により, 携帯電話の場合は携帯用の文面, * PC の場合は PC 用の文面でメールを送信する. * * @param integer $orderId 受注ID * @return void */ function sendOrderMail($orderId) { $mailHelper = new SC_Helper_Mail_Ex(); $mailHelper->sfSendOrderMail($orderId, SC_MobileUserAgent_Ex::isMobile() ? 2 : 1); }