用ThinkPHP3.2.2框架作手機和PC端瀏覽器的切換

ThinkPHP搭建手機版網站:

http://www.php100.com/html/php/lei/2013/0904/1699.html
javascript

這篇文章(確定不是基3.2.2講的)是在框架入口經過判斷手機仍是PC訪問來決定app的路徑,這樣,我手機web和pc就不能共用MVC三層了。php

-----------------------------------------------------------------------------------------------------------------css

如下是在ThinkPHP官網找到的,也是網友提供的解決方案,有兩種

方法一

1、TP3.2將 ismobile() 加入到{/Application/Common/function.php},TP3.1加入到{項目/Common/common.phphtml

function ismobile() {
    // 若是有HTTP_X_WAP_PROFILE則必定是移動設備
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
        return true;
    
    //此條摘自TPM智能切換模板引擎,適合TPM開發
    if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
        return true;
    //若是via信息含有wap則必定是移動設備,部分服務商會屏蔽該信息
    if (isset ($_SERVER['HTTP_VIA']))
        //找不到爲flase,不然爲true
        return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
    //判斷手機發送的客戶端標誌,兼容性有待提升
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
        );
        //從HTTP_USER_AGENT中查找手機瀏覽器的關鍵字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    //協議法,由於有可能不許確,放到最後判斷
    if (isset ($_SERVER['HTTP_ACCEPT'])) {
        // 若是隻支持wml而且不支持html那必定是移動設備
        // 若是支持wml和html可是wml在html以前則是移動設備
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
 }

2、TP3.2在{Application/Common/Controller/FrontendController.class.php},加入以下代碼(ps:FrontendController是個人前端控制器,BaseController是個人基本控制器)前端

class FrontendController extends BaseController {
	Public function _initialize(){
        //移動設備瀏覽,則切換模板
        if (ismobile()) {
            //設置默認默認主題爲 Mobile
            C('DEFAULT_THEME','Mobile');
        }
        //............你的更多代碼.......
    }
}

TP3.1在{項目/Lib/CommonAction.php},或者在你的公共控制器中加入以下代碼java

Class CommonAction extends Action{
    Public function _initialize(){
        //移動設備瀏覽,則切換模板
        if (ismobile()) {
            //設置默認默認主題爲 Mobile
            C('DEFAULT_THEME','Mobile');
        }
        //............你的更多代碼.......
    }
 }

3、其它控制器都繼承 FrontendController(TP3.2)或者CommonAction(TP3.1)
這裏若是沒有其它特別的模板配置,在Application/Home/View文件夾裏新建Mobile文件夾,放入寫好的移動版 index.html文件,設置Chrome瀏覽器爲手機UA,打開首頁,此時就會自動顯示手機版主頁模板。:)android

方法二

經過js判斷,跳轉到手機版域名。web

<script type="text/javascript">
(function(a,b){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))window.location=b})(navigator.userAgent||navigator.vendor||window.opera,'http://填寫你的wap網址');
</script>



最後個人方案

個人方案極具破壞性將會影響從此的框架升級,大體就是把上述中ismobile方法加入/ThinkPHP/Common/functions.php 中,而後在/ThinkPHP/Library/View.class.php的167用上ismobile這個方法進行判斷,是手機的在view的路徑上加一個前綴「m_」(view中一個內容放兩個,具體如:index和m_index)windows

其實我只是沒想好該怎麼新增一個類,以及放在哪裏...api

補充(個人最終方案)

今天有點心不甘因而從新寫了一套方案,把ThinkPHP3.2.2的幫助文檔關於目構結構再看了一遍,因而想出了一套沒有對原框架破壞的方案;好處就是之後框架升級沒什麼影響.ps:如果下版框架做很duo的改動那就沒辦法了。

1.目錄結構以下:

個人要求是:以上兩個view是公用model和controller的;

2.在Application/Home/Common/目錄下新建一個function.php的文件,代碼以下:

<?php

function ismobile() {
    // 若是有HTTP_X_WAP_PROFILE則必定是移動設備
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
        return true;
    
    //此條摘自TPM智能切換模板引擎,適合TPM開發
    if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
        return true;
    //若是via信息含有wap則必定是移動設備,部分服務商會屏蔽該信息
    if (isset ($_SERVER['HTTP_VIA']))
        //找不到爲flase,不然爲true
        return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
    //判斷手機發送的客戶端標誌,兼容性有待提升
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
        );
        //從HTTP_USER_AGENT中查找手機瀏覽器的關鍵字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    //協議法,由於有可能不許確,放到最後判斷
    if (isset ($_SERVER['HTTP_ACCEPT'])) {
        // 若是隻支持wml而且不支持html那必定是移動設備
        // 若是支持wml和html可是wml在html以前則是移動設備
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
}

?>

3控制器的處理,我是新建一個控制器類(Application/Home/Controller/HomeController.class.php)讓它繼承Think\Controller下的Controller公共類,而後讓全部的控制去繼承我這個新建的控制器

HomeController.class.php負責對手機仍是PC進行判斷,代碼以下:

<?php
namespace Home\Controller;
use Think\Controller;
class HomeController extends Controller {
    public function _initialize(){
        if (ismobile()) {
            //設置默認默認主題爲 Mobile
            C('DEFAULT_V_LAYER','Mobile');
        }
    }
}

而後就是像個人index控制器(IndexController.class.php)代碼以下:

<?php
namespace Home\Controller;

class IndexController extends HomeController {
    public function index(){
        $this->display();
    }
}

okay,it's over.

相關文章
相關標籤/搜索