DEDE 官方论坛不允许新注册用户发帖 ... 这样的 , 这么一串 HTML 代码
{dede:arclist flag='h' limit='0,1' infolen='230'}
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:info/]...<a href="[field:arcurl/]">[查看全文]</a></p>
{/dede:arclist}
这么一段代码 , 对应 taglib/arclist.lib.php
中我看到解
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:info/]...<a href="[field:arcurl/]">[查看全文]</a></p>
这么一段代码 , 也就是 arclist 标签的 InnerText 的解法是这样的 .arclist.lib.php line 472-474
$dtp2 = new DedeTagParse();
$dtp2->SetNameSpace('field', '[', ']');
$dtp2->LoadString($innertext);这个 DedeTagParse() 这个我可以理解 , 它首先根据 SetNameSpace 设置好 TagStartWord 和 EndWord , 而后根据这些东西使用 FOR 循环整个字符串 , 其中使用 STRPOS 对比匹配出标签 , 并将标签全部存于类数组 CTags 中 .
随后调用 MakeOneTag 方法让那些 taglib 下面存在文件的方法获取 TagValue .
而后再使用 GetResult 方法将值按照解析式 STRPOS 的位置插入 HTML 中随后返回完整字符串 .这个过程好理解 , 但不好理解的事
$dtp2->SetNameSpace('field', '[', ']');
MakeOneTag 中 taglib 下没有 filed.lib.php , 并且 , AssignSysTag 中也没有 field 的解析 .
而且 , 这里不会走到 MakeOneTag , 我想问的是 , 它是怎么解析到值的 ? 非常非常感谢 !!!!
{dede:arclist flag='h' limit='0,1' infolen='230'}
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:info/]...<a href="[field:arcurl/]">[查看全文]</a></p>
{/dede:arclist}
这么一段代码 , 对应 taglib/arclist.lib.php
中我看到解
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:info/]...<a href="[field:arcurl/]">[查看全文]</a></p>
这么一段代码 , 也就是 arclist 标签的 InnerText 的解法是这样的 .arclist.lib.php line 472-474
$dtp2 = new DedeTagParse();
$dtp2->SetNameSpace('field', '[', ']');
$dtp2->LoadString($innertext);这个 DedeTagParse() 这个我可以理解 , 它首先根据 SetNameSpace 设置好 TagStartWord 和 EndWord , 而后根据这些东西使用 FOR 循环整个字符串 , 其中使用 STRPOS 对比匹配出标签 , 并将标签全部存于类数组 CTags 中 .
随后调用 MakeOneTag 方法让那些 taglib 下面存在文件的方法获取 TagValue .
而后再使用 GetResult 方法将值按照解析式 STRPOS 的位置插入 HTML 中随后返回完整字符串 .这个过程好理解 , 但不好理解的事
$dtp2->SetNameSpace('field', '[', ']');
MakeOneTag 中 taglib 下没有 filed.lib.php , 并且 , AssignSysTag 中也没有 field 的解析 .
而且 , 这里不会走到 MakeOneTag , 我想问的是 , 它是怎么解析到值的 ? 非常非常感谢 !!!!
[ 开弧
] 闭弧用数据表字段内容去替代模板中用[]括起的模板变量
我的意思是 , 怎么给
[field:xx/] 赋值 .
我又看了一阵子 , 完全看懂了 , 自己写了一个给数组赋值的 lib .假定有这样一个数组 :
array(array('name' => 'book','xx'=>'tt'),
array('name' => 'kt','xx'=>'ewr'),
array('name' => 'cc','xx'=>'bgfd'));我需要在模板中使用
{dede:book}
[field:name/] [field:xx/] <br />
{/dede:book}
来呈现这样的内容 :
book tt
kt ewr
cc bgfd
我研究之后发现和吃饭一样简单 ... 因为自己开始没看仔细看 , 加上首页基本没有用到 DedeTagParse::Assign 的方法全被 AssignSysTag 和 MakeOneTag 解决了 ... 所以二了一下 , 这个非常简单 .
在 MakeSysTag 方法解决掉仅有的几种 global , include , foreach 等之后 , 按照
PartView::SetTemplet 方法在执行完 DedeTagParse::ParseTemplet , DedeTagParse::Display 之前会调用一下 PartView::ParseTemplet 方法 , 这里就包含了助手函数中的 MakeOneTag 函数 , 根据这个函数所列路径 , 在 include/taglib/ 中加一个 book.lib.php 文件即可 , 内这样写就可以了 - - ...if(!defined('DEDEINC'))
{
exit("Request Error!");
}
function lib_book(&$ctag,&$refObj)
{
//echo('<pre>');print_r($ctag);exit('</pre>');
$revalue = '';
$arr = array(array('name' => 'book','xx'=>'tt'),
array('name' => 'kt','xx'=>'ewr'),
array('name' => 'cc','xx'=>'bgfd'));
global $dsql;
$innertext = $ctag->InnerText;
$dtp2 = new DedeTagParse();
$dtp2->SetNameSpace('field', '[', ']');
$dtp2->LoadString($innertext);
foreach($arr as $k=>$v){
foreach($dtp2->CTags as $_k=>$tag){
$dtp2->Assign($_k,$v[$tag->GetName()]);
}
$revalue .= $dtp2->GetResult();
}
return $revalue;
}... 谢谢版主啊 , 这样就能在页面中曾现出该效果了 - - 之前二了 没认真看 , 也因为那个类里方法本生就很多 .
研究了 1 天下来觉得这个模板 ... 只是个人感觉 , 写的不是太好 , 至少效率方面肯定进步的余地 .