实现手机网站发帖回帖之后,显示该帖子对应的手机类型图标

虽然Discuz可以通过二次开发手机模板文件,来实现一个手机网站.  但是在手机网站上发帖或者回帖之后,缺少了一个显示该帖子对应的手机类型(android,iphone,wp…)。不过Discuz内置的确确实实有这个功能,但是不是针对于手机网站,而是Discuz提供的手机客户端(掌上论坛)。

所以只能自己看代码,重新给手机网站添加该功能。

帖子列表页

20140930050310
帖子详细页
20140930050331

实现步骤如下:

1.  帖子列表页显示手机标记是根据forum_thread表的status字段。

2.  帖子详细页显示手机标记是根据forum_post表的status字段

1) 发帖功能

首先是针对于帖子列表页:

找到发帖的数据处理模块:  model_forum_post.php

找到入库forum_thread表的位置

$this->param['isgroup'] = $this->forum['status'] == 3 ? 1 : 0;

		$this->param['publishdate'] = !$this->param['modnewthreads'] ? $this->param['publishdate'] : TIMESTAMP;

		$newthread = array(
			'fid' => $this->forum['fid'],
			'posttableid' => 0,
			'readperm' => $this->param['readperm'],
			'price' => $this->param['price'],
			'typeid' => $this->param['typeid'],
			'sortid' => $this->param['sortid'],
			'author' => $author,
			'authorid' => $this->member['uid'],
			'subject' => $this->param['subject'],
			'dateline' => $this->param['publishdate'],
			'lastpost' => $this->param['publishdate'],
			'lastposter' => $author,
			'displayorder' => $this->param['displayorder'],
			'highlight' => $this->param['highlight'],
			'digest' => $this->param['digest'],
			'special' => $this->param['special'],
			'attachment' => 0,
			'moderated' => $this->param['moderated'],
			'status' => $this->param['tstatus'],
			'isgroup' => $this->param['isgroup'],
			'replycredit' => $this->param['replycredit'],
			'closed' => $this->param['closed'] ? 1 : 0
		);
		$this->tid = C::t('forum_thread')->insert($newthread, true);
		C::t('forum_newthread')->insert(array(
		    'tid' => $this->tid,
		    'fid' => $this->forum['fid'],
		    'dateline' => $this->param['publishdate'],
		));

然后在入库数据之前,对status进行处理。

/*By Jhonse @2014-09-30 Start*/
	if(defined('IN_MOBILE') && checkmobile()){
		$this->param['tstatus'] = 1024;
	}
/*By Jhonse @2014-09-30 End*/

 备注:

这里判断是否是手机打开网站,如果是的,就直接赋值为1024,因为在帖子列表页中只有一个图标来显示手机标记,不像帖子详细页,不同的手机类型有不同的手机图标。

处理完forum_thread表中的status字段,我们还需要处理forum_post表中的status字段。

还是在model_forum_post.php文件中,找到入库forum_post表的位置。

$this->pid = insertpost(array(
			'fid' => $this->forum['fid'],
			'tid' => $this->tid,
			'first' => '1',
			'author' => $this->member['username'],
			'authorid' => $this->member['uid'],
			'subject' => $this->param['subject'],
			'dateline' => $this->param['publishdate'],
			'message' => $this->param['message'],
			'useip' => $this->param['clientip'] ? $this->param['clientip'] : getglobal('clientip'),
			'port' => $this->param['remoteport'] ? $this->param['remoteport'] : getglobal('remoteport'),
			'invisible' => $this->param['pinvisible'],
			'anonymous' => $this->param['isanonymous'],
			'usesig' => $this->param['usesig'],
			'htmlon' => $this->param['htmlon'],
			'bbcodeoff' => $this->param['bbcodeoff'],
			'smileyoff' => $this->param['smileyoff'],
			'parseurloff' => $this->param['parseurloff'],
			'attachment' => '0',
			'tags' => $this->param['tagstr'],
			'replycredit' => 0,
			'status' => $this->param['pstatus']
		));

在此之上对status字段进行处理:

