dedecms模板原理,實現(xiàn)標簽替換
時間: 2020-03-13 09:28
閱讀: 次
作者:素材無憂網(wǎng)
正則匹配出所有的arclist標簽并構造SQL
取出數(shù)據(jù)并替換field為相應字段的數(shù)據(jù)
為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';
// 執(zhí)行正則匹配
// 第一個參數(shù):正則
// 第二個參數(shù):字符串
// 第三個參數(shù):這個函數(shù)會把匹配到的結果放第三個參數(shù)的數(shù)組中
// 返回值:匹配到的個數(shù)
preg_match_all($re, $str, $a);
//3. 循環(huán)每一個匹配到的arclist標簽進行處理
foreach ($a[0] as $k => $v)
{
/****************處理標簽1.根據(jù)標簽上的屬性構造一個SQL語句 **************/
// 取出標簽相應的屬性字符串并把屬性轉化成一個數(shù)組,如 row="10" channelid="17" addfields="pffz,pfrs,yuyan" orderby="id" orderway="desc"
$attrArr = strToArray($a[1][$k]);
// 根據(jù)構造構造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對應的多個數(shù)據(jù)
while($row = $dsql->GetArray('me'))
{
// 重置模板字符串,不要在原模板上面進行替換
$_tep = $a[2][$k];
/**
<li>
<img src="[field:litpic/]" /><br />
標題:[field:title/]<br />
評分分值:[field:pffz function="getSmallStar(@me)"/]<br />
評分人數(shù):[field:pfrs/]<br />
語言:[field:yuyan/]
</li>
**/
// 把字符串中的[field:xxxx/]替換成$row['xxxx']變量。
$_re = '/\[field:(\w+)(\s+function=("|\')(\w+)\((.*)\)\3)?\/\]/U';
preg_match_all($_re, $_tep, $_a);
/**
標簽: