本帖最后由 suxiaojack 于 2011-1-6 18:12 编辑
DiscuzX的DIY模块使用起来确实很爽,很多功能都有了,但是对于二次开发的内容来说还是无法直接使用封装得太狠了点。
DIY模块,在编辑之后数据存放于数据库common_block表之中,在模板文件htm里以{block/bid}的形式存在,当实际运行显示时通过函数调用数据并显示出来,和显示帖子的原理类似。
最终的函数位于/source/function/function_block.php中的,function block_display_batch($bid)。
我们来修改这个文件,让自定义HTML模块DIY可以使用PHP代码。
- #suxiaojack 这里是重头戏阿!要让PHP语句执行,HTML语句输出.
- function block_display_batch($bid) {
- #echo block_fetch_content($bid);
- sx_block_display_batch($bid);
- /*
- 处理之后的效果:
- 可以在展示类,自定义HTML的模块中,书写PHP代码块
- [html]htmlcode[/html]
- [php]phpcode[/php]
- 注意:使用eval函数处理所以不支持流程的混合书写!!所以尽量全部用php处理。
- 特别注意:
- 1、变量由于是在eval函数中故而需要\$varname的形式书写,即正常的书写前添加\
- 2、索引字符串,正常情况书写为$var['thestr'],在eval中既是已经在串中写为\$var[thestr]即可
- */
- }
- function sx_block_display_batch($bid)
- {
- global $_G;
- if($_G['block'][$bid]['blockclass']=="html_html") #只处理自定义HTML模块
- {
- $cache_code=$mixed_code=block_fetch_content($bid);
- #切分code
- #$mixed_code=preg_replace("/"/","\\"",$mixed_code);
- #变'号
- $mixed_code=preg_replace("/\'/","\\\'",$mixed_code);
- #获取内部html
- $mixed_code=preg_replace("/\[html\](.*)\[\/html\]/is","echo('\\1');",$mixed_code);
- #获取内部php
- $mixed_code=preg_replace("/\[php\](.*)\[\/php\]/is","eval('\\1');",$mixed_code);
- #切分模块
- $html_code_arr=preg_split("/>e(.*);</is",$mixed_code);
-
- if(count($html_code_arr)==2){
- #分割正确,输出特殊的东东。
- $mixed_code=preg_replace("/(.*)>e(.*);<(.*)/is","e\\2;",$mixed_code);
- echo $html_code_arr[0].">";
- eval($mixed_code);
- echo "<".$html_code_arr[1];
- }else
- {
- #不能处理,则原封不动输出
- echo $cache_code;
- };
- }else
- {
- echo block_fetch_content($bid);
- };
-
- }
复制代码
这样修改之后,可以DIY试试了!添加展示类,静态展示类,自定义HTML。
写入
[html]Cool Thing:<BR>[/html]
[php]
\$sql="select * from ".DB::table("common_block");
\$query=DB::query(\$sql);
while(\$row=DB::fetch(\$query))
{
echo("\$row[blockclass]<BR/>");
};
[/php]
看看效果吧!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/suxiaojack/archive/2011/01/02/6113025.aspx
上面的代码,还是不爽, 修正了一下,基本上很方便书写了,不再继续修改.
- #支持流程中混合处理,原理:把所有内容看作一个不分割的phpcode
- #不支持[php]=\$var[/php]输出,要用echo("\$var")来输出。
- #修正语句错误时,DIY失效问题。
- function sxx_block_display_batch($bid)
- {
- $mixed_code=block_fetch_content($bid);
- #手动取类型,全局的有时候不好用。
- $sql="select blockclass from ".DB::table("common_block")." where bid=$bid";
- $query=DB::query($sql);
- if($row=DB::fetch($query))
- {
- $blockclass=$row['blockclass'];
- }else
- {
- echo ("no block id:$bid,Please check your database.");
- echo ($mixed_code);
- return;
- };
- if(
- $blockclass=="html_html" #只处理自定义HTML模块
- && ($_GET['diy']!="yes") #支持DIY当语句错误时可以修改
- )
- {
- #不用[html][/html]了html直接写
- $mixed_code=preg_replace("/\[html\]|\[\/html\]/i","",$mixed_code);
-
- $phpmark1="/?"; #可以采取两种书写方式 /? phpcode ?/ 或者 [php] phpcode [/php]
- $phpmark1end="?/";
- $phpmark2="[php]";
- $phpmark2end="[/php]";
- $phpmark= (stripos($mixed_code,$phpmark1,0) ? $phpmark1:$phpmark2);
- $phpmarkend = ( stripos($mixed_code,$phpmark1,0) ? $phpmark1end:$phpmark2end ) ;
- $phpmarkslen= ( stripos($mixed_code,$phpmark1,0) ? 2:5 );
- $phpmarkelen= ( stripos($mixed_code,$phpmark1,0) ? 2:6 );
- $spos=0;
- $epos=0;
- $mixed_cool="";
- do
- {
- $epos=stripos($mixed_code,$phpmark,$spos);
- if($epos!==false)
- {
- //有头部HTML?
- $html_code=substr($mixed_code,$spos,$epos-$spos);
- $mixed_cool.="echo('$html_code');";
- //获取PHP代码
- $spos=$epos+$phpmarkslen;
- $epos=stripos($mixed_code,$phpmarkend,$spos);
- if($epos!==false)
- {
- $php_code=substr($mixed_code,$spos,$epos-$spos);
- $spos=$epos+$phpmarkelen;
- $mixed_cool.=$php_code;
- }else
- {
- echo("error!no php_end_mark.");
- echo($mixed_code);
- return;
- };
- }else
- {
- //有尾部HTML?
- $html_code=substr($mixed_code,$spos);
- $mixed_cool.="echo('$html_code');";
- };
- }while($epos!==false);
- eval($mixed_cool);
- }
- else
- {
- echo($mixed_code);
- };
- };
- 测试代码:
- Cool Thing:<BR>
- /?
- \$sql="select * from ".DB::table("common_block");
- \$query=DB::query(\$sql);
- while(\$row=DB::fetch(\$query))
- {
- echo("\$row[blockclass]");
- ?/
- <BR><HR>
- /?
- };
- ?/
- <BR>
- Cool Thing Is It?
复制代码
|