首页 > CMS > 织梦DEDE > 正文

dedecms模板原理,实现标签替换

2024-07-12 09:11:22
字体:
来源:转载
供稿:网友
正则匹配出所有的arclist标签并构造SQL
 
取出数据并替换field为相应字段的数据
 
为field标签添加一个function属性
 
<?php
 
require_once(dirname(__FILE__)."/../include/common.inc.php");
 
//1. 读入模板文件
 
$str = file_get_contents('test.html');
 
//2. 使用正则匹配出页面中所有的 arclist 标签
 
$re = '/{dede:arclist(.*)}(.*){//dede:arclist}/Us';
 
// 执行正则匹配
 
// 第一个参数:正则 
 
// 第二个参数:字符串
 
// 第三个参数:这个函数会把匹配到的结果放第三个参数的数组中
 
// 返回值:匹配到的个数
 
preg_match_all($re, $str, $a);
 
//3. 循环每一个匹配到的arclist标签进行处理 
 
foreach ($a[0] as $k => $v)
 
{
 
   /****************处理标签1.根据标签上的属性构造一个SQL语句 **************/
 
   // 取出标签相应的属性字符串并把属性转化成一个数组,如 row="10" channelid="17" addfields="pffz,pfrs,yuyan" orderby="id" orderway="desc"
 
   $attrArr = strToArray($a[1][$k]);
 
   // 根据构造构造SQL语句上的变量
 
   if(isset($attrArr['row']))
 
       $limit = $attrArr['row'];
 
   else
 
       $limit = 20;
 
   if(isset($attrArr['orderby']))
 
       $orderby = $attrArr['orderby'];
 
   else
 
       $orderby = 'id';
 
   if(isset($attrArr['orderway']))
 
       $orderway = $attrArr['orderway'];
 
   else
 
       $orderway = 'desc';
 
   // 连表的属性
 
   if(isset($attrArr['channelid']))
 
       $leftJoin = ' LEFT JOIN dede_addon17 b ON a.id=b.aid ';
 
   else
 
       $leftJoin = '';
 
   if(isset($attrArr['addfields']))
 
       $extraFields = ','.$attrArr['addfields'];
 
   else
 
       $extraFields = '';
 
   // 解析属性
 
   
 
   $sql = "SELECT a.*$extraFields
 
           FROM dede_archives a $leftJoin
 
            ORDER BY $orderby $orderway
 
            LIMIT $limit";
 
   $dsql->Execute('me', $sql);
 
   $html = '';
 
   // 每个arclist对应的多个数据
 
   while($row = $dsql->GetArray('me'))
 
   {
 
       // 重置模板字符串,不要在原模板上面进行替换
 
       $_tep = $a[2][$k];
 
       /**
 
       <li>
 
           <img src="[field:litpic/]" /><br />
 
            标题:[field:title/]<br />
 
            评分分值:[field:pffz    function="getSmallStar(@me)"/]<br />
 
            评分人数:[field:pfrs/]<br />
 
            语言:[field:yuyan/]
 
       </li>
 
   **/
 
       // 把字符串中的[field:xxxx/]替换成$row['xxxx']变量。
 
       $_re = '//[field:(/w+)(/s+function=("|/')(/w+)/((.*)/)/3)?///]/U';
 
       preg_match_all($_re, $_tep, $_a);
 
       /**
 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表