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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[发布] 自定义HTML模板DIY支持PHP代码解析

[复制链接]
suxiaojack 发表于 2011-1-2 23:04:05 | 显示全部楼层 |阅读模式
Discuz!模板
适用版本: Discuz! X1.5
语言编码: GBK简体 UTF8简体 BIG5繁体 UTF8繁体 
风格转换者: 原创
本帖最后由 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代码。

  1. #suxiaojack 这里是重头戏阿!要让PHP语句执行,HTML语句输出.
  2. function block_display_batch($bid) {
  3.         #echo block_fetch_content($bid);
  4.         sx_block_display_batch($bid);
  5.         /*
  6.         处理之后的效果:
  7.         可以在展示类,自定义HTML的模块中,书写PHP代码块
  8.         [html]htmlcode[/html]
  9.         [php]phpcode[/php]
  10.         注意:使用eval函数处理所以不支持流程的混合书写!!所以尽量全部用php处理。
  11.         特别注意:
  12.         1、变量由于是在eval函数中故而需要\$varname的形式书写,即正常的书写前添加\
  13.         2、索引字符串,正常情况书写为$var['thestr'],在eval中既是已经在串中写为\$var[thestr]即可
  14.         */
  15. }

  16. function sx_block_display_batch($bid)
  17. {
  18.         global $_G;
  19.         if($_G['block'][$bid]['blockclass']=="html_html") #只处理自定义HTML模块
  20.         {
  21.                 $cache_code=$mixed_code=block_fetch_content($bid);
  22.                 #切分code
  23.                 #$mixed_code=preg_replace("/"/","\\"",$mixed_code);
  24.                 #变'号
  25.                 $mixed_code=preg_replace("/\'/","\\\'",$mixed_code);
  26.                 #获取内部html
  27.                 $mixed_code=preg_replace("/\[html\](.*)\[\/html\]/is","echo('\\1');",$mixed_code);
  28.                 #获取内部php
  29.                 $mixed_code=preg_replace("/\[php\](.*)\[\/php\]/is","eval('\\1');",$mixed_code);
  30.                 #切分模块
  31.                 $html_code_arr=preg_split("/>e(.*);</is",$mixed_code);
  32.                
  33.                 if(count($html_code_arr)==2){
  34.                 #分割正确,输出特殊的东东。
  35.                         $mixed_code=preg_replace("/(.*)>e(.*);<(.*)/is","e\\2;",$mixed_code);
  36.                         echo $html_code_arr[0].">";
  37.                         eval($mixed_code);
  38.                         echo "<".$html_code_arr[1];
  39.                 }else
  40.                 {
  41.                 #不能处理,则原封不动输出
  42.                         echo $cache_code;
  43.                 };
  44.         }else
  45.         {
  46.                 echo block_fetch_content($bid);
  47.         };
  48.         
  49. }
复制代码



这样修改之后,可以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


