Source for file SC_Helper_Mobile.php
Documentation is available at SC_Helper_Mobile.php
* This file is part of EC-CUBE
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
* http://www.lockon.co.jp/
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
require_once CLASS_REALDIR . '../module/Net/URL.php';
require_once CLASS_REALDIR . 'SC_Query.php';
* @author LOCKON CO.,LTD.
* @version $Id: SC_Helper_Mobile.php 21185 2011-08-11 10:37:10Z shutta $
* EC-CUBE がサポートする携帯端末かどうかをチェックする。
* 非対応端末の場合は /unsupported/ へリダイレクトする。
if (!SC_MobileUserAgent_Ex::isSupported()) {
header('Location: ' . ROOT_URLPATH . 'unsupported/' . DIR_INDEX_PATH);
* 入力データを内部エンコーディングに変換し、絵文字を除去する。
* @param string &$value 入力データへの参照
foreach($value as $key => $val ){
// Shift JIS から内部エンコーディングに変換する。
$value = mb_convert_encoding($value, CHAR_CODE, 'SJIS');
// SoftBank? 以外の絵文字は外字領域に含まれるため、この段階で除去される。
$value = preg_replace('/\\x1b\\$[^\\x0f]*\\x0f/', '', $value);
array_walk($_GET, array($this, 'lfMobileConvertInputValue'));
array_walk($_POST, array($this, 'lfMobileConvertInputValue'));
array_walk($_REQUEST, array($this, 'lfMobileConvertInputValue'));
* dtb_mobile_ext_session_id テーブルを検索してセッションIDを取得する。
* @return string|null取得したセッションIDを返す。
if (!preg_match('|^' . ROOT_URLPATH . '(.*)$|', $_SERVER['SCRIPT_NAME'], $matches)) {
$time = date('Y-m-d H:i:s', time() - MOBILE_SESSION_LIFETIME);
$objQuery = new SC_Query_Ex();
foreach ($_REQUEST as $key => $value) {
$session_id = $objQuery->get('session_id', 'dtb_mobile_ext_session_id',
'param_key = ? AND param_value = ? AND url = ? AND create_date >= ?',
array($key, $value, $url, $time));
if (isset ($session_id)) {
* パラメーターから有効なセッションIDを取得する。
* @return string|false取得した有効なセッションIDを返す。
if (!isset ($sessionId)) {
if (!isset ($sessionId)) {
if (!isset ($sessionId)) {
$objSession = new SC_Helper_Session_Ex();
if ($objSession->sfSessRead($sessionId) === null) {
GC_Utils_Ex::gfPrintLog("Non-existent session id : sid=$sessionId");
* セッションデータが有効かどうかをチェックする。
* FIXME "@" でエラーを抑制するのは良くない
* @return boolean セッションデータが有効な場合は true、無効な場合は false を返す。
// 配列 mobile が登録されているかどうかをチェックする。
// 有効期限を過ぎていないかどうかをチェックする。
if (intval(@$_SESSION['mobile']['expires']) < time()) {
GC_Utils_Ex::gfPrintLog("Session expired at " .
date('Y/m/d H:i:s', @$_SESSION['mobile']['expires']) .
// 携帯端末の機種が一致するかどうかをチェックする。
$model = SC_MobileUserAgent_Ex::getModel();
if (@$_SESSION['mobile']['model'] != $model) {
GC_Utils_Ex::gfPrintLog("User agent model mismatch : " .
"\"$model\" != \"" . @$_SESSION['mobile']['model'] .
* モバイルサイト用のセッション関連の初期処理を行う。
// セッションIDの受け渡しにクッキーを使用しない。
ini_set('session.use_cookies', '0');
ini_set('session.use_only_cookies', '0');
// パラメーターから有効なセッションIDを取得する。
// セッションIDまたはセッションデータが無効な場合は、セッション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 の場合は同じページにリダイレクトする。
// GET 以外の場合はトップページへリダイレクトする。
header('Location: ' . TOP_URLPATH . '?' . SID);
// 携帯端末IDを取得できた場合はセッションデータに保存する。
$phoneId = SC_MobileUserAgent_Ex::getId();
if ($phoneId !== false) {
$_SESSION['mobile']['phone_id'] = $phoneId;
$_SESSION['mobile']['expires'] = time() + MOBILE_SESSION_LIFETIME;
* 2. 内部エンコーディングから Shift JIS に変換する。
// Smarty 用のディレクトリーを作成する。
// 出力用のエンコーディングを Shift JIS に固定する。
mb_http_output('SJIS-win');
ob_start(array('SC_MobileEmoji_Ex', 'handler'));
ob_start(array('SC_MobileImage_Ex', 'handler'));
// 内部エンコーディングから Shift JIS に変換する。
* 共有SSL対応のため、SC_SessionFactory_UseRequest::initSession()へ移行
* また、他のセッション関連メソッドもSC_SessionFactory_UseRequestのインスタンスから呼び出すこと
* @see data/class/session/sessionfactory/SC_SessionFactory_UseRequest.php
// $this->lfMobileInitSession();
* Location等でセッションIDを付加する必要があるURLにセッションIDを付加する。
$objURL = new Net_URL($url);
return $objURL->getURL();
* @param array $array 元となる配列
* @param array セッション ID を追加した配列
* @return string 生成したトークンを返す。
$token_chars = '0123456789abcdefghijklmnopqrstuvwxyz';
$token_chars_length = strlen($token_chars);
while ($token_length > 0) {
$token .= $token_chars{mt_rand(0, $token_chars_length - 1)};
* 空メール管理テーブルに新規エントリーを登録し、トークンを返す。
* @param string $next_url 空メール受け付け後に遷移させるページ (モバイルサイトトップからの相対URL)
* @param string $session_id セッションID (省略した場合は現在のセッションID)
* @return string|falseトークンを返す。エラーが発生した場合はfalseを返す。
if (!isset ($session_id)) {
$objQuery = new SC_Query_Ex();
$time = date('Y-m-d H:i:s', time() - MOBILE_SESSION_LIFETIME);
$objQuery->delete('dtb_mobile_kara_mail', 'email IS NULL AND create_date < ?', array($time));
$objQuery->delete('dtb_mobile_kara_mail', 'session_id = ?', array($session_id));
$arrValues = array('session_id' => $session_id,
'next_url' => $next_url);
$arrValues['kara_mail_id'] = $objQuery->nextVal('dtb_mobile_kara_mail_kara_mail_id');
$objQuery->insert('dtb_mobile_kara_mail', $arrValues);
$count = $objQuery->count('dtb_mobile_kara_mail', 'token = ?', array($token));
$objQuery->delete('dtb_mobile_kara_mail', 'session_id = ?', array($session_id));
* 空メールから取得したメールアドレスを空メール管理テーブルに登録する。
* @param string $token トークン
* @param string $email メールアドレス
* @return boolean 成功した場合はtrue、失敗した場合はfalseを返す。
$objQuery = new SC_Query_Ex();
$time = date('Y-m-d H:i:s', time() - MOBILE_SESSION_LIFETIME);
$objQuery->delete('dtb_mobile_kara_mail',
'(email IS NULL AND create_date < ?) OR (email IS NOT NULL AND receive_date < ?)',
$kara_mail_id = $objQuery->get('kara_mail_id', 'dtb_mobile_kara_mail', 'token = ?', array($token));
if (!isset ($kara_mail_id)) {
$arrValues = array('email' => $email);
$arrRawValues = array('receive_date' => 'CURRENT_TIMESTAMP');
$objQuery->update('dtb_mobile_kara_mail', $arrValues, 'kara_mail_id = ?', array($kara_mail_id), $arrRawValues);
* 空メール管理テーブルからトークンが一致する行を削除し、
* メールアドレスは $_SESSION['mobile']['kara_mail_from'] に登録される。
* @param string $token トークン
* @return string|falseURLを返す。エラーが発生した場合はfalseを返す。
$objQuery = new SC_Query_Ex();
$arrRow = $objQuery->getRow(
'session_id, next_url, email'
,'token = ? AND email IS NOT NULL AND receive_date >= ?'
,array($token, date('Y-m-d H:i:s', time() - MOBILE_SESSION_LIFETIME))
$objQuery->delete('dtb_mobile_kara_mail', 'token = ?', array($token));
list ($session_id, $next_url, $email) = $arrRow;
$objURL = new Net_URL(HTTP_URL . $next_url);
$url = $objURL->getURL();
$_SESSION['mobile']['kara_mail_from'] = $email;
* 外部サイト連携用にセッションIDとパラメーターの組み合わせを保存する。
* @param string $param_key パラメーター名
* @param string $param_value パラメーター値
$objQuery = new SC_Query_Ex();
$time = date('Y-m-d H:i:s', time() - MOBILE_SESSION_LIFETIME);
$objQuery->delete('dtb_mobile_ext_session_id', 'create_date < ?', array($time));
'param_key' => $param_key,
'param_value' => $param_value,
$objQuery->insert('dtb_mobile_ext_session_id', $arrValues);
* メールアドレスが携帯のものかどうかを判別する。
* @param string $address メールアドレス
* @return boolean 携帯のメールアドレスの場合はtrue、それ以外の場合はfalseを返す。
$masterData = new SC_DB_MasterData_Ex();
$arrMobileMailDomains = $masterData->getMasterData("mtb_mobile_domain");
foreach ($arrMobileMailDomains as $domain) {
if (preg_match("/@([^@]+\\.)?$domain\$/", $address)) {
Documentation generated on Fri, 24 Feb 2012 14:02:45 +0900 by Seasoft
|