Archives for : Discuz

第2891天:discuz 访问 forum.php 版块页面突然变得很慢

上周突然出现的问题,一直不知道什么原因,今天去 discuz 后台的“云平台”尝试关闭纵横搜索,提示:

调用远程接口失败,请检查您的服务器是否处于内网以及您服务器的防火墙

然后去“云平台 -> 诊断工具”发现:

请求接口失败,请咨询空间商

于是给阿里云提交了工单。然而还没等阿里云客服回复,又尝试了一下关闭纵横搜索,竟然关闭成功了,网站也能正常访问了。

所以问题应该就是出在纵横搜索上,搜索奇慢无比,关闭就行了。

第2606天:重写discuz的$,避免和jQuery冲突

discuz 的 common.js 中有个 $ 的函数,和 jquery 冲突

function $(id) {
    return !id ? null : document.getElementById(id);
}

重写 $

注:以下方法建议只在 wap 页中使用,PC 版坑太多,建议使用 var Q=jQuery 的全局变量,或者直接使用 jQuery.

// 用于选择器
function $(id) {
    if(!id) return null;
    var rep = /^[a-zA-Z0-9_-]+$/;
    // 加了 'object' 的判断,否则管理员删帖弹层会报错
    // 所以 jquery 不要用 $({}) 的写法
    if(rep.test(id) || typeof(id) === 'object') {
        // 如果传入的 id 是字母、数字、中划线、下划线,则返回 discuz 选择器
        return document.getElementById(id);
    } else {
        // 否则返回 jquery 选择器
        if (window.jQuery) {
            return jQuery(id);
        }
    }
}
// 用于jquery扩展,例如 $.ajax 等
if (window.jQuery) {
    jQuery.extend($, jQuery);
    $.prototype = jQuery.prototype;
}

再修改 common_extra.js,找到 function slideshow (626行),把

if(!el.id) el.id = Math.random();

改成

if(!el.id) el.id = Math.round(Math.random()*10000);

这样改的原因是在 common_extra.js 的 842 行有一句 var percentEle = $(this.id+’_percent’); 而 Math.random() 会返回小数点。

现在,如果要在 discuz 的 js 中用 jquery 的选择器,也可以直接用 $ 了。

有个注意点,不要直接使用类似于 $(‘h2′) 这种标签选择器,可以在标签前加个样式,例如 $(‘.js-myclass h2′)

(感谢德来、劲风、nino :D

第2592天:给discuz增加错误提示页

感谢广洲同学。

文件:source/class/class_core.php

修改 handleException 函数,改成:

public static function handleException($exception) {
    if(DISCUZ_CORE_DEBUG){
        discuz_error::exception_error($exception);
    } else {
        discuz_error::simple_show_error();
    }
}

文件:source/class/discuz/discuz_error.php

在最后面(write_error_log函数的下方)增加:

public static function simple_show_error(){
    echo <<<EOT
    <!DOCTYPE html>
    <html>
    <head>
    <title>出错了</title>
    <style>
    body {
        background: #F1F2F6;
    }
    #container {
        margin: 100px auto;
        text-align: center;
    }
    h1 {
        font-weight: normal;
        font-size: 28px;
    }
    </style>
    </head>
    <body>
    <div id="container">
        <img src="static/image/extend/error.png" width="200" height="200">
        <h1>出错了!</h1>
    </div>
    </body>
    </html>
    EOT;
}

第2579天:discuz手机端发起的帖子回复提醒

手机端发起的帖子,有回复时楼主不会收到通知提醒。

以 default 模板为例,找到文件

/template/default/touch/forum/post.htm

在 form 里面增加一行

<input type=”hidden” name=”allownoticeauthor” value=”1″ />

在 PC 端发帖时,附加选项会有一个“接收回复通知”的选项,手机端没有,所以加上这行。

感谢广洲同学。

第2578天:discuz手机触屏版上传图片显示不了缩略图

discuz手机触屏版上传图片显示不了缩略图。以下是广洲同学研究的成果。

修改模板文件(注意,对应你的模板路径,这里以 default 为例)

/template/default/touch/forum/post.htm

在 163 行

var imgexts = typeof imgexts == ‘undefined’ ? ‘jpg, jpeg, gif, png’ : imgexts;

后面增加两行

// 本地附件地址
var attachurl_0 = “{$_G[setting][attachurl]}”;
// 远程附件地址
var attachurl_1 = “{$_G[setting][ftp][attachurl]}”;

在 190 行

