标签discuz下的文章

Jerry Bendy 发布于 09月15, 2013

解决Discuz签到插件《DSU每日签到》贴子已关闭无法回复的问题

好多站长朋友都应该知道在Discuz中有一个很实用的签到插件叫做DSU每日签到,该插件使用方便功能又比较丰富,所以很受用户好评。但使用这个插件签到发布的贴子却是无法回复的,我打开论坛“广播”功能,所有的签到都会同步到“广播”里面,而对于好友的一些签到信息却眼看着又不能评论,这似乎完全违备了“广播”这个SNS的概念,无交流何论坛呢?

那好吧,那就想办法不让它发布新贴的时候自动关闭,根源肯定是要在DSU每日签到的源代码中去找了。我们知道,在论坛文章页管理员查看时可以看到标题上面关于加精、置顶、高亮等的操作栏,里面有一个“打开”或“关闭”的链接,就是控制打开或者关闭贴子回复的,当然我们不可能一个个去设置。找Discuz的官方帮助可以看到这个论坛贴子的打开或关闭是保存在数据库“pre_forum_thread”里面的,其中有一个字段叫做“closed”用于存储是否关闭的信息,“0”是开启,“1”是关闭,既然知道了这个,下面只需要查找每日签到的源代码里面有没有“closed”这几个字母就可以了。

用FTP把每日签到的所有代码文件全部下载到本地,用文本工具(如Notepad++、UltraEdit等)批量打开,然后在所有已打开文件中查找字符串“closed”,最终在一个名为“sign.inc.php”的文件中找到的搜索结果,打开文件在第241行和第294行可以看到如下内容:

//第241行
DB::query(“INSERT INTO “.DB::table(‘forum_thread’).” (fid, posttableid, readperm, price, typeid, sortid, author, authorid, subject, dateline, lastpost, lastposter, displayorder, digest, special, attachment, moderated, highlight, closed, status, isgroup) VALUES (‘$tofid’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘$_G[username]’, ‘$_G[uid]’, ‘$todaysay’, ‘$_G[timestamp]’, ‘$_G[timestamp]’, ‘$_G[username]’, ‘0’, ‘0’, ‘0’, ‘0’, ‘1’, ‘1’, ‘1‘, ‘512’, ‘0’)”);
//第294行
DB::query(“INSERT INTO “.DB::table(‘forum_thread’).” (fid, posttableid, readperm, price, typeid, sortid, author, authorid, subject, dateline, lastpost, lastposter, displayorder, digest, special, attachment, moderated, highlight, closed, status, isgroup) VALUES (‘$var[fidnumber]’, ‘0’, ‘0’, ‘0’, ‘$var[qdtypeid]’, ‘0’, ‘$_G[username]’, ‘$_G[uid]’, ‘$subject’, ‘$_G[timestamp]’, ‘$_G[timestamp]’, ‘$_G[username]’, ‘0’, ‘0’, ‘0’, ‘0’, ‘1’, ‘1’, ‘1‘, ‘0’, ‘0’)”);

很明显这是在执行向数据库中插入记录的SQL语句,语句中设置的倒数第3个字段就是“closed”,而且值是“1”,所以就直接导致了每次发布的新主题都是默认关闭的。在这里只需要把值里面对应的位置(也是倒数第3个)的“1”改成“0”就可以了。

阅读全文 »

Jerry Bendy 发布于 09月14, 2013

不用更新Discuz缓存就可以快速调试模板的方法

我们在制作Discuz模板的时候经常会遇到一个问题,就是每次修改CSS或者htm文件后都必须要在后台更新缓存后再可以看出来效果,这样就严重地降低了我们的工作效率,今天我给大家分享的这个不用更新缓存的方法其实是看的cr180的视频里面的,虽然视频里面没有提及到这个用处。

Discuz是一个多入口的程序,关于单一入口和多入口可以参见我之前分享的文章《{% post_link "php-only-entry-feature" "PHP单一入口的特有作用2" %}》,既然是一个多入口的程序这样就给了我们一个创建自定义入口的机会,在cr180的教程里面当然也提到了创建自定义入口,即:复制论坛根目录下任一入口文件,如forum.php、portal.php、group.php等,并重新命名为自己需要的名字,然后修改里面定义的APPTYPEID和CURSCRIPT常量等。这两个常量可以改成任何自定义的值,当然最好不要与系统自带的重复,不然会发生什么我也不知道。

下面是我修改好的一个入口文件,可以把代码复制下来并粘贴到一个新建的php文件中去:

<?php
define('APPTYPEID', 431); //可以改成任一自己的ID
define('CURSCRIPT', 'icetest'); //可以改成任一名称

require './source/class/class_core.php';
$cachelist = array();

C::app()->cachelist = $cachelist;
C::app()->init();

runhooks();

$navtitle = '123456'; //新窗口的标题

include template('diy:index');
?>

如上:带有注释的三行可以根据需要自行修改。

顺带提一下最后一行,template函数的参数中,“diy:”的意思是页面可以被DIY,加上这4个字符就会在页面的右上角出来一个“自定义”按钮,后面的“index”是指模板目录下的index.htm或者index.php文件,如果文件不存在就会报错。所以需要在您新建的模板目录下放置这个文件并且在后台中把当前风格切换成新建的这个。cr180的教程里在index前面加上了模板目录名,但是这样会多了一层文件夹,好处是无需在后台设置当前风格。

举个例子,例如我们新建的模板目录名是./template/ice_test/,那么以上代码中的“index”就是指./template/ice_test/index.htm(或php),如果此处文件不存在的话就会查找./template/default/index.htm(或php);而cr180的例子中最后一行代码是include template('diy:ice_test/index'),这样系统就会去查找./template/ice_test/ice_test/index.htm,没错,多了一层目录。

关于index.htm里面应该写什么内容就随你了,要善用“{subtemplate }”函数,如自动加载header、footer并带有一个DIY区域的写法:

<!--{subtemplate common/header}-->

<!--[diy=diy1]--><div id="diy1" class="area"></div><!--[/diy]-->

</div>

<!--{subtemplate common/footer}-->

其它页面方法一样,看着来好啦!

阅读全文 »