微信公众平台通过审核了~~
晚上吃完饭,上微信公众平台一看,审核通过了。
哦了,下面开始想想能做些上面了~
晚上吃完饭,上微信公众平台一看,审核通过了。
哦了,下面开始想想能做些上面了~
最近支援一个项目,采用discuz!程序,需要实现嵌套回复,效果类似WordPress的效果,某条回复的回复需要排在一起显示。
没有使用discuz!的点评功能,而是通过改造post表实现嵌套功能。
在discuz!的post表增加字段:
alter table pre_forum_post add parentid int(10) unsigned NOT NULL DEFAULT '0',topid int(10) unsigned NOT NULL DEFAULT '0';
- parentid 父级回复id
- topid 根回复id
- 需要传递父级回复pid.
- 如果是根回复,parentid = 0,topid = 0.
- 如果是子回复,parentid = 父级回复的pid,topid = 父级回复的topid. 父级回复的pid和topid需要根据传递的pid进行查询.
取一个根回复下的所有子回复,执行sql:
select * from pre_forum_post where toppid = xxx order by qpid desc, pid desc;
php处理成树形结构。
// $rows 为执行上述sql的查询结果 foreach ($rows as $k => $row) { if ($row['toppid'] == $row['parentid']) { $key = $row['parentid'] . '-' . $row['pid']; } else { $key = $map[$row['parentid']] . '-'. $row['pid']; } $map[$k] = $key; } ksort($map); // 排序后的结果: // 1 // 1-4 // 1-4-7 // 1-5 // 1-2 foreach ($map as $pid) { $result[$pid] = $rows[$pid]; } // result 即为排序好后的回复列表
- 对所有topid的嵌套回复建立缓存。
pid => array(), array()中存储其下所有嵌套回复。
- 列表页直接查询缓存显示。
- 更新时触发缓存更新,需要一次取出topid下的所有回复进行php排序处理。
- 回复过多时,缓存过大或无法缓存。
- 因为项目需求特殊,一条回复的嵌套回复只显示前50条,所以缓存不会太大。上面这种方案应该可以满足需求,但是需要考虑查询如何优化。
- 网上搜索了相关的资料,也没有找到太合适的方案。网上的方案是取出数据后进行递归遍历,后续比较下两种方式的效率差别。
- 无限分类设计方案 http://www.ccvita.com/315.html
- 在数据库中存储层次数据 http://shiningray.cn/hierarchical-data-database.html
升级后,点击QQ互联登录按钮,提示下面的错误信息。
抱歉,当前存在网络问题或服务器繁忙,详细错误:connect_error_code_0,错误代码:,请您稍候再试。
Discuz! X3.1的QQ互联集成了OAuth1.0和OAuth2.0的接口,升级脚本判断如果服务器支持ssl,就会使用OAuth2.0接口。
出现此问题的站点属于切换到了OAuth2.0接口后导致的。
source\plugin\manyou\Service\Client\OAuth.php
public function dfsockopen($requestURL, $queryString = array(), $files = false) { return dfsockopen($requestURL, 0, $queryString, '', false, $this->_apiIp, 15, TRUE, !$files ? 'URLENCODE' : 'FORMDATA', true, 0, $files); }
注意这里请求url的使用,使用了$this->_apiIp参数,看下这个参数是在哪里定义的。
source\plugin\manyou\Service\Client\ConnectOAuth.php
public function __construct($connectAppId = '', $connectAppKey = '', $apiIp = '') { if(!$connectAppId || !$connectAppKey) { global $_G; $connectAppId = $_G['setting']['connectappid']; $connectAppKey = $_G['setting']['connectappkey']; } $this->setAppkey($connectAppId, $connectAppKey); if(!$this->_appKey || !$this->_appSecret) { throw new Exception('connectAppId/connectAppKey Invalid', __LINE__); } if(!$apiIp) { global $_G; $apiIp = $_G['setting']['connect_api_ip'] ? $_G['setting']['connect_api_ip'] : ''; } if($apiIp) { $this->setApiIp($apiIp); } }
这里可以看到使用的是后台设置的互联接口IP。
Discuz! 后台诊断工具里的互联接口IP是设置的OAuth1.0接口的域名,即http://openapi.qzone.qq.com。
而OAuth2.0接口的域名变更为了https://graph.qq.com,但是接口里使用的IP仍为OAuth1.0的,所以就导致无法请求,继而导致上述报错。
上诊断工具里,去掉设置的互联接口IP即可。
2013年12月17日更新:
看到Discuz! 官网很多人反馈出现网络繁忙的问题,记日志看了下是请求用户openId这步报错了,应该是空间的接口有问题,静待官方解决。
2013年12月18日更新:
已经修复。
拿到一段字符串,做\n切割,得到数组,代码如下:
$a = '[2013-09-12 12:48:23] [2013-09-12 12:48:23] [2013-09-12 12:48:23] [2013-09-12 12:48:24] '; $datas = explode("\n", $a); print_r($datas);
输出结果:
Array
(
[0] => [2013-09-12 12:48:23]
[1] => [2013-09-12 12:48:23]
[2] => [2013-09-12 12:48:23]
[3] => [2013-09-12 12:48:24]
[4] =>
)
如上,数组中的第5项的值为空,需要过滤掉空项。
第一个反应需要foreach循环遍历处理每一项,但是感觉这个效率太低。
百度一番,发现一个函数可以直接搞定——array_filter.
PHP手册中关于array_filter的说明:
array_filter — 用回调函数过滤数组中的单元
说明
array array_filter ( array $input [, callable $callback = "" ] )依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
参数
input
要循环的数组callback
使用的回调函数
如果没有提供 callback函数, 将删除 input 中所有等值为 FALSE 的条目
代码如下:
$a = '[2013-09-12 12:48:23] [2013-09-12 12:48:23] [2013-09-12 12:48:23] [2013-09-12 12:48:24] '; $datas = explode("\n", $a); print_r(array_filter($datas));
输出结果:
Array
(
[0] => [2013-09-12 12:48:23]
[1] => [2013-09-12 12:48:23]
[2] => [2013-09-12 12:48:23]
[3] => [2013-09-12 12:48:24]
)
亲爱的她回家了。
回家当天感冒咳嗽,嗓子疼,晚上的时候发不出声了。
第二天又在外面跑了一天,晚上打电话,沙哑的声音听得我心疼。 :cry:
希望亲爱的她早点恢复健康。