热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TPM(ThinkPHPMobile)使用简明教程

TPM还有很多特性,它不仅能和ThinkPHP结合,也可以结合自己已有的接口。还有一些附件插件帮助我们实现一些常用功能

一、基础知识


1 手机APP的类型

移动端的应用有这几种:WebApp,NativeApp,HybridApp。 
WebApp 就是手机网站,需要用手机浏览器访问。
NativeApp是用原生语言开发,用户需要下载安装的手机应用。 NativeApp的开发成本很高,每个平台的开发语言都不一样, 比如IOS的开发语言是object C , Android系统的APP需要用Java开发, WindowsPhone 则需要用 C# 开发。那么我们如果需要做一个多平台都能运行的APP,需要用多种语言重复开发多次。 
相对于NativeApp来说, WebApp开发就简单多了, 用html,css,js就可开发WebApp, 而且开发一次跨多个平台。但是WebApp 需要用户打开手机浏览器输入网址才能访问,而且不能像NativeApp 能调用手机的摄像头,通讯录等功能。WebApp的html,css,js图片等静态资源在服务器上,用户需要下载,会消耗用户更多的流量。 而NativeApp的静态资源在手机本地。
HybridApp中和了NativeApp和WebApp各自的优势。 我们可以用html,css,js 开发,兼容多个平台。用户也要下载安装,并能调用手机的摄像头、通讯录等功能, HybridApp的静态资源也在手机本地。
我们知道ThinkPHP的模板也是用HTML,CSS,JS 开发的。所以我们想能否将ThinkPHP的模板直接打包成手机APP?让我们能一次开放同时拥有电脑版网站,手机版网站和手机APP, 因此才有了TPM的诞生。TPM能让我们将ThinkPHP的模板打包成一个HybridApp。

2 手机APP的一般架构

很多手机APP的数据都是动态获取的,我们需要给APP提供接口,让APP请求接口获取数据。 不管你是开发NavtiveApp 还是 HybridApp, 都需要给APP提供接口。 
传统的HybridApp 开发方式任然需要我们为APP开发一个接口程序, 我们还要用js写调用接口的ajax的代码。
如果使用TPM开发,不用特意写接口程序,也不用写ajax调用接口的程序 。 我们还是按照开发网站的方式开发手机客户端,在Action中指派模板变量, 在模板中使用模板变量。 当我们将模板打包成APP时,APP能自动请求Action,然后渲染对应的模板,这时候请求Action时,Action会自动返回json格式数据。

3 其他手机开发的知识

我们要开发好手机APP,还需要了解更多手机开发的知识。 手机的尺寸大小不一样,所有我们的界面一般不能写成固定尺寸的, 要做响应式设计。 建议大家了解一下响应式设计的知识。 也可以结合一些UI框架,如bootstrap、purecss 他们自带对响应式的支持。 
建议大家再阅读一下《移动端webapp开发必备知识》 
http://www.qianduan.net/mobile-webapp-develop-essential-knowledge.html 

二、环境搭建

首先你需要建立一个包含TPM的ThinkPHP项目。 你可以在ThinkPHP官方网站上下载TPM, 也可以中github中获得。 Github的地址是: 
https://github.com/liu21st/extend/tree/master/Extend/Tool/TPM
将下载的文件中, Tpl目录下的文件复制到你的项目文件夹下Tpl目录中。将SwitchMobileTplBehavior.class.php 复制到 项目目录下 Lib/Behavior 目录下,将TemplateMobile.class.php 文件复制到 ThinkPHP/Extend/Driver/Template 下。

项目需要开启layout , 在项目配置文件中配置:

'LAYOUT_ON'=>true

在项目的Conf文件夹下建立tags.php ,代码为:

return array( 
 'action_begin'=>array('SwitchMobileTpl')
 )
如果想手机客户端支持页面跳转,需要修改核心文件 ThinkPHP/Common/functions.php 中得redirect函数,修改为:

function redirect($url, $time=0, $msg='') {
    //多行URL地址支持
    $url        = str_replace(array("\n", "\r"), '', $url);
    if (empty($msg))
        $msg    = "系统将在{$time}秒之后自动跳转到{$url}!";
    if (!headers_sent()) {
        // redirect
        if (0 === $time) {
           //手机客户端跳转发送redirect的header
            if(defined('IS_CLIENT') && IS_CLIENT){
                if(''!==__APP__){
                    $url=substr($url,strlen(__APP__));
                }
                header('redirect:'.$url);
            }else{
                header('Location: ' . $url);
            }
        } else {
            header("refresh:{$time};url={$url}");
            echo($msg);
        }
        exit();
    } else {
        $str    = "";
        if ($time != 0)
            $str .= $msg;
        exit($str);
    }
}

编辑器打开Tpl/index.html文件,修改代码

TPM.run("http://yourappurl"); 

,将网址修改为你项目的真实访问地址。
然后,我们可将模板目录打包成手机APP 。 
首先打开你的命令行, cd 到模板目录, 运行命令:

php  build.php  