/*By Jhonse @2014-09-30 Start*/
		if(defined('IN_MOBILE') && checkmobile()){
			global $_G;
			if($_G['mobile'] == "iphone"){
				$this->param['pstatus'] = 136;
			}else if($_G['mobile'] == "android"){
				$this->param['pstatus'] = 264;
			}else if($_G['mobile'] == "windows phone"){
				$this->param['pstatus'] = 392;
			}else if($_G['mobile'] == "symbian"){
				$this->param['pstatus'] = 520;
			}
		}
		/*By Jhonse @2014-09-30 End*/

备注:

对应赋值的数字是如何得到的?

论坛列表: status 1024

帖子:status - iphone 1 001 - andriod 2 010 - wp 3 011 - sym 4 100

满足条件: 0000 1000

iphone: 001  (10 9 8)->(9,8,7)

0000 1000 1000 -> 136

android: 010 (10 9 8)->(9,8,7)

0001 0000 1000 -> 264

wp: 011 (10 9 8)->(9,8,7)

0001 1000 1000 -> 392

sym: 100 (10 9 8)->(9,8,7)

0010 0000 1000 -> 520

 2)回帖功能

步骤和发帖功能一样,找到数据处理模块model_forum_post.php,然后只需对forum_post表中的status字段进行处理。

/*By Jhonse @2014-09-30 Start*/
		if(defined('IN_MOBILE') && checkmobile()){
			global $_G;
			if($_G['mobile'] == "iphone"){
				$status = 136;
			}else if($_G['mobile'] == "android"){
				$status = 264;
			}else if($_G['mobile'] == "windows phone"){
				$status = 392;
			}else if($_G['mobile'] == "symbian"){
				$status = 520;
			}
		}
		/*By Jhonse @2014-09-30 End*/

		$this->pid = insertpost(array(
			'fid' => $this->forum['fid'],
			'tid' => $this->thread['tid'],
			'first' => '0',
			'author' => $this->member['username'],
			'authorid' => $this->member['uid'],
			'subject' => $this->param['subject'],
			'dateline' => $this->param['timestamp'] ? $this->param['timestamp'] : getglobal('timestamp'),
			'message' => $this->param['message'],
			'useip' => $this->param['clientip'] ? $this->param['clientip'] : getglobal('clientip'),
			'port' => $this->param['remoteport'] ? $this->param['remoteport'] : getglobal('remoteport'),
			'invisible' => $pinvisible,
			'anonymous' => $this->param['isanonymous'],
			'usesig' => $usesig,
			'htmlon' => $htmlon,
			'bbcodeoff' => $bbcodeoff,
			'smileyoff' => $smileyoff,
			'parseurloff' => $parseurloff,
			'attachment' => '0',
			'status' => $status,
		));

第六讲 PhoneGap Geolocation 获取地理位置 api

学习要点:

1. PhoneGap  Geolocation 对象介绍

2. geolocation.getCurrentPosition

3. 主要对象描述

4. 获取地理位置信息

5. 动态获取地理位置信息

6. 综合案例说明

一、 PhoneGap  Geolocation 对象介绍 

使应用程序可以访问地理位置信息。geolocation 对象提供了对设备 GPS 传感器的访问。Geolocation 提供设备的位置信息,例如经度和纬度。位置信息的常见来源包括全球定位系统(GPS),以及通过诸如 IP 地址、RFID、WiFi 和蓝牙的 MAC 地址、和 GSM/CDMA 手机 ID 的网络信号所做的推断。不能保证该 API 返 回的是设备的真实位置信息。这个 API 是基于 W3C Geo location API Specification 实现的。有些设备已经提供 了对该规范的实现,对于这些设备采用内置实现而非使用 PhoneGap 的实现。对于没有地理位置支持的设 备,PhoneGap 提供了统一的支持。

方法

geolocation.getCurrentPosition

geolocation.watchPosition

geolocation.clearWatch

参数

geolocationSuccess

geolocationError

geolocationOptions

二、 geolocation.getCurrentPosition

返回设备的当前位置,一个位置对象。

navigator.geolocation.getCurrentPosition(geolocationSuccess,
[geolocationError],
[geolocationOptions]); 参数
geolocationSuccess:通过当前位置的回调。 geolocationError:(可选)如果发生错误,执行的回调。
geolocationOptions:(可选)获取地理位置的选项,例如获取频率。它一般作为一个 JSON 对象,目前可设 置的属性如下

