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 , 我想问的是 , 它是怎么解析到值的 ? 非常非常感谢 !!!!

解决方案 »

  1.   

    $dtp2->SetNameSpace('field', '[', ']');field 字段
    [ 开弧
    ] 闭弧用数据表字段内容去替代模板中用[]括起的模板变量
      

  2.   

    呵呵,版主,你没明白我的意思 .
    我的意思是 , 怎么给
    [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 天下来觉得这个模板 ... 只是个人感觉 , 写的不是太好 , 至少效率方面肯定进步的余地 .