$(‘#imglist’).append(‘<li><span aid=”‘+dataarr[3]+’” class=”del”><a href=”javascript:;”><img src=”{STATICURL}image/mobile/images/icon_del.png”></a></span><span class=”p_img”><a href=”javascript:;”><img style=”height:54px;width:54px;” id=”aimg_’+dataarr[3]+’” title=”‘+dataarr[6]+’” src=”{$_G[setting][attachurl]}forum/’+dataarr[5]+’” /></a></span><input type=”hidden” name=”attachnew['+dataarr[3]+’][description]” /></li>’);

把里面的

src=”{$_G[setting][attachurl]}forum/’+dataarr[5]+’”

改成

src=”‘+( dataarr[8] ? attachurl_1 : attachurl_0 )+’forum/’+dataarr[5]+’”

private function _xss_check() {

    static $check = array('"', '>', '<', '\'', '(', ')', 'CONTENT-TRANSFER-ENCODING');

    if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {
        system_error('request_tainting');
    }

    if($_SERVER['REQUEST_METHOD'] == 'GET' ) {
        $temp = $_SERVER['REQUEST_URI'];
    } elseif(empty ($_GET['formhash'])) {
        $temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');
    } else {
        $temp = '';
    }

    if(!empty($temp)) {
        $temp = strtoupper(urldecode(urldecode($temp)));
        foreach ($check as $str) {
            if(strpos($temp, $str) !== false) {
                system_error('request_tainting');
            }
        }
    }

    return true;
}

替换为

private function _xss_check() {
    $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
    if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
        system_error('request_tainting');
    }
    return true;
}

参考:http://www.discuz.net/thread-3484417-1-1.html

第2533天:discuz的description权限问题,第一天上路

discuz的description权限问题

做微信分享的时候,发现帖子摘要有问题,搜一下才知道,discuz 的 description 是有权限的,只有管理员及搜索引擎爬虫才有能看到。

所以微信分享的时候需要自己截取文章摘要,不能直接使用 description 。

另外,有些帖子分享出去,别人点了之后会需要登录,url 可以处理一下,不要直接用地址栏 url 。

附:

// 微信分享
window._global.share = {
    title: '{$navtitle}',  //必须
    desc : getDesc(),  //必须
    link: 'http://bbs.youzan.com/forum.php?mod=viewthread&tid=' + {$_G['tid']}, //必须
    cover: getImage(),  //必须
    img_width: '200',
    img_height: '200',
    timeLineTitle: ''  // 当分享朋友圈的时候,标题以这个为准
};
function getDesc() {
    jQuery('.js-page-content .pstatus').empty(); // 清空 本帖最后由 xxx 编辑 的字样
    jQuery('.js-page-content .js-replyreload').empty(); // 清空 replyreload += xxx 字符串
    var desc = jQuery.trim(jQuery('.js-page-content').text());
    if (desc.length > 50) {
        desc = desc.substring(0, 50);
    }
    return desc;
}
function getImage() {
    var firstImg = jQuery('.yz_plc_first').find('img:first'),
        imageHeight = firstImg.size() > 0 ? firstImg.get(0).naturalHeight : 0,
        imageWidth = firstImg.size() > 0 ? firstImg.get(0).naturalWidth : 0;
    if (imageHeight >= 300 && imageWidth >= 300) {
        return firstImg.attr('src');
    } else {
        return 'http://kdt-static.qiniucdn.com/v2/image/wap/weixin_share_default_logo.png';
    }
}

第一天上路

今天只有两个人练车,在场地里练了几圈,下午教练教我们上路。

第一天在路上开,开了十来公里,感觉还不错。

第2530天:discuz手机版播放音频

直接用 h5 的 <audio> 标签。

修改:source/function/function_discuzcode.php

找到

if(strpos($msglower, ‘[/audio]‘) !== FALSE) {

$message = preg_replace(“/\\s*([^\[\<\r\n]+?)\s*\[\/audio\]/is”, “[media]\\2[/media]“, $message);

改成

$message = preg_replace(“/\\s*([^\[\<\r\n]+?)\s*\[\/audio\]/is”, “<audio src=’\\2′ controls=’true’ preload=’true’></audio>”, $message);

微信分享缩略图相关方案

网上说在 <body> 里的第一行代码加一张尺寸至少为 300*300 的图片即可,图片样式:

<img src=”" style=”width: 0; height: 0; position: absolute; left: -1000px;”>

注意,不能使用 display: none 来隐藏图片。但是可以用一个隐藏元素来把图片包起来:

<span style=“display: none;”>
<img src=”">
</span>

不过在调试的时候发现,这张图不一定要放在页面的最前面,也可以放在页面的最底部。这样可以用来解决一个问题,就是页面前面如果没有缩略图的时候,就使用最后设置的这张缩略图。

discuz网络图片不能在手机版和触屏版显示

参考:http://www.discuz.net/thread-3527087-1-1.html

修改文件

\source\function\function_discuzcode.php

找到

if(defined('IN_MOBILE') && !defined('TPL_DEFAULT') && !defined('IN_MOBILE_API')) {

改成

if($_G[setting][mobile][mobilesimpletype]) {

第2526天:用门户文章功能来实现证书管理

小弟组织的马拉松比赛,结束后都要做电子证书,蔚蓝城把所有证书的图片做好打包发给我,我再传到网上。一张张图片处理很耗时间,体力活,传图片并链接地址也耗时间。

后来想能不能请人做一个证书管理的插件,问一下,大概要一千多块,最主要是我觉得那家伙态度很不好,有一种还没上船就知道要被坑的感觉。

这两天发现,discuz 的门户文章功能其实是可以用来做证书管理的。好赞。