DEDE一些实用标签及自定义标签方法 dede仿站调用标签方法
取得当前栏目的id{dede:fieldname='id'/}
当前栏目名称:{dede:fieldname='typename'/}
栏目列表页:
取得当前栏目的id{dede:fieldname='id'/}
当前栏目名称:{dede:fieldname='typename'/}
文章内容页:
取得当前文章的id:{dede:fieldname='id'/}
当前文章所属栏目名称:{dede:fieldname='typename'/}
其它标签:
用于循环和遍历中的计数器(每次+1):[field:globalname=autoindex/]
将中文截取指定字节数:[field:titlefunction='cn_substr(@me,16)'/]
{dede:sql}标签:
sql标签可以称得上是个万能标签了,查询数据库将其输出:
1.用来输出统计内容,这个是不错的,举个例子,我们来统计下总共发了多少的文章,思路就是输出dede_addonarticle这个文章附加表内容总数就可以了。
{dede:sqlsql="SELECTCOUNT(*)ASnumsFROMdede_addonarticle"}
[field:name="nums"/]
{/dede:sql}
2.使用~field~来进行特殊的查询,比如之前论坛上面很多会员需要做一个输出当前发布文章会员的相关内容,之前用sql或者arclist标签是没办法实现的,因为每篇内容是不同的,这里我们来用5.5的sql语句来做个示范。
我们首先在文章模板中相应的位置加上下面的标签
{dede:sqlsql="SELECT*FROMdede_archivesWHEREwriter=~writer~"}
[field:id/],
{/dede:sql}
这个放到article_article.htm页面,将会检索出当前会员发布的相关文章,这里的~writer~会根据当前内容的环境变量进行替换后再执行查询。
这里出现在SQL语句中条件查询的~writer~,也就是$refObj->Fields[$value]这个里面的相关内容
{dede:php}标签:
许多人希望织梦的模板标签能够更加灵活,加入可以运行PHP的功能,这里在DedeCMSV5.5中就加入了一个可以执行php的特殊标签{dede:php}{/dede:php},这个标签可以执行PHP语句了。
我这里举几个常用的例子:
1.最简单的输出内容:
{dede:php}
$numA=1;
$numB=2;
echo$numA+$numB;
{/dede:php}
这个输出的内容是计算结果:3
2.结合SQL查询输出单条内容
{dede:php}
$row=$dsql->GetOne('selectid,typenamefromdede_arctypewhereid=2');
print_r($row);
{/dede:php}
这个输出的内容是
Array
(
[id]=>2
[typename]=>问答
)
3.获取当前页面的变量
比如我们这里进入系统后台的[模板]-[全局标记测试],我们在代码中填入下面的内容:
{dede:php}
print_r($refObj->Fields);
{/dede:php}
如果环境变量保持默认,即“不使用环境ID”,我们会看到以下的结果:
Array
(
[typeid]=>0
[phpurl]=>/plus
[indexurl]=>/
[templeturl]=>/templets
[memberurl]=>/member
[specurl]=>/special
[indexname]=>主页
[templetdef]=>/templets/default
)
那我们再换个环境变量测试看看,这里以我本地的栏目为测试了:
Array
(
[id]=>3
[reid]=>0
[topid]=>0
[sortrank]=>1
[typename]=>产品
[typedir]=>{cmspath}/product
……
[indexname]=>主页
[templetdef]=>/templets/default
[position]=>主页>产品>
[title]=>产品
)
这样一来就检索出当前页面的局部变量了,接下来我们可以来结合前面的SQL语句来实现根据不同环境ID调用内容不同栏目内容。
例如:
{dede:php}
$thisid=$refObj->Fields['id'];
$row=$dsql->GetOne('selectid,typenamefromdede_arctypewhereid='.$thisid);
print_r($row);
{/dede:php}
这样是来调用当前栏目的标题,这个标签功能类似于{dede:field.typename/}
自定义标签:
DedeCMS从V5.3开始就支持自己扩展标签,不过许多新人很少用那个东西,今天我就来简单的介绍下如何编写自己的调用标签。
我们需要知道下扩展标签的存放目录及文件名构成,首先,扩展的标签都是存放在/include/taglib这个目录,名称都是以“标签名.lib.php”格式,例如{dede:channel/}标签对应的是channel.lib.php文件。
我们可以看一个示例标签:demotag.lib.php
if(!defined('DEDEINC'))
{
exit("RequestError!");
}
functionlib_demotag(&$ctag,&$refObj)
{
global$dsql,$envs;
//属性处理
$attlist="row|12,titlelen|24";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items,EXTR_SKIP);
$revalue='';
//你需编写的代码,不能用echo之类语法,把最终返回值传给$revalue
//------------------------------------------------------
$revalue='HelloWord!';
//------------------------------------------------------
return$revalue;
}
?>
我们登录系统后台的[模板]-[全局标签测试]中运行{dede:demotag/},显示如下的结果:
这里我们知道,其实标签生成的内容其实是这个函数的一个返回值,这里返回的内容都是字符串,也就是函数return$revalue;中的$revalue需要是经过处理后生成的字符串。
$attlist="row|12,titlelen|24";这个是属性列表,这个经过函数处理后会直接生成变量并复制,我们可以测试下,做如下的修改:
$revalue='HelloWord!';
$revalue.="Row:".$row.";TitleLen:".$titlelen;
这样我们可以看到,这个属性已经被创建变量并且赋值了。
接下来我们可以再进一步去修改这个标签。
比如说我们需要写一个标签专门来查询文章内容页的那个相关文章,功能类似于上面sql标签中的那个sql,只是这里我们将其分装为一个标签。
我们可以新建一个标签,例如叫writerarc,那我们就需要创建一个writerarc.lib.php,然后模仿demotag编写函数,注意需要修改为
functionlib_writerarc(&$ctag,&$refObj)
接下来我们就可以编写查询语句及对底层模板处理的相关函数了
$revalue='';
$innertext=$ctag->GetInnerText();
$ctp=newDedeTagParse();
$ctp->SetNameSpace('field','[',']');
$sql="SELECT*FROMdede_archivesWHEREwriter='{$refObj->Fields['writer']}'limit0,$row";
$innertext这个是用来获取标签的底层模板的,$ctp创建用于处理底层模板中的变量,并处理进行替换。我们根据获取的属性编写我们的sql语句,这里我们使用limit0,$row,这样就可以根据$row来确定查询的内容数目。
当然我们可以获取更多的属性以便我们这个标签更强大,例如我们可以增加类似于arclist中的相关属性,并在函数中进行处理,不过这个需要有一定的PHP基础。
接下来我们通过执行查询对sql及输出变量进行处理:
$dsql->Execute('me',$sql);
while($rs=$dsql->GetArray('me'))
{
//根据属性处理查询变量
$rs['title']=cn_substr($rs['title'],$titlelen);
//获取底层模板
$ctp->LoadSource($innertext);
foreach($ctp->CTagsas$tagid=>$ctag){
if(!empty($rs[strtolower($ctag->GetName())])){
$ctp->Assign($tagid,$rs[$ctag->GetName()]);
}
}
//根据底层模板及查询变量得到处理结果
$revalue.=$ctp->GetResult();
}
这样我们就将查询出来的结果同底层模板中出现的相关变量进行替换,然后生成输出字符串,将所有的字符串信息存储到$revalue中。
最后返回这个值return$revalue;
整个文件内容如下:
if(!defined('DEDEINC'))
{
exit("RequestError!");
}
functionlib_writerarc(&$ctag,&$refObj)
{
global$dsql,$envs;
//属性处理
$attlist="row|12,titlelen|24";
FillAttsDefault($ctag->CAttribute->Items,$attlist);
extract($ctag->CAttribute->Items,EXTR_SKIP);
$revalue='';
$innertext=$ctag->GetInnerText();
$ctp=newDedeTagParse();
$ctp->SetNameSpace('field','[',']');
$sql="SELECT*FROMdede_archivesWHEREwriter='{$refObj->Fields['writer']}'limit0,$row";
$dsql->Execute('me',$sql);
while($rs=$dsql->GetArray('me'))
{
//根据属性处理查询变量
$rs['title']=cn_substr($rs['title'],$titlelen);
//获取底层模板
$ctp->LoadSource($innertext);
foreach($ctp->CTagsas$tagid=>$ctag){
if(!empty($rs[strtolower($ctag->GetName())])){
$ctp->Assign($tagid,$rs[$ctag->GetName()]);
}
}
//根据底层模板及查询变量得到处理结果
$revalue.=$ctp->GetResult();
}
return$revalue;
}
?>
接下来我们来测试我们这个标签,我们修改article_article.htm模板,在里面加入以下的标签代码:
{dede:writerarcrow='10'titlelen='6'}
[field:title/]
{/dede:writerarc}
通过动态浏览页面进行查看调试,我们会发现标签起作用了,输出了我们的内容。
更多阅读
如何自定义文件夹图标 win7自定义文件夹图标
如何自定义文件夹图标——简介如何制作个性的文件夹图标,一眼就区别开不同的文件夹。如何自定义文件夹图标——工具/原料png图片转化ico图片软件美图秀秀如何自定义文件夹图标——方法/步骤如何自定义文件夹图标 1、从百度图片里
qq空间怎么免费设置背景 qq空间免费自定义背景
qq空间怎么免费设置背景——简介QQ空间采用模块化的设计理念,为我们自定义QQ版面提供了方便的方法,只需要通常简单的拖动即可设计出唯美的个性化风格空间。下面就与小编一起来学习一下QQ空间背景的设计方法。qq空间怎么免费设置背景
怎样自定义QQ空间开场动画? qq空间开场动画diy
相信大家都想把自己的QQ空间装扮的漂漂亮亮的,那么自定义一个开场动画是分不开的,本文就教大家怎样自定义QQ空间开场动画。首先提醒大家的是:自定义QQ空间开场动画必须是黄钻三级以上。具体制作步骤如下:1、 打开QQ空间2、 点击装扮,
如何设置毕业论文的自定义格式样式及应用格式 毕业论文样式
如何设置毕业论文的自定义格式样式及应用格式——简介毕业论文是对大学学习的一份总结,都希望为自己的大学生活画上完美的句号,提交一份优秀的毕业论文。一份优秀的毕业论文是以规范的格式为前提的,所以在编写论文时,需要先按照学校的规
修改开机画面自定义开机画面 开机画面修改
修改开机画面(自定义开机画面)——简介自定义开机画面。让自己的电脑登录界面看起来更符合自己的要求。修改开机画面(自定义开机画面)——工具/原料logonui.exe修改开机画面(自定义开机画面)——方法 1 软件修改修改开机画面(自定义开机画