Helper
[ class tree: Helper ] [ index: Helper ] [ all elements ]

Source for file SC_Helper_Mobile.php

Documentation is available at SC_Helper_Mobile.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. // {{{ requires
  25. require_once CLASS_REALDIR '../module/Net/URL.php';
  26. require_once CLASS_REALDIR 'SC_Query.php';
  27.  
  28. /**
  29.  * モバイルのヘルパークラス.
  30.  *
  31.  * @package Helper
  32.  * @author LOCKON CO.,LTD.
  33.  * @version $Id: SC_Helper_Mobile.php 21185 2011-08-11 10:37:10Z shutta $
  34.  */
  35.  
  36.     /**
  37.      * EC-CUBE がサポートする携帯端末かどうかをチェックする。
  38.      * 非対応端末の場合は /unsupported/ へリダイレクトする。
  39.      *
  40.      * @return void 
  41.      */
  42.     function lfMobileCheckCompatibility({
  43.         if (!SC_MobileUserAgent_Ex::isSupported()) {
  44.             header('Location: ' ROOT_URLPATH 'unsupported/' DIR_INDEX_PATH);
  45.             exit;
  46.         }
  47.     }
  48.  
  49.     /**
  50.      * 入力データを内部エンコーディングに変換し、絵文字を除去する。
  51.      *
  52.      * @param string &$value 入力データへの参照
  53.      * @return void 
  54.      */
  55.     function lfMobileConvertInputValue(&$value{
  56.         if (is_array($value)) {
  57.             foreach($value as $key => $val ){
  58.                 $this->lfMobileConvertInputValue($value[$key]);
  59.             }
  60.         else {
  61.             // Shift JIS から内部エンコーディングに変換する。
  62.             $value mb_convert_encoding($valueCHAR_CODE'SJIS');
  63.             // SoftBank? 以外の絵文字は外字領域に含まれるため、この段階で除去される。
  64.             // SoftBank? の絵文字を除去する。
  65.             $value preg_replace('/\\x1b\\$[^\\x0f]*\\x0f/'''$value);
  66.         }
  67.     }
  68.  
  69.     /**
  70.      * モバイルサイト用の入力の初期処理を行う。
  71.      *
  72.      * @return void 
  73.      */
  74.     function lfMobileInitInput({
  75.         array_walk($_GETarray($this'lfMobileConvertInputValue'));
  76.         array_walk($_POSTarray($this'lfMobileConvertInputValue'));
  77.         array_walk($_REQUESTarray($this'lfMobileConvertInputValue'));
  78.     }
  79.  
  80.     /**
  81.      * dtb_mobile_ext_session_id テーブルを検索してセッションIDを取得する。
  82.      *
  83.      * @return string|null取得したセッションIDを返す。
  84.      *                      取得できなかった場合は null を返す。
  85.      */
  86.     function lfMobileGetExtSessionId({
  87.         if (!preg_match('|^' ROOT_URLPATH '(.*)$|'$_SERVER['SCRIPT_NAME']$matches)) {
  88.             return null;
  89.         }
  90.  
  91.         $url $matches[1];
  92.         $time date('Y-m-d H:i:s'time(MOBILE_SESSION_LIFETIME);
  93.         $objQuery new SC_Query_Ex();
  94.  
  95.         foreach ($_REQUEST as $key => $value{
  96.             $session_id $objQuery->get('session_id''dtb_mobile_ext_session_id',
  97.                                          'param_key = ? AND param_value = ? AND url = ? AND create_date >= ?',
  98.                                          array($key$value$url$time));
  99.             if (isset($session_id)) {
  100.                 return $session_id;
  101.             }
  102.         }
  103.  
  104.         return null;
  105.     }
  106.  
  107.     /**
  108.      * パラメーターから有効なセッションIDを取得する。
  109.      *
  110.      * @return string|false取得した有効なセッションIDを返す。
  111.      *                       取得できなかった場合は false を返す。
  112.      */
  113.     function lfMobileGetSessionId({
  114.         // パラメーターからセッションIDを取得する。
  115.         $sessionId @$_POST[session_name()];
  116.         if (!isset($sessionId)) {
  117.             $sessionId @$_GET[session_name()];
  118.         }
  119.         if (!isset($sessionId)) {
  120.             $sessionId $this->lfMobileGetExtSessionId();
  121.         }
  122.         if (!isset($sessionId)) {
  123.             return false;
  124.         }
  125.  
  126.         // セッションIDの存在をチェックする。
  127.         $objSession new SC_Helper_Session_Ex();
  128.         if ($objSession->sfSessRead($sessionId=== null{
  129.             GC_Utils_Ex::gfPrintLog("Non-existent session id : sid=$sessionId");
  130.             return false;
  131.         }
  132.         return session_id($sessionId);
  133.     }
  134.  
  135.     /**
  136.      * セッションデータが有効かどうかをチェックする。
  137.      *
  138.      * FIXME "@" でエラーを抑制するのは良くない
  139.      *
  140.      * @return boolean セッションデータが有効な場合は true、無効な場合は false を返す。
  141.      */
  142.     function lfMobileValidateSession({
  143.         // 配列 mobile が登録されているかどうかをチェックする。
  144.         if (!is_array(@$_SESSION['mobile'])) {
  145.             return false;
  146.         }
  147.  
  148.         // 有効期限を過ぎていないかどうかをチェックする。
  149.         if (intval(@$_SESSION['mobile']['expires']time()) {
  150.             GC_Utils_Ex::gfPrintLog("Session expired at " .
  151.                        date('Y/m/d H:i:s'@$_SESSION['mobile']['expires'].
  152.                        ' : sid=' session_id());
  153.  
  154.             return false;
  155.         }
  156.  
  157.         // 携帯端末の機種が一致するかどうかをチェックする。
  158.         $model SC_MobileUserAgent_Ex::getModel();
  159.         if (@$_SESSION['mobile']['model'!= $model{
  160.             GC_Utils_Ex::gfPrintLog("User agent model mismatch : " .
  161.                        "\"$model\" != \"@$_SESSION['mobile']['model'.
  162.                        '" (expected), sid=' session_id());
  163.             return false;
  164.         }
  165.  
  166.         return true;
  167.     }
  168.  
  169.     /**
  170.      * モバイルサイト用のセッション関連の初期処理を行う。
  171.      *
  172.      * @return void 
  173.      */
  174.     function lfMobileInitSession({
  175.         // セッションIDの受け渡しにクッキーを使用しない。
  176.         ini_set('session.use_cookies''0');
  177.         ini_set('session.use_only_cookies''0');
  178.  
  179.         // パラメーターから有効なセッションIDを取得する。
  180.         $sessionId $this->lfMobileGetSessionId();
  181.  
  182.         session_start();
  183.  
  184.         // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成
  185.         // し、セッションデータを初期化する。
  186.         if ($sessionId === false || !$this->lfMobileValidateSession()) {
  187.             session_regenerate_id();
  188.             $_SESSION array('mobile' => array('model'    => SC_MobileUserAgent_Ex::getModel(),
  189.                                                 'phone_id' => SC_MobileUserAgent_Ex::getId(),
  190.                                                 'expires'  => time(MOBILE_SESSION_LIFETIME));
  191.  
  192.             // 新しいセッションIDを付加してリダイレクトする。
  193.             if ($_SERVER['REQUEST_METHOD'== 'GET'{
  194.                 // GET の場合は同じページにリダイレクトする。
  195.                 header('Location: ' $this->gfAddSessionId());
  196.             else {
  197.                 // GET 以外の場合はトップページへリダイレクトする。
  198.                 header('Location: ' TOP_URLPATH '?' SID);
  199.             }
  200.             exit;
  201.         }
  202.  
  203.         // 携帯端末IDを取得できた場合はセッションデータに保存する。
  204.         $phoneId SC_MobileUserAgent_Ex::getId();
  205.         if ($phoneId !== false{
  206.             $_SESSION['mobile']['phone_id'$phoneId;
  207.         }
  208.  
  209.         // セッションの有効期限を更新する。
  210.         $_SESSION['mobile']['expires'time(MOBILE_SESSION_LIFETIME;
  211.     }
  212.  
  213.     /**
  214.      * モバイルサイト用の出力の初期処理を行う。
  215.      *
  216.      * 出力の流れ
  217.      * 1. Smarty
  218.      * 2. 内部エンコーディングから Shift JIS に変換する。
  219.      * 3. 全角カタカナを半角カタカナに変換する。
  220.      * 4. 画像用のタグを調整する。
  221.      * 5. 絵文字タグを絵文字コードに変換する。
  222.      * 6. 出力
  223.      *
  224.      * @return void 
  225.      */
  226.     function lfMobileInitOutput({
  227.         // Smarty 用のディレクトリーを作成する。
  228.         @mkdir(COMPILE_REALDIR);
  229.  
  230.         // 出力用のエンコーディングを Shift JIS に固定する。
  231.         mb_http_output('SJIS-win');
  232.  
  233.         // 絵文字タグを絵文字コードに変換する。
  234.         ob_start(array('SC_MobileEmoji_Ex''handler'));
  235.  
  236.         // 端末に合わせて画像サイズを変換する。
  237.         ob_start(array('SC_MobileImage_Ex''handler'));
  238.  
  239.         // 全角カタカナを半角カタカナに変換する。
  240.         ob_start(create_function('$buffer''return mb_convert_kana($buffer, "k", "SJIS-win");'));
  241.  
  242.         // 内部エンコーディングから Shift JIS に変換する。
  243.         ob_start('mb_output_handler');
  244.     }
  245.  
  246.     /**
  247.      * モバイルサイト用の初期処理を行う。
  248.      *
  249.      * @return void 
  250.      */
  251.     function sfMobileInit({
  252.         $this->lfMobileInitInput();
  253.  
  254.         if (basename(dirname($_SERVER['SCRIPT_NAME'])) != 'unsupported'{
  255.             $this->lfMobileCheckCompatibility();
  256.             /**
  257.              * 共有SSL対応のため、SC_SessionFactory_UseRequest::initSession()へ移行
  258.              * また、他のセッション関連メソッドもSC_SessionFactory_UseRequestのインスタンスから呼び出すこと
  259.              *
  260.              * @see data/class/session/sessionfactory/SC_SessionFactory_UseRequest.php
  261.              */
  262.             // $this->lfMobileInitSession();
  263.         }
  264.  
  265.         $this->lfMobileInitOutput();
  266.     }
  267.  
  268.     /**
  269.      * Location等でセッションIDを付加する必要があるURLにセッションIDを付加する。
  270.      *
  271.      * @return String 
  272.      */
  273.     function gfAddSessionId($url null{
  274.         $objURL new Net_URL($url);
  275.         $objURL->addQueryString(session_name()session_id());
  276.         return $objURL->getURL();
  277.     }
  278.  
  279.     /**
  280.      * セッション ID を付加した配列を返す.
  281.      *
  282.      * @param array $array 元となる配列
  283.      * @param array セッション ID を追加した配列
  284.      */
  285.     function sessionIdArray($array array()) {
  286.         return array_merge($arrayarray(session_name(=> session_id()));
  287.     }
  288.  
  289.     /**
  290.      * 空メール用のトークンを生成する。
  291.      *
  292.      * @return string 生成したトークンを返す。
  293.      */
  294.     function lfGenerateKaraMailToken({
  295.         $token_chars '0123456789abcdefghijklmnopqrstuvwxyz';
  296.         $token_chars_length strlen($token_chars);
  297.         $token_length 10;
  298.         $token '';
  299.  
  300.         while ($token_length 0{
  301.             $token .= $token_chars{mt_rand(0$token_chars_length 1)};
  302.             --$token_length;
  303.         }
  304.  
  305.         return $token;
  306.     }
  307.  
  308.     /**
  309.      * 空メール管理テーブルに新規エントリーを登録し、トークンを返す。
  310.      *
  311.      * @param string $next_url 空メール受け付け後に遷移させるページ (モバイルサイトトップからの相対URL)
  312.      * @param string $session_id セッションID (省略した場合は現在のセッションID)
  313.      * @return string|falseトークンを返す。エラーが発生した場合はfalseを返す。
  314.      */
  315.     function gfPrepareKaraMail($next_url$session_id null{
  316.         if (!isset($session_id)) {
  317.             $session_id session_id();
  318.         }
  319.  
  320.         $objQuery new SC_Query_Ex();
  321.  
  322.         // GC
  323.         $time date('Y-m-d H:i:s'time(MOBILE_SESSION_LIFETIME);
  324.         $objQuery->delete('dtb_mobile_kara_mail''email IS NULL AND create_date < ?'array($time));
  325.  
  326.         $objQuery->delete('dtb_mobile_kara_mail''session_id = ?'array($session_id));
  327.  
  328.         $arrValues array('session_id' => $session_id,
  329.                            'next_url'   => $next_url);
  330.  
  331.         $try 10;
  332.  
  333.         while ($try 0{
  334.             $arrValues['token'$token $this->lfGenerateKaraMailToken();
  335.  
  336.             $arrValues['kara_mail_id'$objQuery->nextVal('dtb_mobile_kara_mail_kara_mail_id');
  337.             $objQuery->insert('dtb_mobile_kara_mail'$arrValues);
  338.             $count $objQuery->count('dtb_mobile_kara_mail''token = ?'array($token));
  339.  
  340.             if ($count == 1{
  341.                 break;
  342.             }
  343.  
  344.             $objQuery->delete('dtb_mobile_kara_mail''session_id = ?'array($session_id));
  345.             $token false;
  346.             --$try;
  347.         }
  348.  
  349.         return $token;
  350.     }
  351.  
  352.     /**
  353.      * 空メールから取得したメールアドレスを空メール管理テーブルに登録する。
  354.      *
  355.      * @param string $token トークン
  356.      * @param string $email メールアドレス
  357.      * @return boolean 成功した場合はtrue、失敗した場合はfalseを返す。
  358.      */
  359.     function gfRegisterKaraMail($token$email{
  360.         $objQuery new SC_Query_Ex();
  361.  
  362.         // GC
  363.         $time date('Y-m-d H:i:s'time(MOBILE_SESSION_LIFETIME);
  364.         $objQuery->delete('dtb_mobile_kara_mail',
  365.                           '(email IS NULL AND create_date < ?) OR (email IS NOT NULL AND receive_date < ?)',
  366.                           array($time$time));
  367.  
  368.         $kara_mail_id $objQuery->get('kara_mail_id''dtb_mobile_kara_mail''token = ?'array($token));
  369.         if (!isset($kara_mail_id)) {
  370.             return false;
  371.         }
  372.  
  373.         $arrValues array('email' => $email);
  374.         $arrRawValues array('receive_date' => 'CURRENT_TIMESTAMP');
  375.         $objQuery->update('dtb_mobile_kara_mail'$arrValues'kara_mail_id = ?'array($kara_mail_id)$arrRawValues);
  376.  
  377.         return true;
  378.     }
  379.  
  380.     /**
  381.      * 空メール管理テーブルからトークンが一致する行を削除し、
  382.      * 次に遷移させるページのURLを返す。 
  383.      *
  384.      * メールアドレスは $_SESSION['mobile']['kara_mail_from'] に登録される。
  385.      *
  386.      * @param string $token トークン
  387.      * @return string|falseURLを返す。エラーが発生した場合はfalseを返す。
  388.      */
  389.     function gfFinishKaraMail($token{
  390.         $objQuery new SC_Query_Ex();
  391.  
  392.         $arrRow $objQuery->getRow(
  393.              'session_id, next_url, email'
  394.             ,'dtb_mobile_kara_mail'
  395.             ,'token = ? AND email IS NOT NULL AND receive_date >= ?'
  396.             ,array($tokendate('Y-m-d H:i:s'time(MOBILE_SESSION_LIFETIME))
  397.             ,DB_FETCHMODE_ORDERED
  398.         );
  399.  
  400.         if (!isset($arrRow)) {
  401.             return false;
  402.         }
  403.  
  404.         $objQuery->delete('dtb_mobile_kara_mail''token = ?'array($token));
  405.  
  406.         list($session_id$next_url$email$arrRow;
  407.         $objURL new Net_URL(HTTP_URL $next_url);
  408.         $objURL->addQueryString(session_name()$session_id);
  409.         $url $objURL->getURL();
  410.  
  411.         session_id($session_id);
  412.         session_start();
  413.         $_SESSION['mobile']['kara_mail_from'$email;
  414.         session_write_close();
  415.  
  416.         return $url;
  417.     }
  418.  
  419.     /**
  420.      * 外部サイト連携用にセッションIDとパラメーターの組み合わせを保存する。
  421.      *
  422.      * @param string $param_key パラメーター名
  423.      * @param string $param_value パラメーター値
  424.      * @param string $url URL
  425.      * @return void 
  426.      */
  427.     function sfMobileSetExtSessionId($param_key$param_value$url{
  428.         $objQuery new SC_Query_Ex();
  429.  
  430.         // GC
  431.         $time date('Y-m-d H:i:s'time(MOBILE_SESSION_LIFETIME);
  432.         $objQuery->delete('dtb_mobile_ext_session_id''create_date < ?'array($time));
  433.  
  434.         $arrValues array('session_id'  => session_id(),
  435.                            'param_key'   => $param_key,
  436.                            'param_value' => $param_value,
  437.                            'url'         => $url);
  438.  
  439.         $objQuery->insert('dtb_mobile_ext_session_id'$arrValues);
  440.     }
  441.  
  442.     /**
  443.      * メールアドレスが携帯のものかどうかを判別する。
  444.      *
  445.      * @param string $address メールアドレス
  446.      * @return boolean 携帯のメールアドレスの場合はtrue、それ以外の場合はfalseを返す。
  447.      */
  448.     function gfIsMobileMailAddress($address{
  449.         $masterData new SC_DB_MasterData_Ex();
  450.         $arrMobileMailDomains $masterData->getMasterData("mtb_mobile_domain");
  451.  
  452.         foreach ($arrMobileMailDomains as $domain{
  453.             $domain preg_quote($domain'/');
  454.             if (preg_match("/@([^@]+\\.)?$domain\$/"$address)) {
  455.                 return true;
  456.             }
  457.         }
  458.  
  459.         return false;
  460.     }
  461. }
  462. ?>

Documentation generated on Fri, 24 Feb 2012 14:02:45 +0900 by Seasoft