微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
【推荐】UCHome Authcode 详解
 define('UC_KEY', 'g3e2G1fbe3M973fet7n5j3t0Zcz8u2g9edj1g9J4B7h1aaB7ya6489M0z0f4E5Mb'); // 与 UCenter 的通信密钥, 要与 UCenter 保持一致  代码 1   2  3 //定义默认函数初始值   4 //$string="admin";初始化$srting变量数值在   5 //$keyc中调用   6 function authcode($string='admin', $operation = 'DECODE', $key = '', $expiry = 0) {          7 $ckey_length = 4;        // 随机密钥长度 取值 0-32;                                   8 // 加入随机密钥,可以令密文无任何规律,   9 //即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。                                  10 // 取值越大,密文变动规律越大,密文变化 = //16 的 $ckey_length 次方                                  11 // 当此值为 0 时,则不产生随机密钥                                 12 $Mykey = md5(UC_KEY);  //对UC_KEY进行一次md5加密                                 13 echo "$Mykey  -- $Mykey  "; //输出  14 //$Mykey==c647d451bb5792d9cc1693a672380641          15 $key="";//定义key为empty                 16 $key = md5($key ? $key : UC_KEY);  //使用三原操作符,如果$key为  17 //空则对UC_KEY进行md5加密 否则对$key加密结果为$Mykey                18   echo "$key  -- $key  ";//输出$key==c647d451bb5792d9cc1693a672380641                  19 $key="abcdefghijklmnopqrstuvwsyz "; //定义$key=abcdefghijklmnopqrstuvwsyz 测试$keya结果              20     $keya = md5(substr($key, 0, 16));//用substr对$key进行截取得到从第一个到第16个字符                  21 echo "$keya is $keya ";//输出$keya=abcdefghijklmnop        22   $key="abcdefghijklmnopqrstuvwsyz123456";//定义$key         23 $keyb =md5(substr($key, 16, 16));//通过substr对$key进行截取   24 //截取方法为从第16位开始 向后截取到第32位结束         25 echo "$keyb $keyb ";//       26    //$keyc 使用的2层的三原操作符,理解如下$keyc = $ckey_length 的时候  27 //返回($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length))   28 //否则返回empty  29 //上面的理解为$operation == 'DECODE';时候用substr截取$string变量的值,  30 //截取大小为从第0个到第$ckey_length个默认$ckey_length为4$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';echo "$keyc is $keyc ";  31 //输出按照我们初始的测试$keyc为admi$cryptkey = $keya.md5($keya.$keyc);//这个我估计不用说了   32 //就是单纯的字符串拼接和md5之后再拼接  33 echo "$cryptkey is $cryptkey";$key_length = strlen($cryptkey);//计算$cryptkey的长度本例为64  34 echo "$key_length  is $key_length ";//base64_decode对encoded_data 进行解码,返回原始数据,  35 //失败则返回 FALSE。返回的数据可能是二进制的         36 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;        $string_length = strlen($string);       37 echo "$satring is $string_length ";          38 $result = '';//range() 返回数组中从 low 到 high 的单元,包括它们本身。  39 如果 low > high,  40 //则序列将从 high 到 low。//根据cuh的设置,说的白话一点就是生成一个0到255的纯数字数组      41     $box = range(0, 255);         42 echo "$box is $box[1] ";       43    $rndkey = array();        //$i 输出0到255个整数        44   for($i = 0; $i <= 255; $i++) {        //ord()函数返回一个字符的askii码值;         45 //$rndkey[$i]根据$i /$key_length的余数然后用ord处理          46 //$cryptkey[$i % $key_length]返回$cryptkey  47 数组里的键值$i=2返回第二位        48   //$rndkey[$i]从数组的第$i位开始返回$rndkey[$i]的值               49    $rndkey[$i] = ord($cryptkey[$i % $key_length]);                //echo "$rndkey[$i] is $rndkey[2]   ";        }       50    for($j = $i = 0; $i < 256; $i++) {  51 //$j是三个数相加与256取余                 52 $j = ($j + $box[$i] + $rndkey[$i]) % 256;                 53 $tmp = $box[$i];                54   $box[$i] = $box[$j];                  55 $box[$j] = $tmp;                //echo "$j is $j  ";        }//如果$i小于设定的随机密钥长度则$i加1        56   for($a = $j = $i = 0; $i < $string_length; $i++) {                  57 //在上面基础上再加1 然后和256取余  58 $a = ($a + 1) % 256;                  59 $j = ($j + $box[$a]) % 256;//$j加$box[$a]的值 再和256取余                 60 $tmp = $box[$a];                61   $box[$a] = $box[$j];               62    $box[$j] = $tmp;                // ^  位运算符允许对整型数中指定的位进行置位。  63 //如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值                 64 //chr 返回相对应于 ascii 所指定的单个字符 。  65 //也就是说根据chr函数里生成的数的ascii来指定要输出的字符                 66 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));        }//这么多吧!后边的我把函数给大家 就是算法的反复重用了,  67 //还调用了时间函数。//base64_encode() returns 使用 base64 对 data 进行编码。  68 //设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,  69 //例如电子邮件的主体。 //str_replace() 函数使用一个字符串替换字符串中的另一些字符。  70 /*str_replace(find,replace,string,count)find 规定要查找的值。   71 *replace 规定替换 find 中的值的值。   72 *0string 规定被搜索的字符串。  73 *count 一个变量,对替换数进行计数。  74 */         75 if($operation == 'DECODE') {                 76 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {                         77 return substr($result, 26);                  78 } else {                        return '';                }         79 } else {                return $keyc.str_replace('=', '', base64_encode($result));        }          80 }81    $key=authcode(’blog123456′,’ENCO