geolocationOptions{

enableHighAccuracy:提供一个表明应用程序希望获得最佳可能结果的提示。

timeout:允许的以毫秒为单位的最大时间间隔,该时间间隔是从 geolocation.getCurrentPosition 或 geolocation.watchPosition 的调用到相应的 geolocationSuccess 回调函数被调用,单位是毫秒。

maximumAge:保留上次缓存的最长时间,单位是毫秒。可以理解为获取地理位置信息的频率 注意: 除非 enableHighAccuracy 选项被设定为 true,否则 Android 2.X 模拟器不会返回一个地理位置结果 例如:{ maximumAge: 3000, timeout: 5000, enableHighAccuracy: true };
}

三、 主要对象描述

1.Position

包含由 geolocation API 创建的 Position 坐标信息。 coords:一系列地理坐标。(Coordinates 类型) timestamp:以毫秒为单位的 coords 的创建时间戳。

2.PositionError
当发生错误时,一个 PositionError 对象会传递给 geolocationError 回调函数。
code:一个在下面常量列表中定义的错误代码。 message:说明错误细节的错误信息。
PositionError.PERMISSION_DENIED:权限被拒绝 PositionError.POSITION_UNAVAILABLE:位置不可用 PositionError.TIMEOUT:超时

3. Coordinates 一系列用来描述位置的地理坐标信息的属性。
latitude:以十进制表示的纬度。 longitude:以十进制表示的经度。 altitude:位置相对于椭圆球面的高度,单位为米。 海拔高度 accuracy:以米为单位的纬度和经度坐标的精度水平。altitudeAccuracy:以米为单位的高度坐标的精度水平。 heading:运动的方向,通过相对正北做顺时针旋转的角度指定。speed:以米/秒为单位的设备当前地面速 度。

注意: altitudeAccuracy: Android 设备上不支持该属性,返回值总是 null

四、获取地理位置信息 

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>Geolocation 例子</title>  
<script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
<script type="text/javascript" charset="utf-8">  
    // 等待 PhoneGap 加载 
    document.addEventListener("deviceready", onDeviceReady, false);  
    // 加载完成 
    function onDeviceReady() { 
         navigator.geolocation.getCurrentPosition(onSuccess, onError); 
    }  
    // onSuccess 回调函数     //  接收包含当前地理位置坐标信息的 Position 对象 
    function onSuccess(position) { 
         var element = document.getElementById('geolocation'); element.innerHTML = '纬度: '           + position.coords.latitude              + '<br />' +                             '经度: '          + position.coords.longitude             + '<br />' +                             '海拔高度: '           + position.coords.altitude              + '<br />' 
+                             '精确度: '           + position.coords.accuracy              + '<br />' +                             '海拔高度精确度: '  + position.coords.altitudeAccuracy      + '<br />' +                             '运动方向: '            + position.coords.heading               + '<br 
/>' +                             '速度: '              + position.coords.speed                 + '<br />' 
+                             '时间戳: '          + new Date(position.timestamp)          + '<br />'; 
    }  
    // onError 回调函数,接收包含具体错误信息的 PositionError 对象 
    function onError(error) {         alert('错误代码: '    + error.code    + '\n' +               '详细信息: ' + error.message + '\n'); 
    }  
  </script> 
</head> 
<body> 
<p id="geolocation">定位中。。。</p> 
</body> 
</html>

五、 动态获取地理位置信息

1. geolocation.watchPosition 定期获取设备的地理位置信息

navigator.geolocation.watchPosition(onSuccess, onError, options);

2. navigator.geolocation.clearWatch 停止定期获取设备的地理位置信息

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <title>Geolocation 例子</title> 
<script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
<script type="text/javascript" charset="utf-8">  
    //等待 PhoneGap 加载 
