thinkphp wap web 同时开发

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/');
    }

这种方案的好处就是,两个项目相对独立,可以根据各自的需要开发,不足之处就是开发的任务过多了,重用性较差

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值