UCHome中数据库操作类(class_mysql.php)页面的代码分析
UCHome的数据库操作类,相对来说还是比较容易让人理解的 代码  1 <?php  2 /*  3 [UCenter Home] (C) 2007-2008 Comsenz Inc.  4 $Id: class_mysql.php 2009-10-22 1:15:00  5 @author ymaozi  6 @copyright http://www.codedesign.cn  7 @uchome源码交流QQ群:83400263  8 */  9  10 if(!defined('IN_UCHOME')) { 11 exit('Access Denied'); 12 } 13  14 class dbstuff { 15 var $querynum = 0; 16 var $link; 17 var $charset; 18  19 /** 20 * 建立数据库连接 21 * @param string $dbhost 22 * @param string $dbuser 23 * @param string $dbpw 24 * @param string $dbname 25 * @param int $pconnect 26 * @param bool $halt 27 */ 28 function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) { 29 if($pconnect) {//是否采用了持久连接, 30 if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {//建立永久连接,永久连接不能通过mysql_close关闭 31 $halt &amp;&amp; $this->halt('Can not connect to MySQL server'); 32 } 33 } else { 34 if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw, 1)) {//建立数据库连接 35 $halt &amp;&amp; $this->halt('Can not connect to MySQL server'); 36 } 37 } 38  39 <span id="more-106"></span> 40  41 if($this->version() > '4.1') { 42 if($this->charset) { 43 @mysql_query("SET character_set_connection=$this->charset, character_set_results=$this->charset, character_set_client=binary", $this->link); 44 } 45 if($this->version() > '5.0.1') { 46 @mysql_query("SET sql_mode=''", $this->link); 47 } 48 } 49 if($dbname) { 50 @mysql_select_db($dbname, $this->link); 51 } 52 } 53 /** 54 * 选择数据库 55 * @param string $dbname 数据库名 56 * @return bool 57 */ 58 function select_db($dbname) { 59 return mysql_select_db($dbname, $this->link); 60 } 61  62 /** 63 * 获取查询的数组 64 * @param object $query 65 * @param string $result_type MYSQL_ASSOC 只得到关联索引,MYSQL_NUM 只得到数字索引 66 * @return array 67 */ 68 function fetch_array($query, $result_type = MYSQL_ASSOC) { 69 return mysql_fetch_array($query, $result_type); 70 } 71  72 /** 73 * 执行一条sql语句 74 * @param string $sql 要执行的sql语句 75 * @param string $type 如果$type为UNBUFFERED:则执行mysql_unbuffered_query();他与mysql_query的区别是,执行后不获取和缓存结果的行 76 * @return object 77 */ 78 function query($sql, $type = '') { 79 if(D_BUG) { 80 global $_SGLOBAL; 81 $sqlstarttime = $sqlendttime = 0; //sql开始时间与结束时间 82 $mtime = explode(' ', microtime()); 83 $sqlstarttime = number_format(($mtime[1] + $mtime[0] - $_SGLOBAL['supe_starttime']), 6) * 1000; 84 } 85 //如果定义$type='UNBUFFERED' 则执行mysql_unbuffered_query()函数 86 $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ? 87 'mysql_unbuffered_query' : 'mysql_query'; 88 if(!($query = $func($sql, $this->link)) && $type != 'SILENT') { 89 $this->halt('MySQL Query Error', $sql); 90 } 91 if(D_BUG) { 92 $mtime = explode(' ', microtime()); 93 $sqlendttime = number_format(($mtime[1] + $mtime[0] - $_SGLOBAL['supe_starttime']), 6) * 1000; 94 $sqltime = round(($sqlendttime - $sqlstarttime), 3);//获取php的结束时间 95  96 $explain = array(); 97 $info = mysql_info();//取得最近一条查询的信息 98 if($query && preg_match("/^(select )/i", $sql)) { 99 $explain = mysql_fetch_assoc(mysql_query('EXPLAIN '.$sql, $this->link));100 }101 $_SGLOBAL['debug_query'][] = array('sql'=>$sql, 'time'=>$sqltime, 'info'=>$info, 'explain'=>$explain);102 }103 $this->querynum++; //将执行的query数加1104 return $query;105 }106 /**107 * 取得前一次 MySQL 操作所影响的记录行数108 * @return int109 */110 function affected_rows() {111 return mysql_affected_rows($this->link);112 }113 /**114 * 返回上一个 MySQL 操作产生的文本错误信息115 * @return string116 */117 function error() {118 return (($this->link) ? mysql_error($this->link) : mysql_error());119 }120 /**121 * 返回上一个 MySQL 操作中的错误信息的数字编码122 * @return int123 */124 function errno() {125 return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());126 }127 /**128 * 取指定的结果集129 * @param object $query130 * @param int $row131 * @return string132 */133 function result($query, $row) {134 $query = @mysql_result($query, $row);135 return $query;136 }137 /**138 * 取得结果集的行数139 * @param object $query140 * @return int141 */142 function num_rows($query) {143 $query = mysql_num_rows($query);144 return $query;145 }146 /**147 * 取得字段数148 * @param object $query149 * @return int150 */151 function num_fields($query) {152 return mysql_num_fields($query);153 }154 /**155 * 释放结果内存156 * @param object $query157 * @return bool158 */159 function free_result($query) {160 return mysql_free_result($query);161 }162 /**163 * 取得上一步 INSERT 操作产生的 ID164 * @return int165 */166 function insert_id() {167 return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);168 }169 /**170 * 从查询语句中取一条记录171 * @param object $query172 * @return array173 */174 function fetch_row($query) {175 $query = mysql_fetch_row($query);176 return $query;177 }178 /**179 * 从结果集中取得列信息180 * @param object $query181 * @ret
UCHOME积分与经验机制
uchome的积分和经验机制,是为了让社区用户更好的互动,比如对日志的评论,上传图片等等一系列的互动操作。与积分和经验有关的数据库表uchome_space:会员的信息表,字段credit:积分,experience:经验。uchome_creditrule:积分规则表,奖励和扣除积分的类型(比如“一次性”,“一天一次”,“无周期”)uchome_creditlog:积分日志表,记录会员奖励和扣除积分。后台的操作,UCHOME定义好了一系列的类型,如果想要自己添加积分奖罚类型,就只能自己做二次开发。function_common文件的getreward函数获取指定动作能获得多少积分和经验,getreward第一个参数是类型,第二个是更新,第三个是奖罚uid,第四个是去除重复,第五个是否更新cookie。  =================================================== //获取指定动作能获得多少积分/**     Jackie 函数 getreward 5个参数 :*    $action         所执行动作*    $update       1:更新用户积分和经验并录入积分历史 0:不更新用户积分和经验也录入积分历史*    $uid               用户ID*    $needle        未知*    $setcookie  1 可选 有新值则重新记录cookie 反之*/function getreward($action, $update=1, $uid=0, $needle=”, $setcookie = 1) {}使用:getreward(‘report’, 1, $uid, ”, 0);  因为report不限次数与周期,所以可以尽情测试
uchome的积分机制
UCHOME2.0积分机制分析A:管理员在后台修改积分规则B:数据被写入数据表creditrule 中,其中rewardtype=1表示奖励措施rewardtype=0表示处罚措施并将数据写入缓存文件data/data_creditrule.php 中C:用户发表文章或者进行其他操作的时候,通过getreward函数来获取奖罚积分D:然后通过SQL语句将数据写入用户数据库表space中,从而增加或减少用户积分E:getreward函数部分通过包含data/data_creditrule.php 缓存文件来调用积分规则UCHOME积分变动提示是通过footer.htm监控的,代码如下:<script type="text/javascript">  showreward();</script> 查下source/script_common.js中showreward函数,找到AJAX处理页面为source/do_ajax.php中的getreward部分,代码如下代码} elseif($op == 'getreward') {    $reward = '';    if($_SCOOKIE['reward_log']) {        $log = explode(',', $_SCOOKIE['reward_log']);        if(count($log) == 2 && $log[1]) {            @include_once(S_ROOT.'./data/data_creditrule.php');            $query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('creditlog')." WHERE clid='$log[1]'");            $creditlog = $_SGLOBAL['db']->fetch_array($query);            $rule = $_SGLOBAL['creditrule'][$log[0]];            $rule['cyclenum'] = $rule['rewardnum']? $rule['rewardnum'] - $creditlog['cyclenum'] : 0;        }        ssetcookie('reward_log', '');    }    }   功能都在这里了,下面就开始往表creditlog里插条数据,我这里加的是天声人语的奖励规则。SQL如下:代码INSERT INTO `前缀_creditrule` (`rid` ,`rulename` ,`action` ,`cycletype` ,`cycletime` ,`rewardnum` ,`rewardtype` ,`norepeat` ,`credit` ,`experience`)VALUES (NULL , '天声人语', 'publishtsry', '1', '0', 1', '1', '0', '10', '1'); 你也可直接用PHPMYADMIN进行添加,值的含义参照后台其他积分的规则,更新一下缓存(重要)。然后在需要显示积分提示的地方加上:(注意红色地方是自定义的积分动作)//积分提示代码$reward = getreward('publishtsry', 0);$_SGLOBAL['db']->query('UPDATE '.tname('space')." SET credit=credit+$reward[credit], experience=experience+$reward[experience] WHERE uid='{$_SGLOBAL['supe_uid']}'");  
群组链接分析
<1>群组:------------查看:-----------------------------------------------------------------------------------------------------------------1.群组话题:          space.php?uid=1&do=thread   1.2热门话题:   space.php?uid=1&do=thread&view=hot   1.3最新话题:   space.php?uid=1&do=thread&view=new   1.4我的话题:   space.php?uid=1&do=thread&view=me   (补)1.5我回复的话题:。。。。。。  ******话题详细页:space.php?uid=1&do=thread&id=1 2.我参与的群组:              space.php?do=mtag&view=me    2.1话题数排行(默认):   space.php?do=mtag&view=me&fieldid=0&orderby=threadnum    2.2回帖数排行:           space.php?do=mtag&view=me&fieldid=0&orderby=postnum    2.3成员数排行:           space.php?do=mtag&view=me&fieldid=0&orderby=membernum3.我管理的群组:              space.php?do=mtag&view=manage    3.1话题数排行(默认):   space.php?do=mtag&view=manage&fieldid=0&orderby=threadnum    3.2回帖数排行:           space.php?do=mtag&view=manage&fieldid=0&orderby=postnum    3.3成员数排行:           space.php?do=mtag&view=manage&fieldid=0&orderby=membernum4.热门群组(默认):            space.php?do=mtag&view=hot    4.1话题数排行(默认):   space.php?do=mtag&view=hot&fieldid=0&orderby=threadnum    4.2回帖数排行:           space.php?do=mtag&view=hot&fieldid=0&orderby=postnum    4.3成员数排行:           space.php?do=mtag&view=hot&fieldid=0&orderby=membernum5.推荐群组:                    space.php?do=mtag&view=recommend    5.1话题数排行(默认):   space.php?do=mtag&view=recommend&fieldid=0&orderby=threadnum    5.2回帖数排行:           space.php?do=mtag&view=recommend&fieldid=0&orderby=postnum    5.3成员数排行:           space.php?do=mtag&view=recommend&fieldid=0&orderby=membernum6.搜索群组:   space.php?do=mtag&view=hot&searchkey=wjb&searchsubmit=%CB%D1%CB%F7%C8%BA%D7%E9&searchmode=1******群组详细页:        space.php?do=mtag&tagid=1*.1首页(默认):               space.php?do=mtag&tagid=1*.2讨论区:                    space.php?do=mtag&tagid=1&view=list*.3精华区:                    space.php?do=mtag&tagid=1&view=digest*.4成员列表:                 space.php?do=mtag&tagid=1&view=member(补)*.5群组活动:            space.php?do=mtag&tagid=1&view=event 编辑|管理:-----------------------------------------------------------------------------------------------------------------1.管理该成员:       <a href="cp.php?ac=mtag&op=manage&subop=member&tagid=1&uid=1"  id="a_mod_0" onclick="ajaxmenu(event, this.id, 1)" >管理该成员</a>         (页面)cp.php?ac=mtag&op=manage&subop=member&tagid=1&uid=1         (post) cp.php?ac=mtag&op=manage&tagid=1&subop=member&uid=1&grade=&group=&page=&start=2.创建群组:               cp.php?ac=mtag3.群组菜单:   3.1发起话题:       cp.php?ac=thread&tagid=1或cp.php?ac=thread   3.2发起活动:       cp.php?ac=event&tagid=1   3.3群组设置:       cp.php?ac=mtag&op=manage&tagid=1&subop=base   3.4成员管理:       cp.php?ac=mtag&op=manage&tagid=1&subop=members   3.5话题管理:       admincp.php?ac=thread&&perpage=20&tagid=1&searchsubmit=1   3.6回帖管理:       admincp.php?ac=post&&perpage=20&tagid=1&searchsubmit=1   3.7邀请好友:       cp.php?ac=mtag&op=manage&tagid=1&subop=invite   3.8退出群组:       cp.php?ac=mtag&op=out&tagid=1
discuz 经典php加密解密函数 authcode 解析
康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。原理如下,假如:加密明文:1010 1001密匙:1110 0011密文:0100 1010得出密文0100 1010,解密之需和密匙异或下就可以了解密密文:0100 1010密匙:1110 0011明文:1010 1001并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙。那我们一起看下康盛的authcode怎么做的吧Php代码// 参数解释   // $string: 明文 或 密文   // $operation:DECODE表示解密,其它表示加密   // $key: 密匙   // $expiry:密文有效期   function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {       // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙       $ckey_length = 4;              // 密匙       $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);              // 密匙a会参与加解密       $keya = md5(substr($key, 0, 16));       // 密匙b会用来做数据完整性验证       $keyb = md5(substr($key, 16, 16));       // 密匙c用于变化生成的密文       $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';       // 参与运算的密匙       $cryptkey = $keya.md5($keya.$keyc);       $key_length = strlen($cryptkey);       // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性       // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确       $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;       $string_length = strlen($string);       $result = '';       $box = range(0, 255);       $rndkey = array();       // 产生密匙簿       for($i = 0; $i <= 255; $i++) {           $rndkey[$i] = ord($cryptkey[$i % $key_length]);        }       // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度       for($j = $i = 0; $i < 256; $i++) {           $j = ($j + $box[$i] + $rndkey[$i]) % 256;           $tmp = $box[$i];           $box[$i] = $box[$j];           $box[$j] = $tmp;        }       // 核心加解密部分       for($a = $j = $i = 0; $i < $string_length; $i++) {           $a = ($a + 1) % 256;           $j = ($j + $box[$a]) % 256;           $tmp = $box[$a];           $box[$a] = $box[$j];           $box[$j] = $tmp;           // 从密匙簿得出密匙进行异或,再转成字符           $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));        }       if($operation == 'DECODE') {           // substr($result, 0, 10) == 0 验证数据有效性           // substr($result, 0, 10) - time() > 0 验证数据有效性           // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性           // 验证数据有效性,请看未加密明文的格式           if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {               return substr($result, 26);            } else {               return '';            }        } else {           // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因           // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码           return $keyc.str_replace('=', '', base64_encode($result));        }   }  
discuz模板解析注释
代码  1 <?php  2   3 function parse_template($tplfile, $objfile) {  4 global $options;  5   6 //循环嵌套次数  7 $nest = 3;  8   9 //打开模板文件 10 if(!$fp = fopen($tplfile, ‘rb’)) { 11 exit(’Current template file not found or have no access!’); 12 } 13  14 $template = fread($fp, filesize($tplfile)); 15 fclose($fp); 16  17 //匹配变量 18 //双引号(单引号)内的具有转义所以,要得到一个必须写为\;要得到一个$必须写为$;最后结果为$,可在正则中使用的变量符号 19 $var_regexp = “((\$[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)([[a-zA-Z0-9_-.”’[]$x7f-xff]+])*)”; 20  21 //匹配字符 22 $const_regexp = “([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)”; 23  24 //清除缩进(tab) 25 $template = preg_replace(”/([nr]+)t+/s”, “\1“, $template); 26  27 //清除注释(<!– –>),方便后续操作,不需要匹配多余的<!– 28 $template = preg_replace(”/<!--{(.+?)}-->/s”, “{\1}”, $template); 29  30 //将{LF}替换成一个硬回车(n) 31 $template = str_replace(”{LF}”, “<?=”\n“?>”, $template); 32  33 //匹配多种变量形式,包括$xxx[”xxxx”]与$xxx[$xxx]、或$xxx 34 $template = preg_replace(”/{(\$[a-zA-Z0-9_[]’”$.x7f-xff]+)}/s”, “<?=\1?>”, $template); 35  36 //使用/e修正符,可使替换元素以php代码执行后,再进行replace. 37 $template = preg_replace(”/$var_regexp/es”, “addquote(’<?=\1?>’)”, $template); 38  39 //再次替换叠加字符串变量 40 $template = preg_replace(”/<?=<?=$var_regexp?>?>/es”, “addquote(’<?=\1?>’)”, $template); 41  42 //子模板嵌套解析 43 $template = preg_replace(”/[nrt]*{templates+([a-z0-9_]+)}[nrt]*/is”, “n<? include template(’\1′); ?>n”, $template); 44 $template = preg_replace(”/[nrt]*{templates+(.+?)}[nrt]*/is”, “n<? include template(\1); ?>n”, $template); 45  46 //eval语法解析 47 $template = preg_replace(”/[nrt]*{evals+(.+?)}[nrt]*/ies”, “stripvtags(’n<? \1; ?>n’,”)”, $template); 48  49 //echo语法解析 50 $template = preg_replace(”/[nrt]*{echos+(.+?)}[nrt]*/ies”, “stripvtags(’n<? echo \1; ?>n’,”)”, $template); 51  52 //elseif语法解析 53 $template = preg_replace(”/[nrt]*{elseifs+(.+?)}[nrt]*/ies”, “stripvtags(’n<? } elseif(\1) { ?>n’,”)”, $template); 54  55 //else语法解析 56 $template = preg_replace(”/[nrt]*{else}[nrt]*/is”, “n<? } else { ?>n”, $template); 57  58 for($i = 0; $i < $nest; $i++) { 59 $template = preg_replace(”/[nrt]*{loops+(S+)s+(S+)}[nr]*(.+?)[nr]*{/loop}[nrt]*/ies”, “stripvtags(’n<? if(is_array(\1)) { foreach(\1 as \2) { ?>’,'n\3n<? } } ?>n’)”, $template); 60 $template = preg_replace(”/[nrt]*{loops+(S+)s+(S+)s+(S+)}[nrt]*(.+?)[nrt]*{/loop}[nrt]*/ies”, “stripvtags(’n<? if(is_array(\1)) { foreach(\1 as \2 => \3) { ?>’,'n\4n<? } } ?>n’)”, $template); 61 $template = preg_replace(”/[nrt]*{ifs+(.+?)}[nr]*(.+?)[nr]*{/if}[nrt]*/ies”, “stripvtags(’n<? if(\1) { ?>’,'n\2n<? } ?>n’)”, $template); 62 } 63  64 //常量直接输出.. 65 $template = preg_replace(”/{$const_regexp}/s”, “<?=\1?>”, $template); 66  67 //相临定界符清除(使语法更加连贯) 68 $template = preg_replace(”/ ?>[nr]*<? /s”, ” “, $template); 69  70 if(!@$fp = fopen($objfile, ‘wb’)) { 71 exit(’Directory ’./cache/template/’ not found or have no access!’); 72 } 73  74 //转换链接中的&符号为&使编译模板读取时能够正常不会将其视为引用.. 75 $template = preg_replace(”/”(http)?[w./:]+?[^”]+?&[^”]+?”/e”, “transamp(’\0′)”, $template); 76  77 flock($fp, 2); 78 fwrite($fp, $template); 79 fclose($fp); 80 } 81  82 //转换&避免&以引用方式执行.. 83 function transamp($str) { 84 $str = str_replace(’&’, ‘&’, $str); 85 $str = str_replace(’&’, ‘&’, $str); 86 $str = str_replace(’”‘, ‘”‘, $str); 87 return $str; 88 } 89  90 //将$var字符串,转换为可执行的php代码形式,并返回其结果.. 91 //”转换为”,将为[xxx]转换为[’xxx’] 92 function addquote($var) { 93 return str_replace(”\”", “”", preg_replace(”/[([a-zA-Z0-9_-.x7f-xff]+)]/s”, “[’\1′]”, $var)); 94 } 95  96 //设置语言变量 97 function languagevar($var) { 98 return $GLOBALS[’language’][$var] ? $GLOBALS[’language’][$var] : “!$var!”; 99 }100 //清理或转换标签为php语法101 function stripvtags($expr, $statement) {102 $expr = str_replace(”\”", “”", preg_replace(”/<?=(\$.+?)?>/s”, “\1“, $expr));103 $statement = str_replace(”\”", “”", $statement);104 return $expr.$statement;105 }106 107 ?> 
discuz模板语法定义
Discuz! 的模板采用近似 PHP 表达式的语法,支持的元素如下:<!–{ … }–>逻辑元素包围符,该符号用于包含条件和循环元素条件判断<!--{if expr1}-->statement1<!--{elseif expr2}-->statement2<!--{else}-->statement3<!--{/if}-->这 是一个典型的条件模板,当条件 expr1 为真时,显示模板 statement1 内容,否则当 expr2 为真时,显示模板 statement2 内容,否则显示模板 statement3 的内容。如同其他语言中的条件控制一样,其中 <!–{elseif expr}–> 和 <!–{else} –> 是非必须的。不带下标变量的数组循环<!--{loop $array $value}-->statement<!--{/loop}-->相当于 PHP 的数组循环语句:foreach($array as $value) {statement}带下标变量的数组循环<!--{loop $array $key $value}-->statement<!--{/loop}-->相当于 PHP 的数组循环语句:foreach($array as $key => $value) {statement}逻 辑元素包围符在 { } 外面包含了 html 的注释符号 <!– –>,除了为了和信息元素相区别外,也方便了使用 Dreamweaver 和 Frontpage 之类工具编辑模板的用户。因逻辑元素会被识别为 html 的注释而不被显示,对于绝大多数用户,逻辑元素中的内容是完全不需要修改的,甚至修改错一个字符就可能引起错误信息和整个系统无法运行。因此通常您在修改 模板的时候,不要修改模板的逻辑信息,更不要将逻辑信息内部元素(如 <!–{else}–> 等)的前后位置作以修改,否则可能会导致错误。如果您的模板被不慎修改损坏,请立即用原标准默认模板覆盖,即可恢复。对于高手而言,实际上外部的 <!– –> 是可以省略不写的,可以用于某些元素在模板中的定位,但强烈建议普通用户不要轻易尝试。{ … }信息元素包围符{CONSTANT}可以引用界面替换变量,其中必须为大写字母,该符号实际的作用是引用 PHP 常量 CONSTANT,因此也可以通过它来引用其他的常量内容。{lang variable}可 以在模板中引用语言变量 variable 的内容,语言变量经由 templates.php.lang 中数组 $language 定义。如 {lang post_edit} 的内容在编译模板的时候被替换为 $language['post_edit'] 的内容,简体中文版的意思是“编辑帖子”。{template name}模板嵌入符,为了避免模板的冗长,可以使用本符号来将 name 模板的内容嵌入本模板中(实际上为引用)。{eval statement}运行 PHP 语句体 statement。推荐只在特别必须的时候才使用该结构,因为它会破坏模板的结构和可读性。如 {eval echo ‘template!’;} 实现的功能为 echo ‘template’;{LF}换行符,因为 Discuz! 模板引擎会忽略掉多余的换行(n),这个符号用来成生需要的 n。我 们所推荐的模板修改方法:通过普通编辑器手工书写 html 或通过 Dreamweaver 或 Frontpage 修改。但是修改需切记,同一逻辑元素内或嵌套中元素的位置和内容切勿修改,即通常情况下,您不能把 <!–{}–> 包围的内容单独的移动,更不能删除。但是整个最外部逻辑结构是可以移动或删除的。如果修改后模板所在页面在输出类似如下的错误信息 Parse error: parse error, unexpected ‘}’ in /home/username/forums/forumdata/templates/1_login.tpl.php on line 6,说明模板中出现了无法匹配,或格式错误的逻辑元素,请仔细检查是否有元素不对应,没有结束或嵌套损坏,格式错误的现象,必要时可以恢复原始模板来解决 问题。Discuz! 提供了方便的界面打包程序,前面已对其格式做了介绍,将导出信息的内容粘贴到 系统设置 中 风格方案 中的 导入界面方案 中,执行即可。程序会自动解析数据内容,恢复相关的界面设置,自定义替换变量和所需的模板设置。如果被导出界面使用了非默认模板,必须将 ./templates 目录属性设置为 777,以便导入程序自动建立模板记录和文件夹。定义变量说明<?exit?><!–{eval $i=2}–><!–{if $i==1}–>123<!–{/if}–><!–{block name=”spaceblog” parameter=”notype/1/order/i.dateline,i.lastpost/limit/0,14/cachetime/900 /cachename/newti/tpl/data”}–><!–最新日志–><!–{eval $i=0;}–><!–{loop $_SBLOCK['newti'] $value}–><!–{if $i % 2 == 0}–>//如果i除以2的余数等于0<div class=”listbg”><!–{else}–><div class=”listbg2″><!–{/if}–>· [<span class="listA">$value[typename]</span>]<aclass=”listA” href=”$value[url]” title=”$value[subjectall]” target=”_blank”>$value[subject]</a></div><!–{eval $i++;}–><!–{/loop}–><!–{eval for ($i=1; $i<=5; $i++){ }–><!–{eval echo “Hello World!<br />”;}–><!–{eval}}–> 
Discuz二次开发基本知识
一) Discuz!的文件系统目录注:想搞DZ开发,就得弄懂DZ中每个文件的功能。a) Admin:后台管理功能模块b) Api:DZ系统与其它系统之间接口程序c) Archiver:DZ中,用以搜索引擎优化的无图版d) Attachments:DZ中 ,用户上传附件的存放目录e) Customavatars:DZ中,用户自定义头像的目录f) Forumdata:DZ缓存数据的存放目录g) Images:DZ模板中的图片存放目录h) Include:DZ常用函数库,基本功能模块目录i) Ipdata:DZ统计IP来路用的数据j) Plugins:DZ插件信息的存放目录k) Templates:DZ模板文件的存放目录l) Wap:DZ无线,Wap程序处理目录二) 必须记熟Discuz!数据库设计的每个表的功能,每个表中每个字段的功能。关于DZ数据库设计文档,请参阅DZ相关的项目文档(请从本贴附件中下载)三) Discuz!的流程控制a)后台流程控:DZ后台所有的功能,均需要注册到admincp.php文件,每个功能都至少有一个或一个以上的Action(动作),在 admincp.php中,可以定义Action的执行权限,分别为:“admin==1”管理员,或“admin==2 ||admin==3”超级版主和版主,每个Action对应一个脚本文件,脚本文件的命名为action.inc.php(*.inc.php),并存 放在admin目录下,如执行:admincp.php?action=dodo,相当于执行admin目录下的dodo.inc.php文件b) 前台流程控制:前台的流程控制比较简单:流程是自由的,如:首页:index.php会员注册:register.php;会员登录:logging.php发贴程序:post.php会员信息:member.php论坛内容:forumdisplay.php查看贴子:viewthread.php…大部分功能,此处不一一列出…c) DZ根目下的config.inc.php属于整个DZ系统的配置文件四) Discuz!的数据处理过程a) DZ对mysql的数据库操作处理全部封装在dbstuff(db_mysql.class.php)类中b) 所在的外部数据均通过“daddslashes()”初步过滤,然后再过滤,再根据需要处理五) Discuz!的显示控制(网站多样式风格输出)a) 显示层就是大家通常所看到的网站风格了。DZ中每套风络分别在templates及images下对应一个风格文件的存放目录。网站风格的制作,请参阅详细的DZ风格制作文档b)DZ网站风格文件处理的原理:其实很简单,DZ使用template.func.php中的parse_template()以PHP正则运算把 htm模文件中的模板标签,转换成了PHP代码,并根据styleid保存在forumdata/templates下,这个有点像Smarty中的技 术。六) DZ中的语言处理a) DZ前台及后台中、英语言的实现,均是把语句定义成了语变量,然后在模板输入,语句变量的赋值,均放在模板目录中的*.lang.php文件中,DZ在生成网站风格时就加载了这相应的语言包。七) DZ如何处理用户信息(存取、计算、更新过程)新手要做二次开发,都必须掌握这数组中,每个数组元素的意义。a) DZ的基本信息,如用户信息,Session信息存在如下变量中:a). $_DCACHEb). $_COOKIEc). $_DCOOKIEd). $_DSESSIONe). $_DPLUGINb) 可以通过print_r($GLOBALS),打印全部变量八) DZ中缓存处理机制a) DZ中缓存处理过程都放在“cache.func.php”中,DZ的缓存处理比较简单,其原理是把一个数组转换成了PHP代码,并保存在缓存目录下,大家可打开缓存文件查看便知。b) 使用方法:如果在新开的功能中,需要缓存某部分数据,基本上就是:1)定义并注册缓存名字。2)从数据读取相应的数据。3)数据在写入缓存前作相应处理。4)最后写入缓存。具体操作,可以看文件中的代码,做相应的修改即可九) DZ中模板处理机制a) DZ独创的模板处理技术,类似于Smarty中的模板处理,只是具体算法,过程不同,Smarty是一种重型模板引擎方案。其原理都是把模板中的变量转换成相应的PHP代码,这个过程实际是模访JAVA中的一次编译,多处运行。十) DZ中权限处理机制a) 对于DZ中前台的每相action都有$discuz_action定义,DZ根据用户所在的用户组来判定用户是否具有相应操作$discuz_action的权限。至于后台的权限权验证,则更简单了,依据“admin==1”来确定的十一) DZ中如何实现URL静态化a) DZ中的静态有两法,只要懂ReWrite规划的朋友,一看就知。十二) DZ独创的HTML编辑器,如何截取并使用,如果进行Discuz!代和Html代码的转换a)这也算是DZ比较牛的一项技术了,在早期版中,因DZ编辑器的不足,使得很多用户放弃了DZ。实现原理:通过JS把用的一些操作转换成了DZ的 bbcode代码。这样子提交了安全性,将带有bbcode代码的内容存入数据,在用户打开页页时,又把bbcode代码转换成html代码本贴声明:由于时间有限,本贴只有关于DZ部分功能的简短分析。[Copy to clipboard] [ - ]CODE:部分文件说明:admincp.php 管理ajax.php ajax功能announcement.php 公告attachment 附件board.php 真正的首页config.inc.php 这个是配置文件corpus.php 论坛文集digest.php 精华帖子discuz_version.php 论坛版本号faq.php 问题列表forumdisplay.php 论坛列表index.php 跳转页面loggin.php 认证页面(登录退出)mail_config.inc.php 邮件配置member.php 用户操作memcp.php 个人控制面版misc.php 零碎功能my.php 我的帖子plugin.php 插件pm.php 短信post.php 发送帖子redirect.php 页面重定向register.php 注册robots.txt 限制搜索rss.php rss信息发布search.php 论坛查询secode.php 验证码stats.php 统计topic.php 首页论坛专题topicadmin 主题管理viewpro.php 显示个人信息viewthread.php 主题显示文件夹admin 管理api 接口archiver 文档attachments 附件customavatars 自定义表情forumdata 论坛数据包含缓冲数据images 图片include 公共文件install 安装包ipdata ip地址plugins 插件readme 帮助文档templates 模板utilities 工具包wap 手机网站文件夹includeadvertisements.inc.php 广告管理ajax.js ajax相关attachment.func.php 附件函数集bbscode.js 论坛表情cache.fun.php 缓存函数集category.inc.php 栏目chinese.class.phpcommon.inc.php 最主要的头文件common.js 最主要的js文件corpus.func.php 论坛文集函数counter.inc.php 论坛计数cron.func.php 计划任务db_mysql.class.php 数据库db_mysql_error.inc.php 数据库错误debug.php 调试信息discuzcode.func.php 论坛代码editor.func.php 编辑器editor.js 编辑器editpost.inc.php 编辑帖子floatadv.js 浮动广告forum.func.php 论坛函数集global.func.php 全局函数menu.js 菜单misc.func.php 其它newreply.inc.php 新回复newthread.inc.php 新主题*pmprompt.inc.phppost.fun.php 发表主题printable.inc.php 论坛打印qihoo.js qihoorelatethreads.inc.php 相关主题security.inc.php 安全sendmail.inc.php 邮件serverbusy.htm 系统繁忙template.func.php 模板threadpay.inc.php 购买帖子
Discuz!二次开发基本知识
必须至少具备如下技能:1) 能够理很好理解MVC构架的原理(虽然DZ不是MVC架构的)2) 扎实的PHP基础,熟悉结构化程序,OOP程序的写法及应用3)熟悉MYSQL就用,掌握SQL语言,懂SQL优化者更佳4) 熟悉使用Discuz!的各项功能一) Discuz!的文件系统目录注:想搞DZ开发,就得弄懂DZ中每个文件的功能。a) Admin:后台管理功能模块b) Api:DZ系统与其它系统之间接口程序c) Archiver:DZ中,用以搜索引擎优化的无图版d) Attachments:DZ中 ,用户上传附件的存放目录e) Customavatars:DZ中,用户自定义头像的目录f) Forumdata:DZ缓存数据的存放目录g) Images:DZ模板中的图片存放目录h) Include:DZ常用函数库,基本功能模块目录i) Ipdata:DZ统计IP来路用的数据j) Plugins:DZ插件信息的存放目录k) Templates:DZ模板文件的存放目录l) Wap:DZ无线,Wap程序处理目录二) 必须记熟Discuz!数据库设计的每个表的功能,每个表中每个字段的功能。关于DZ数据库设计文档,请参阅DZ相关的项目三) Discuz!的流程控制a) 后台流程控:DZ后台所有的功能,均需要注册到admincp.php文件,每个功能都至少有一个或一个以上的Action(动作),在admincp.php中,可以定义Action的执行权限,分别为:“admin==1”管理员,或“admin==2 admin==3”超级版主和版主,每个Action对应一个脚本文件,脚本文件的命名为action.inc.php(*.inc.php),并存放在admin目录下,如执行:admincp.php?action=dodo,相当于执行admin目录下的dodo.inc.php文件b) 前台流程控制:前台的流程控制比较简单:流程是自由的,如:首页:index.php会员注册:register.php;会员登录:logging.php发贴程序:post.php会员信息:member.php论坛内容:forumdisplay.php查看贴子:viewthread.php   …大部分功能,此处不一一列出…c) DZ根目下的config.inc.php属于整个DZ系统的配置文件 四) Discuz!的数据处理过程a) DZ对mysql的数据库操作处理全部封装在dbstuff(db_mysql.class.php)类中b) 所在的外部数据均通过“daddslashes()”初步过滤,然后再过滤,再根据需要处理五) Discuz!的显示控制(网站多样式风格输出)a) 显示层就是大家通常所看到的网站风格了。DZ中每套风络分别在templates及images下对应一个风格文件的存放目录。网站风格的制作,请参阅详细的DZ风格制作文档b) DZ网站风格文件处理的原理:其实很简单,DZ使用template.func.php中的parse_template()以PHP正则运算把htm模文件中的模板标签,转换成了PHP代码,并根据styleid保存在forumdata/templates下,这个有点像Smarty中的技术。六) DZ中的语言处理a) 前台及后台中、英语言的实现,均是把语句定义成了语变量,然后在模板输入,语句变量的赋值,均放在模板目录中的*.lang.php文件中,DZ在生成网站风格时就加载了这相应的语言包。七) DZ如何处理用户信息(存取、计算、更新过程)新手要做二次开发,都必须掌握这数组中,每个数组元素的意义。a) DZ的基本信息,如用户信息,Session信息存在如下变量中:a). $_DCACHEb). $_COOKIEc). $_DCOOKIEd). $_DSESSIONe). $_DPLUGINb) 可以通过print_r($GLOBALS),打印全部变量八) DZ中缓存处理机制a) DZ中缓存处理过程都放在“cache.func.php”中,DZ的缓存处理比较简单,其原理是把一个数组转换成了PHP代码,并保存在缓存目录下,大家可打开缓存文件查看便知。b)使用方法:如果在新开的功能中,需要缓存某部分数据,基本上就是:1)定义并注册缓存名字。2)从数据读取相应的数据。3)数据在写入缓存前作相应处理。4)最后写入缓存。具体操作,可以看文件中的代码,做相应的修改即可九) DZ中模板处理机制a) DZ独创的模板处理技术,类似于Smarty中的模板处理,只是具体算法,过程不同,Smarty是一种重型模板引擎方案。其原理都是把模板中的变量转换成相应的PHP代码,这个过程实际是模访JAVA中的一次编译,多处运行。十) DZ中权限处理机制a) 对于DZ中前台的每相action都有$discuz_action定义,DZ根据用户所在的用户组来判定用户是否具有相应操作$discuz_action的权限。至于后台的权限权验证,则更简单了,依据“admin==1”来确定的十一) DZ中如何实现URL静态化a) DZ中的静态有两法,只要懂ReWrite规划的朋友,一看就知。十二) DZ独创的HTML编辑器,如何截取并使用,如果进行Discuz!代和Html代码的转换a) 这也算是DZ比较牛的一项技术了,在早期版中,因DZ编辑器的不足,使得很多用户放弃了DZ。实现原理:通过JS把用的一些操作转换成了DZ的bbcode代码。这样子提交了安全性,将带有bbcode代码的内容存入数据,在用户打开页页时,又把bbcode代码转换成html代码   转自:http://www.discuz.net/forum.php?mod=viewthread&tid=636553&extra=%26page%3D1&page=1   
【Discuz 7.2】使用手记头像上传出错、不显示头像等
1、头像上传出错,提示“Access denied for agent changed” 解决办法:进后台管理》Ucenter》应用管理》Discuz应用提示“通信失败”》编辑》删除应用IP的内容(默认为127.0.0.1)》保存》回到应用管理界面,显示通信成功;测试头像上传功能,正常了 如仍有问题,参见Access denied for agent changed 的参考解决方法 2、帖子内容页面上,头像没有显示,如下图所示 Discuz帖子界面头像没有显示解决办法:后台管理》界面》界面设置》帖子内容页》是否显示作者头像 选“是”,顺便在这里把帖子相关的设置都修改了一下,改完保存,头像出来了,效果如下图: Discuz帖子界面头像有显示3、在个人中心的个人资料里找不到昵称设置 解决办法:后台设置》用户》用户组》某一用户组 详情》基本设置》允许使用昵称 选“是”》保存;好了,昵称可以设置了。竟然默认情况下大部分用户组是不允许设置昵称的。 4、允许用户切换论坛界面的风格 解决方法:后台设置》界面》风格管理》预览、安装、启用多个模板风格;后台设置》界面》界面设置》全局》显示风格切换按钮 选“是”》保存;风格切换按钮会显示了,如下图: Discuz 风格切换按钮在这里还可以设置论坛跳转菜单、左右分栏显示、浮动窗口等。 5、模板风格Logo替换 解决方法:需要对不同的模板做单独的替换或设置,视模板Logo图片的默认路径而定;有两种方法可以实现Logo替换。 方法一:重命名新的Logo图片文件名为模板默认的Logo图片文件名,并上传覆盖掉原来的图片文件。此法的优点是操作简单,多风格共用一个模板的 情况下(如系统原装的Colors模板即包括多个色调风格),只需要一步操作;缺点是文件后缀名受限,同一图片文件不一定适合多个色调风格,此操作可能需 要用户清空浏览器缓冲才能看到新的Logo。 方法二:上传新的Logo图片到模板图片文件夹下;后台设置》界面》风格管理》某一风格 编辑》论坛Logo 设定为新Logo图片的文件名》保存。此法优点是各风格独立设置Logo图片,符合风格特点,无需用户清空浏览器缓冲即可看到结果,保留了原Logo图片 文件;缺点是多风格共用一个模板的情况下需要一个个编辑风格。 推荐使用第二种方法。 6、论坛支持RSS输出 解决方法:后台设置》全局》论坛功能》其他》启用RSS 选“是”,设置好RSS TTL》保存;搞定。 启用后,在论坛版块界面的右上角会看到RSS的图标。7、启用WAP访问界面 解决方法:后台设置》全局》WAP设置》启用WAP 选“是”》保存;搞定。 8、论坛新手任务 解决方法:后台设置》扩展》论坛任务》管理》是否启用论坛任务 选“是” 勾选希望启用的新手任务并设置顺序》保存;特别说明:一个好汉三个帮、联络感情、我的第一次、回帖是一种美德4个新手任务在启用前都需要进行编辑、设定一些参数。注:新增加的新手任务只对之后新注册的用户有效,原来的用户不会看到新加的新手任务。9、论坛签到任务解决办法:方法一、每日抢楼签到插件,不少论坛为活跃气氛都用这个,有需要的自己搜一下。方法二、使用论坛任务功能实现签到任务;后台设置》扩展》论坛任务》添加》红包类任务》任务名称为“每日红包”、任务时间间隔为“24”小时、做好其他设置》提交;在任务管理里启用该任务,完成。10、其他设置用户组的设置如有疑问可参考Discuz! 多用户组分析及详解。其他常规设置基本上大家找找也能找到,就不列了。如果不知道在哪儿的话,在后台设置的右上角有个搜索框,可以搜索后台的设置项目,很方便。[完毕]
GD LINUX主机空间目录下没有提供htaccess文件!
GD LINUX主机空间目录下没有提供htaccess文件! 由于我的GD LINUX主机空间目录下没有提供htaccess文件,而我又想让我的站点支持伪静态,请大家提供一个htaccess文件(论坛上那个文件下载以后就是一个空文件,啥都没有)===============================================htaccess文件内容如下: # 将 RewriteEngine 模式打开 RewriteEngine On# 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 / RewriteBase /# Rewrite 系统规则请勿修改 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^topic-(.+).html$ portal.php?mod=topic&topic=$1&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^article-([0-9]+)-([0-9]+).html$ portal.php?mod=view&aid=$1&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^forum-(w+)-([0-9]+).html$ forum.php?mod=forumdisplay&fid=$1&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+).html$ forum.php?mod=viewthread&tid=$1&extra=page%3D$3&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^group-([0-9]+)-([0-9]+).html$ forum.php?mod=group&fid=$1&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^space-(username|uid)-(.+).html$ home.php?mod=space&$1=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^([a-z]+)-(.+).html$ $1.php?rewrite=$2&%1  ===========================================我是用了楼上的附件,再从DZ的后台,把论坛主题列表页 {fid}, {page}  forum-{fid}-{page}.html改为了forum-forumdisplay-fid-{fid}-page={page}.html后就好了     摘自:http://bbs.idcspy.com/viewthread.php?tid=154886&page=1#pid736087    
解决DISCUZ X1.5帖子标题80字符限制
DISCUZ X1.5帖子标题有个80字符限制,个人感觉字数少了些,何况UTF-8下一个汉字占了3个字节,DISCUZ X1.5主题标题80字符也就是限制最多只能用26个汉字。怎么修改这个呢?比如我要修改为120字view plaincopy to clipboardprint?// source/function/function_post.php  // 修改:  strlen($subject) > 80  // 为:  strlen($subject) > 120    // static/js/forum_post.js  // 修改:  mb_strlen(theform.subject.value) > 80  // 为:  mb_strlen(theform.subject.value) > 120  // 修改:  showDialog('您的标题超过 80 个字符的限制');  // 为:  showDialog('您的标题超过 120 个字符的限制');    // static/js/forum.js  // 修改:  mb_strlen(theform.subject.value) > 80  // 为:  mb_strlen(theform.subject.value) > 120  // 修改:  s = '您的标题超过 80 个字符的限制。';  // 为:  s = '您的标题超过 120 个字符的限制。';    // templates/default/forum/post.htm  // 修改:  strLenCalc(this, 'checklen', 80);  // 为:  strLenCalc(this, 'checklen', 120);  // 修改:  <strong id="checklen">80</strong>  // 为:  <strong id="checklen">120</strong>    // templates/default/forum/forumdisplay_fastpost.htm  // 修改:  strLenCalc(this, 'checklen', 80);  // 为:  strLenCalc(this, 'checklen', 120);  // 修改:  <strong id="checklen">80</strong>  // 为:  <strong id="checklen">120</strong>    // source/language/lang_message.php  // 修改:  'post_subject_toolong' => '对不起,你的标题超过 80 个字符'  // 为:  'post_subject_toolong' => '对不起,你的标题超过 120 个字符'  
DISCUZ X1.5主题分类和分类信息写进TITLE
假如DISCUZ X1.5开启了主题分类和分类信息,你会发现主题分类和分类信息列表页的TITLE标题依然统一为“版块名称 – 论坛名称”,假如我要这样“主题分类 – 分类信息 – 版块名称 – 论坛名称”这样是不是会更利于SEO优化呢,答案当然是肯定的。根据我自己的DISCUZ X1.5论坛的特征(因为我就用一个分类信息,所以在DZ X1.5后台开启了分类信息的“默认显示分类”),我需要主题分类和分类信息列表页的TITLE标题如下的SEO优化效果1、如果点开的页面有主题分类也有分类信息,TITLE标题显示为“主题分类 – 分类信息 – 论坛名称”2、如果点开的页面无主题分类也无分类信息,TITLE标题显示为“版块名称 – 论坛名称”3、如果点开的页面有主题分类无分类信息,TITLE标题显示为“主题分类 – 版块名称 – 论坛名称”4、如果点开的页面无主题分类有分类信息,TITLE标题显示为“分类信息 – 论坛名称”修改方法如下sourcemoduleforumforum_forumdisplay.php修改view plaincopy to clipboardprint?$navtitle = $_G['forum']['name'];  为view plaincopy to clipboardprint?//判断分类信息是否存在开始  if(emptyempty($_G['gp_sortid'])){      $navtitle = $_G['forum']['name'];  }  else{      $navtitle = '';  }  //判断分类信息是否存在结束  修改view plaincopy to clipboardprint?$navtitle = $_G['forum']['name'].' - '.strip_tags($forumup);  }  为view plaincopy to clipboardprint?//判断分类信息是否存在开始  if(emptyempty($_G['gp_sortid'])){      $navtitle = $_G['forum']['name'].' - '.strip_tags($forumup);  }  else{      $navtitle = ' - '.strip_tags($forumup);  }  //判断分类信息是否存在结束  }  //navtitle修改开始  if(!emptyempty($_G['gp_sortid'])){      $navtitle = $_G['forum']['threadsorts']['types'][$_G['gp_sortid']].$navtitle;  }  if(!emptyempty($_G['gp_typeid'])){      $navtitle = $_G['forum']['threadtypes']['types'][$_G['gp_typeid']].' - '.$navtitle;  }  //navtitle修改结束  代码的关键在于主题分类:$_G['forum']['threadtypes']['types'][$_G['gp_typeid']]分类信息:$_G['forum']['threadsorts']['types'][$_G['gp_sortid']]在DZ7等以前版本中好像是主题分类:$forum['threadtypes']['types'][$thread['typeid']]分类信息:$forum['threadsorts']['types'][$thread['sortid']]
Discuz! X1简单SEO
Discuz! X1针对以往版本最大的区别就是增加了门户,发现了门户与论坛的标题都是相同的,并且index.php和portal.php都指向根目录,这样就造成了三个地址的页面内容重复,而导致搜索引擎降权,这样不利于SEO。提出以下修改方案。首先,把index.php统一指向到根目录,就是要把index.php都改成”/”1、页面顶部LOGO的,templatedefaultcommonheader.html2、导航条的,templatedefault下所有文件批量更换”index.php”为”/”其次,Discuz! X1顶部导航两个页面为portal.php和forum.php,比如我要把forum.php设定为首页1、在数据库common_nav表里更改forum.php为”/”,这个对应后台:界面 – 导航栏再次,Discuz! X1导航条里论坛页面还会显示forum.php,也要把这个改掉,尽一切可能消除被搜索引擎收录重复页的可能1、在sourcemoduleforum下所有文件批量更换”forum.php”为”/”这样改后,index.php,forum.php全部都改成了根目录”/”,现在修改Discuz! X1门户标题和论坛标题重复修改templatedefaultcommonheader.htm的TITLE区$_G['setting']['bbname']为view plaincopy to clipboardprint?<!--{if $_G['basescript'] == 'portal'}-->$_G['setting']['sitename']<!--{else}-->$_G['setting']['bbname']<!--{/if}-->  同时到Discuz! X1后台:界面 – 站点信息 – 网站名称为门户标题,对应sitename,站点名称对应bbname,这样就能实现门户标题为sitename,论坛标题为bbname了。
Discuz!X1.5 全面解析之辅助运营篇三:完整的积分系统 建立社区价值体系
每一个站点就像一个社会的缩影,在这个虚拟社会中,会员可以赚取金钱、获得威望、做出贡献,还可以参与主题和商品的购买,这些操作都需要通过积分来体现。 积分在站点中的两大作用就是衡量用户级别和参与站内交易。另外,公平、合理的积分系统也能增加用户的荣誉感和积极性,站长灵活的运营和调整积分策略能偶很 好的辅助社区运营,例如实现虚拟积分兑换实物礼品,鼓励用户活跃而增加积分;开通虚拟积分交易而促进用户互动等等。一、积分衡量用户级别站点中区分用户级别使用的是总积分,总积分是通过一定的计算公式得出的,其参与选项包括发帖数、主题数、精华帖数、用户总在线时间、好友数、记录数、日志 数、相册数、投票数、分享数,以及各项扩展积分项。站长可以通过对这些选项进行“+ - * / ()”等运算,得出符合自身站点要求的总积分公式。2010-8-31 14:18 上传下载附件 (6.04 KB)Discuz! X1.5 系统中内置了8种扩展积分,站长可以在 管理中心 => 全局 => 积分设置 中,将其设置成金钱、威望、贡献、体力等体现会员不同方面的活跃性的选项,完全可以满足不同站点的积分项需要。2010-8-31 14:18 上传下载附件 (8.41 KB)拥有了各项积分后,站点的会员就不再只是一个头像、一个名字这样单调了,可以是一个在站点中有金钱、有威望、有地位的人,形象也更加立体起来。例如:会员的虚拟财富可通过金钱来实现,会员的地位可通过威望来衡量,会员的积极性可通过贡献来体现。2010-8-31 14:18 上传下载附件 (19.29 KB)二、积分作为虚拟货币流通当扩展积分项被设置为交易积分后,用户就可以用这些积分来进行站点的虚拟物品或实体物品的交易,形成一套虚拟的货币流通机制。虚拟物品交易包括主题、附件的购买,悬赏、评分的给予,以及商品的交易等。2010-8-31 14:18 上传下载附件 (31.39 KB)三、积分策略有了所需要的积分后,对各项积分如何来设置其增减策略,对站长来说也是一件非常重要的事情。根据站点自身的需要,来对每一项积分制定恰当的增减策略,可以 有效地建立起一套合理的站点积分体制。例如,以广场为主的站点,可以相应地增加会员发帖、回帖时所获得的积分值;而以会员的博客分享为主的站点,则可以相 应地增加会员发表日志时所获得的积分。每一项积分的增减规则可以由站点在“积分策略”中予以设定。由于 X1.5 的系统是结合了论坛、群组、家园等的一个统一的站点系统,所以会员在站点中的活动,无论是在论坛里发帖、回复,在群组里讨论,或是在家园里发表日志、图 片、分享等,都可以在这里设置全站统一的积分策略。2010-8-31 14:18 上传下载附件 (8.69 KB)特别要注意的是,如果在某个版块中单独设置了积分策略,那么版块中的增减策略优先级要高于全站积分策略。如下图中,版块的积分策略中,输入框中为本版的积分策略,旁边的括号中是全站积分策略中此项的设置,当两项数值不一致时,以版块设置为优先。2010-8-31 14:18 上传下载附件 (9.67 KB)