1.thinkphp在入口文件先判断是手机还是pc端访问网站
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用入口文件
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
//判断是手机登录还是电脑登录
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;
}
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
if(ismobile()){
//定义title的公众部分
header("Location: http://m.enkiorder.com/");
exit;
// 定义应用目录
//define('APP_PATH','./Mobile/');
}else
{
// 定义应用目录
define('APP_PATH','./Application/');
}
define('IMAGE_PATH',dirname(__FILE__));
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
2.移动端和pc端网站共存方案
有时候你的网站在手机端访问流量会比较大,用户体验太差,而开发一个Android APP 或者适用于苹果的APP又比较困难,这时候你可以选择手机移动端网站与Pc端共存的方式。但要解决的问题一、是如何判定用户使用的是移动设备还是Pc设备,这一点网上已经有很多源码;问题二、如何在Thinkphp中根据对用户端的判定来调用不同的页面。下面根据我的实战给出一个方案。
对于问题二有一些网友提出来在Thinkphp中使用自动切换模板的方式来解决,先在common.php中加入一个函数isMobile()来判定何种客户端,这个函数有不同的版本,只要正确判定都行。
function isMobile()
{
$useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
$useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:'';
function CheckSubstrs($substrs,$text)
{
foreach($substrs as $substr)
if(false!==strpos($text,$substr))
{ return true; }
return false;
}
$mobile_os_list=array('Google Wireless Transcoder','Windows CE','WindowsCE','Symbian','Android','armv6l','armv5','Mobile', 'CentOS', 'mowser', 'AvantGo','Opera Mobi', 'J2ME/MIDP','Smartphone','Go.Web','Palm','iPAQ');
$mobile_token_list=array('Profile/MIDP','Configuration/CLDC-','160×160','176×220','240×240','240×320','320×240','UP.Browser', 'UP.Link', 'SymbianOS', 'PalmOS','PocketPC','SonyEricsson','Nokia', 'BlackBerry', 'Vodafone', 'BenQ','Novarra-Vision','Iris','NetFront','HTC_','Xda_','SAMSUNG-SGH','Wapaka','DoCoMo','iPhone','iPod');
$found_mobile=CheckSubstrs($mobile_os_list,$useragent_commentsblock) || CheckSubstrs($mobile_token_list,$useragent);
if ($found_mobile)
{ return true; }
else
{ return false; }
}
在{项目/Lib/}创建一个 CommonAction.php,如果你的项目已公共控制器,则无需创建,直接加在里面即可
Class CommonAction extends Action{
Public function _initialize(){
//移动设备浏览,则切换模板
if (ismobile()) {
C('DEFAULT_THEME','Mobile');
}
//............
}
}
这种方案本人在测试的时候出现了一个问题,项目/Lib/目录下的CommonAction,无法被/Action目录下的控制器继承,第二个问题,是虽然默认模板变量修改了但是,模板并没有自动切换。
第二种思路,通过isMobile()函数判定后自动切换不同的项目,可通过index.php入口文件来控制。
在index.php中加入isMobile() 函数,然后使用下面代码来控制进入不同的项目,
if(isMobile())
{
define('APP_NAME','Mobile');
define('APP_PATH','./Mobile/');
}
else
{
define('APP_NAME','Home');
define('APP_PATH','./Home/');
}
这种方案的好处就是,两个项目相对独立,可以根据各自的需要开发,不足之处就是开发的任务过多了,重用性较差