然后我们发现在模板目录会生成手机APP文件, 我们在手机上面安装即可。 
命令行打包程序需要你的环境开启zip和curl扩展,如果不清楚的话请自行百度解决。
注意:打包命令需要联网,如果没有联网的话 可以用第三方打包工具例如phonegap打包。

打包命令还可以跟更多参数:
php build.php
参数说明:
platform :输入android或ios, 默认为android,现在还不支持IOS打包,大家敬请期待。 
name :应用名称, 默认为TPM 。
package: 应用的包名,如:com.think.yourname ,一般为一个域名的倒序。 默认为 cn.thinkphp.tpm
version: 应用版本, 默认为1.0

三 使用说明


1 运行原理

之前我们在部署项目的时候发现ThinkPHP开启了layout,其实浏览器浏览网站时使用的layout文件是Tpl/layout.html, 而打包成手机APP后,layout文件其实是 Tpl/index.html , 我们用编辑器打开 Tpl/index.html文件, 发现里面多加载了一个js文件:TPM.js 。 在手机APP上运行时,TPM.js文件负责解析ThinkPHP模板标签和自动请求接口。 
Tpl/index.html 中需要有这两个层:


正在加载中...


TPM会把每次渲染模板的结果放到ID为main的层中。 class为ajax_wait的层 是在请求接口的时候会显示,我们可以在css文件中定义ajax_wait的样式。

2 模板标签

我们知道在手机APP中并没用PHP运行环境,解析ThinkPHP模板标签的是js,ThinkPHP的大部分模板标签都可以正常使用,但也有一些限制,比如模板标签中不能用PHP的函数,所以也不能在模板中使用U函数。
支持的ThinkPHP模板标签有: volist,foreach,for,empty,notempty,present,notpresent,eq,neq,heq,nheq,egt,gt,elt,lt,if,elseif,else,switch,case,default,in,notin,between,notbetween,include。

include标签在使用时有点限制,file属性必须写明控制器和方法,不能省略控制器。 如

不能省略Action。如果有分组也不能省略分组。 其他标签的用法不变。

TPM未实现的标签有: defined,define等

TPM未实现 __URL__,__PUBLIC__,__ROOT__,__SELF__ 等模板替换变量。

大家需要在模板中写固定的URL , 以斜杠开头。URL地址格式为: /Action/method 

3 独立手机APP的模板

我们如果希望网站模板和手机APP模板分离,可以定义项目配置:

'TPM_THEME'=>'mobile'

然后在Tpl目录下建立一个mobile文件夹。 在mobile文件夹中放置手机APP的模板。 这样如果是浏览器浏览网站首页,程序渲染的模板是Tpl/Index/index.html, 如果是手机APP打开,渲染的首页模板是 Tpl/mobile/Index/index.html .

4 配置说明

Tpl/index.html文件中需要加载TPM.js以及运行TPM , 运行TPM的代码是:

TPM.run(config)

TPM.run传递的config参数是配置项。 以对象形式传递。 可以设置的主要配置有: 
api_base: 项目入口文件地址, http开头。
api_index: 首次请求的控制器方法,默认为/Index/index
下面举例说明一下这些配置项。 
假设我们创建了一个项目, 入口文件的浏览地址是 http://www.xxx.com/index.php , 我们想手机APP打开的第一个页面不是首页,而是登陆页,登陆页的浏览地址假设是: 
http://www.xxx.com/index.php/Index/login

那么TPM.run的传参如下:

TPM.run({
    api_base:'http://www.xxx.com/index.php',
    api_index:'/Index/login'
});
如果你的项目做了隐藏入口文件的处理,那么api_base也可以不写入口文件,配置为:

TPM.run({
    api_base:'http://www.xxx.com',//注意,末尾不带斜杠
    api_index:'/Index/login'
});
如果只想配置api_base这个参数,其他参数使用默认值,只传递一个网址作为参数:

TPM.run('http://www.xxx.com')

5 元素监听

我们做一些js效果,往往会监听元素事件,比如:


$(document).ready(function(){
    $('#id').click(function(){
    alert('click');
});
});

这段代码监听一个元素的点击事件,但在TPM中这样监听可能会失效, 因为这种监听方式不能监听到新生的元素, 而TPM 的界面都是 请求接口渲染模板后新生的, 新生的内容会放在Tpl/index.html 文件中main层中。在TPM中要对这种新生的元素进行事件监听,可以使用TPM.ready,用法如下:


TPM.ready(function($){
$('#id').click(function(){
    alert('click');
});
});
TPM还有很多特性,它不仅能和ThinkPHP结合, 也可以结合自己已有的接口。还有一些附件插件帮助我们实现一些常用功能。 其他高级的用法我们会陆续发布使用文档,大家敬请期待。
TPM首次发布,可能有诸多不足的地方,希望大家能予以谅解。多为我们提供宝贵建议, 我们会不断努力,继续完善好TPM 。 让我们和广大TPer一起推开移动互联网的大门。



推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
author-avatar
多米音乐_34026248
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有