document.addEventListener("deviceready", onDeviceReady, false);  
varwatchID = null;  
    //加载完成 
    function onDeviceReady() { 
        // Update every 3 seconds 
var options = { frequency: 3000 }; 
watchID = navigator.geolocation.watchPosition(onSuccess, onError, options); 
    }  
    // onSuccess 回调函数     //  接收包含当前地理位置坐标信息的 Position 对象 
    function onSuccess(position) { 
var element = document.getElementById('geolocation'); element.innerHTML = '纬度: '  + position.coords.latitude      + '<br />' +                             '经度: ' + position.coords.longitude     + '<br />' + 
                            '<hr />'      + element.innerHTML; 
    }  
    //取消获取地理位置信息 
    function clearWatch() { 
          if (watchID != null) { 
navigator.geolocation.clearWatch(watchID); 
watchID = null; 
        } 
    }  
    // onError 回调函数,接收包含具体错误信息的 PositionError 对象 
    function onError(error) { 
      alert('code: '    + error.code    + '\n' + 
            'message: ' + error.message + '\n'); 
    }  
</script> 
</head> 
<body> 
<p id="geolocation">监测地理位置信息中。。。</p> 
<button onclick="clearWatch();">取消监测地理位置信息</button> 
</body> 
</html>

六、 综合案例

在实际的开发中我们如何实现定位呢?

一般结合百度地图 api 或者谷歌的地图 api 实现

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<style type="text/css"> 
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;} 
</style> 
<script type="text/javascript" 
src="http://api.map.baidu.com/api?v=2.0&ak=5a21b9801cac081f6473bafdc558c53a"></script> <title>反地址解析</title> 
</head> 
<body> 
<div id="allmap"></div> 
</body> 
</html> 
<script type="text/javascript">  
// 百度地图 API 功能 
var map = new BMap.Map("allmap"); 
  var point = new BMap.Point(116.331398,39.897445); 
map.centerAndZoom(point,12); 
var gc = new BMap.Geocoder();       
map.addEventListener("click", function(e){         
    var pt = e.point; 
    gc.getLocation(pt, function(rs){ 
        var addComp = rs.addressComponents; 
        alert(addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + 
addComp.streetNumber); 
    });         
}); </script>

2014年9月编程语言排行榜:Java、C++跌至历史最低点

TIOBE9月编程语言排行榜发布,前三甲为C、Java、Objective-C。尽管Java排名第二,但其份额却在下降,从图表上可以看出,下降了-2.01%。另外排名第四的C++份额下降幅度也较大,为-3.99%。

自2001年以来,Java和 C++在TIOBE排行榜份额起起落落,有升有降,但大多数是以降居多,而这个月两者竟跌至历史最低点。但这并不意味着Java和C++一直这样持续下去,毕竟针对这两门语言,市场上依然有着巨大需求。

对于这一趋势,笔者理解的是,编程语言不断推陈出新,花样繁多,再加之各大科技巨头积极推广自身推出的语言,比如苹果的Swift(这个月排名第 18位)、谷歌的Go等等;使其在使用领域方面有所限制。此外,一些特别领域使用编程语言也有所讲究,比如,生物学、统计学、硬件以及心理学等。

其实,Java自面世后就非常流行,发展极为迅速并对C++语言形成了有力冲击。

编程语言排行榜TOP 20榜单:

540e645da601d前10名编程语言长期走势图:

540e648f8d158以下是21-50编程语言排名:

540e64ce566a9540e64de28f96后50名编程语言如下:

(Visual) FoxPro, 4th Dimension/4D, Alice, APL, Arc, Automator, Awk, Bash, bc, Bourne shell, C++/CLI, CFML, cg, CL (OS/400), Clean, Clojure, Emacs Lisp, Factor, Forth, Hack, Icon, Inform, Io, Ioke, J, JScript.NET, LabVIEW, LiveCode, M4, Magic, Max/MSP, Modula-2, Moto, NATURAL, OCaml, OpenCL, Oz, PILOT, Programming Without Coding Technology, Prolog, Pure Data, Q, RPG (OS/400), S, Smalltalk, SPARK, Standard ML, TOM, VBScript, Z shell

必须声明,这个榜单本身采集的是英文世界的数据,虽然在反映趋势上有一些参考意义,但与中国的实际情况不完全符合,而且,这张采样本身也有相当大的局限性。

【说明】

TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名 使用著名的搜索引擎(诸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等)进行计算。请注意这个排行榜只是反 映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

来源于:csdn