上面的代码,还是不爽, 修正了一下,基本上很方便书写了,不再继续修改.
  1. #支持流程中混合处理,原理:把所有内容看作一个不分割的phpcode
  2. #不支持[php]=\$var[/php]输出,要用echo("\$var")来输出。
  3. #修正语句错误时,DIY失效问题。
  4. function sxx_block_display_batch($bid)
  5. {
  6.         $mixed_code=block_fetch_content($bid);
  7.         #手动取类型,全局的有时候不好用。
  8.         $sql="select blockclass from ".DB::table("common_block")." where bid=$bid";
  9.         $query=DB::query($sql);
  10.         if($row=DB::fetch($query))
  11.         {
  12.                 $blockclass=$row['blockclass'];
  13.         }else
  14.         {
  15.                 echo ("no block id:$bid,Please check your database.");
  16.                 echo ($mixed_code);
  17.                 return;
  18.         };
  19.         if(
  20.             $blockclass=="html_html" #只处理自定义HTML模块
  21.             && ($_GET['diy']!="yes") #支持DIY当语句错误时可以修改
  22.           )
  23.         {
  24.                 #不用[html][/html]了html直接写
  25.                 $mixed_code=preg_replace("/\[html\]|\[\/html\]/i","",$mixed_code);
  26.                
  27.                 $phpmark1="/?"; #可以采取两种书写方式 /? phpcode ?/ 或者 [php] phpcode [/php]
  28.                 $phpmark1end="?/";
  29.                 $phpmark2="[php]";
  30.                 $phpmark2end="[/php]";
  31.                 $phpmark= (stripos($mixed_code,$phpmark1,0) ? $phpmark1:$phpmark2);
  32.                 $phpmarkend = ( stripos($mixed_code,$phpmark1,0) ? $phpmark1end:$phpmark2end ) ;
  33.                 $phpmarkslen= ( stripos($mixed_code,$phpmark1,0) ? 2:5 );
  34.                 $phpmarkelen=  ( stripos($mixed_code,$phpmark1,0) ? 2:6 );
  35.                 $spos=0;
  36.                 $epos=0;
  37.                 $mixed_cool="";
  38.                 do
  39.                 {
  40.                         $epos=stripos($mixed_code,$phpmark,$spos);
  41.                         if($epos!==false)
  42.                         {
  43.                                 //有头部HTML?
  44.                                 $html_code=substr($mixed_code,$spos,$epos-$spos);
  45.                                 $mixed_cool.="echo('$html_code');";
  46.                                 //获取PHP代码
  47.                                 $spos=$epos+$phpmarkslen;
  48.                                 $epos=stripos($mixed_code,$phpmarkend,$spos);
  49.                                 if($epos!==false)
  50.                                 {
  51.                                         $php_code=substr($mixed_code,$spos,$epos-$spos);
  52.                                         $spos=$epos+$phpmarkelen;
  53.                                         $mixed_cool.=$php_code;
  54.                                 }else
  55.                                 {
  56.                                         echo("error!no php_end_mark.");
  57.                                         echo($mixed_code);
  58.                                         return;
  59.                                 };
  60.                         }else
  61.                         {
  62.                                 //有尾部HTML?
  63.                                 $html_code=substr($mixed_code,$spos);
  64.                                 $mixed_cool.="echo('$html_code');";
  65.                         };
  66.                 }while($epos!==false);
  67.                 eval($mixed_cool);
  68.         }
  69.         else
  70.         {
  71.                 echo($mixed_code);
  72.         };
  73. };

  74. 测试代码:
  75. Cool Thing:<BR>
  76. /?
  77. \$sql="select * from ".DB::table("common_block");
  78. \$query=DB::query(\$sql);
  79. while(\$row=DB::fetch(\$query))
  80. {
  81.    echo("\$row[blockclass]");
  82. ?/
  83.     <BR><HR>
  84. /?
  85. };
  86. ?/
  87. <BR>
  88. Cool Thing Is It?

复制代码







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

2

查看全部评分

coolloyal 发表于 2011-1-2 23:04:28 | 显示全部楼层
技术贴支持!!
回复

使用道具 举报

zounei 发表于 2011-1-2 23:07:24 | 显示全部楼层
回复

使用道具 举报

songyingwu 发表于 2011-1-2 23:14:58 | 显示全部楼层
留个记号,牛X
回复

使用道具 举报

veshow 发表于 2011-1-2 23:45:28 | 显示全部楼层
虽然看不懂 还是希望多点这样的帖子
回复

使用道具 举报

江海博客网 发表于 2011-1-3 01:35:16 | 显示全部楼层
veshow 发表于 2011-1-2 23:45
虽然看不懂 还是希望多点这样的帖子

回复

使用道具 举报

benls 发表于 2011-1-3 01:53:52 | 显示全部楼层
新手学习,虽然看不懂,但是一定要收藏的
回复

使用道具 举报

sz2320497 发表于 2011-1-3 13:49:42 | 显示全部楼层
回复

使用道具 举报

relanx 发表于 2011-1-3 14:30:19 | 显示全部楼层
www.mrsmrs.com
回复

使用道具 举报

emporer 发表于 2011-1-3 14:37:21 | 显示全部楼层
路过顶上一贴!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 23:31 , Processed in 0.234095 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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