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]
看看效果吧!
上面的代码,还是不爽, 修正了一下,基本上很方便书写了,不再继续修改.
#支持流程中混合处理,原理:把所有内容看作一个不分割的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?