Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

DZ X3需要考虑的技术问题

[复制链接]
 楼主| mark35 发表于 2012-8-22 14:22:25 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:20 编辑

4. 随着新版开发,可以看出dz开发人员在努力。
比如数据库表名开始规范,以前是 cdb_members ,现在是 pre_common_member 重点差别在于复数s上。这个名称直接变化说明了进步。

不过在PHP代码上还有改进的地方,对字符串变量取单个字符应该使用[]中括号,而放弃使用{}花括号
  1. function getattachtableid($tid) {
  2.         $tid = (string)$tid;
  3.         return intval($tid{strlen($tid)-1});
  4. }
复制代码
在以前中括号、大括号都可以对字符串操作。但后者现在已经不被推荐使用。希望在X3时能改进。

ps,上面这个代码改成如下似乎效率更高:

  1. function getattachtableid($tid) {
  2.         $tid = (string) $tid;
  3.         return substr($tid, -1);
  4. }
复制代码
因为返回值是被当成字符来拼接 pre_forum_attachment_[0-9] 这个字符串的,所以可以省去最后一步的intval()操作。

回复

使用道具 举报

Monkey威武 发表于 2012-8-22 20:55:53 | 显示全部楼层
smallthing 发表于 2012-8-22 12:58
ajax集中体现在一些增加了复杂度,比如 你http不行了卡住了怎么办 F5刷新,ajax只能看js和浏览器内部的处 ...

AJAX出错的话,根本无法得知是否有反应
回复

使用道具 举报

Monkey威武 发表于 2012-8-22 20:58:10 | 显示全部楼层
mark35 发表于 2012-8-22 14:22
3. 随着新版开发,可以看出dz开发人员在努力。
比如数据库表名开始规范,以前是 cdb_members ,现在是 pre ...

另外,改为JSON,好像要改不少,因为云平台啥的也用了XML传输内容
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-22 21:18:09 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:20 编辑
Monkey威武 发表于 2012-8-22 20:55
AJAX出错的话,根本无法得知是否有反应

怎么会不知道呢?
ajax本质上也是http协议的应用,传输出错照样可以处理的。jQuery.ajax有onerror的方法处理的。
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-22 21:21:39 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:21 编辑
Monkey威武 发表于 2012-8-22 20:58
另外,改为JSON,好像要改不少,因为云平台啥的也用了XML传输内容

这个的确是麻烦,是牵一发而动全身的。

这就是选型没做好导致的尴尬结果。就好比python以前内核不是unicode,后来升级到python3k重写了内核用unicode编码,但使得与之前版本差异太多,不少程序、扩展不兼容,导致3k的份额一直不高。当然这也不怪PY的作者,因为他开发PY的时候是1989年,而unicode标准是1991才发布的,而javascript是在1991或1992年开发,正好选中了unicode作为内核编码,所以js的兼容性一直非常好。也不会因为内核升级而大动干戈。
回复

使用道具 举报

welwfjlwjlj 发表于 2012-8-22 21:31:19 | 显示全部楼层
看到很多漂亮的jquery
但是用不了呀。。唉
回复

使用道具 举报

smallthing 发表于 2012-8-22 23:10:23 | 显示全部楼层
Monkey威武 发表于 2012-8-22 20:55
AJAX出错的话,根本无法得知是否有反应

其实是可以的,但是,需要写不少js,对程序员要求比较高,说白了就是做个在网页里的客户端
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-22 23:30:09 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:21 编辑
smallthing 发表于 2012-8-22 23:10
其实是可以的,但是,需要写不少js,对程序员要求比较高,说白了就是做个在网页里的客户端

其实也不难。下面是我以前项目中用到,自己封装的ajax函数,
// 自定义jq ajax,返回JSON
var my_jsonajax = function() {
    var defaultValue = {
        url            : '',
        data        : {},
        type        : 'POST',
        dataType    : 'json',
        processData : true,
        async         : true,
        cache        : true,
        global        : true,
        ifModified    : false,
        beforeSend    : null,
        succ        : function(r, e){return true;},    // r.stat >5
        complete    : null,
        err            : function(r, e){return true;},    // r.stat <=5
        succAlert    : false,    // 提示成功信息
        failAlert    : false,        // 提示失败信息(非ajax失败,而是服务端返回失败信息!)
        reload        : false,    // 成功后不刷新页面
        abortOnRetry: true,        // 相同URL则终止前一个请求
        loaderImg    : '#loaderImg'    // 加载动画id
    };
   
    return function(opt){
        var sts = jQuery.extend({}, defaultValue, opt);
        
        jQuery.ajax({
            abortOnRetry: sts.aboutOnRetry,
            type        : sts.type,
            url            : sts.url,
            cache        : sts.cache,
            data        : sts.data,
            async        : sts.async,
            global        : sts.global,
            ifModified    : sts.ifModified,
            dataType    : sts.dataType,
            beforeSend    : function(xhr){
                xhr.setRequestHeader('myajax', 1);
                if (typeof sts.beforeSend == 'function') {
                    sts.beforeSend();
                }
                if (sts.loaderImg) {
                    jQuery(sts.loaderImg).show();
                }
            },
            success        : function(r, e){
                if (sts.loaderImg) {
                    jQuery(sts.loaderImg).hide();
                }
               
                if (r && r.relogin) {
                    return false;
                }
                else if (!r || typeof r.stat === 'undefined') {    // r.stat : 5初始化值, 1错误, 3失败, 7完成, 9成功. 若r.jump真则跳转r.dat值或者reload
                    if (jQuery.blockUI) {
                        jQuery.unblockUI();   
                    }
                    return false;
                }        

                if (r.stat > 5) {
                    sts.succ(r, e); // 先执行自定义
                    if (sts.succAlert && r.msg) { // 显示成功信息
                        alert(r.msg);
                    }
                    if (r.jump) {
                        window.location.href = r.dat || window.location.href;
                    }
                    if (true == sts.reload) { // 刷新页面
                        window.location.href = window.location.href;
                    }
                }
                else {
                    sts.err(r, e);
                    if (sts.failAlert && r.msg) {
                        alert(r.msg);
                    }
                }
            },
            complete    : function(r, e){
                if (typeof sts.complete == 'function') {
                    sts.complete(r, e);
                }
                //r = null;
            },
            error        : function(xhr, e){
                if ((jQuery.blockUI)) {
                    jQuery.unblockUI();
                }
                if (sts.loaderImg) {
                    jQuery(sts.loaderImg).hide();
                }
                alert('ajax错误: ' + (!e ? '' : e));
            }
        });
    }
}();

PHP端的
  1. /**
  2. * 输出返回json格式数据,默认终止脚本
  3. * @param mixed    $arg string/array
  4. * @param int    $ex  1退出脚本, !1继续执行脚本
  5. */
  6. function json_return($arg, $ex = 1, $cacheTime = 0) {
  7.     $cacheTime    = intval($cacheTime);
  8.     ob_start();
  9.     header( 'Content-Type: application/json; charset=UTF-8' );
  10.     if ($cacheTime > 0) {
  11.         header("Cache-Control: must-revalidate, max-age=$cacheTime");
  12.     }
  13.     else {
  14.         header('Cache-Control: no-cache, no-store, must-revalidate');
  15.     }
  16.     echo json_encode($arg);
  17.     if ($ex == 1) {    die(); }
  18. }

  19. /**
  20. * 修改返回JSON信息
  21. * msgR($jsR)返回当前状态值
  22. * msgR(null, 1, 'errmsg') 返回错误及错误信息
  23. *
  24. * @param jsR    array/null 若null则初始化
  25. * @param stat    int    (-1:relogin; 1:error; 3:failure; 5:init; 7:complete; 9:succeed; -2:jump url with $dat)
  26. * @param msg    string[option='']
  27. * @param data    mixed[option=Null]
  28. * @param jump    int[option=0] 是否需要跳转 设置为1则需要 $dat保存url 若$dat空则客户端reload
  29. */
  30. function msgR($j, $stat = 5, $msg = '', $dat = null, $jump = 0) {
  31.     if (func_num_args() == 0) {
  32.         return array('stat'=>5, 'msg'=>''); //初始化,msg初始值不能为null!
  33.     }
  34.     elseif (func_num_args() == 1) {
  35.         if (!$j) { return array('stat'=>5, 'msg'=>'');    }    // 初始化$jsR
  36.         elseif (is_array($j)) {return $j['stat'];} //返回状态值
  37.     }
  38.     elseif (!$j) {    // 若第一参数值假则初始化,故不用特地初始化 $jsR
  39.         $j = array('stat'=>5, 'msg'=>'');
  40.     }

  41.     $j['stat'] = $stat;
  42.     if (9 == $stat) {
  43.         $j['msg'] = $msg; //9时清空已有msg
  44.     }
  45.     else {
  46.         $j['msg'] = !$j['msg'] ? $msg : ($j['msg'] . ',' . $msg); //非9时追加msg
  47.     }
  48.     if ($dat) {
  49.         $j['dat'] = $dat;
  50.     }

  51.     if ($jump) {
  52.         $j['jump'] = 1;
  53.         if (!$j['dat']) {
  54.             $j['dat'] = $dat;    // 跳转url
  55.         }

  56.     }

  57.     $j['msg'] = my_htmlspecialchars( $j['msg'] );
  58.     return $j;
  59. }

复制代码
调用
  1.         json_return(msgR(null, 3, '任务添加失败'));
复制代码
回复

使用道具 举报

悠悠猴 发表于 2012-8-23 10:23:58 | 显示全部楼层
mark35 发表于 2012-8-22 12:52
JSON和XML一样属于数据传输标准。和HTTP刷新页面无关的~

不是什么传输标准, 他们都只是一种数据存储格式而已.
回复

使用道具 举报

悠悠猴 发表于 2012-8-23 10:25:03 | 显示全部楼层
mark35 发表于 2012-8-22 10:56
jQuery是目前主流,几乎是js框架事实标准。DZ不是企业程序用不上EXTjs这种庞然大物,应该采用jQuery作为底 ...

这个毫无疑问啊. 我意思就是说, phpwind9 都已经更换为jquery了. 希望DZ也更换.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-9-11 09:28 , Processed in 0.108722 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表