在织梦(DedeCMS)系统中,使用两个不同的模板来展示内容是常见的需求,例如列表页和内容页使用不同风格,或者针对不同栏目定制专属模板,实现这一功能需要理解织梦的模板调用机制和标签规则,以下从模板创建、栏目关联、内容调用及动态切换等方面详细说明操作步骤。

模板文件的创建与命名
织梦模板文件存放在/templets/
目录下,通常分为默认模板(default/
)和自定义模板目录,创建两个模板时,需先在templets/
下新建文件夹(如template1
和template2
),并在各自目录中创建对应的模板文件。
- 模板1:
/templets/template1/list_article.htm
(列表页模板) - 模板2:
/templets/template2/article_article.htm
页模板)
模板文件需遵循织梦的命名规则,如列表页模板以list_
页以article_
开头,后跟栏目ID或自定义标识,若需动态切换模板,可通过在后台栏目设置中指定模板路径,或在内容页调用时通过PHP代码覆盖默认模板。
栏目设置与模板关联
-
后台栏目配置
登录织梦后台,进入“栏目管理”->“添加栏目”,在“栏目列表选项”中找到“列表模板”和“文章模板”选项。- 若使用模板1,在“列表模板”输入
/template1/list_article.htm
,在“文章模板”输入/template1/article_article.htm
。 - 若使用模板2,则分别输入
/template2/list_article.htm
和/template2/article_article.htm
。
保存后,该栏目的内容将自动调用对应的模板文件。
- 若使用模板1,在“列表模板”输入
-
全局模板覆盖
若需对全站生效,可在“系统”->“系统基本参数”->“核心设置”中修改“列表目录默认模板”和“文章目录默认模板”,但这种方式会统一全站风格,不推荐用于两个模板并存的情况。(图片来源网络,侵删)
内容页模板的动态调用
若需在同一栏目下根据内容类型切换模板(如普通文章和图集使用不同模板),可通过修改/include/arc.archives.class.php
文件实现,但需谨慎操作,避免破坏系统核心功能,更安全的方式是使用自定义字段和判断标签:
-
添加自定义字段
在后台“内容模型管理”->“普通文章”->“字段管理”中添加一个字段(如templettype
),用于标识内容使用的模板类型(如type1
或type2
)。 -
模板文件中的判断逻辑 页模板(如
article_article.htm
)中,通过PHP代码判断自定义字段值,并调用不同模板:{dede:field name='id' runphp='yes'} $aid = @me; $row = $GLOBALS['dsql']->GetOne("SELECT templettype FROM `dede_archives` WHERE id='$aid'"); $templet = $row['templettype'] == 'type1' ? '/template1/article_type1.htm' : '/template2/article_type2.htm'; @me = $templet; {/dede:field} {dede:include filename='@me' ismake='yes'/}
此代码会根据
templettype
字段的值动态加载不同的模板文件。(图片来源网络,侵删)
列表页模板的差异化调用
若需在列表页展示不同风格的内容,可通过以下方式实现:
-
使用不同栏目调用不同模板
在首页或其他列表页中,通过指定栏目ID调用不同模板的列表内容:{dede:channelartlist typeid='1,2'} {dede:type}[field:typelink/]{/dede:type} {dede:arclist titlelen='30' row='10'} [field:title/] {/dede:arclist} {/dede:channelartlist}
其中
typeid
为栏目ID,可分别设置不同栏目使用不同的模板文件。 -
通过自定义字段筛选
在列表页模板中使用SQL语句筛选特定字段的内容,并调用子模板:{dede:sql sql="SELECT id,title FROM `dede_archives` WHERE templettype='type1' LIMIT 10"} <a href="[field:id runphp='yes'] $id = @me; $url = GetOneArchive($id); @me = $url['arcurl']; [/field:id]">[field:title/]</a> {/dede:sql}
模板文件的结构与标签使用
两个模板的核心差异在于HTML结构和织梦标签的调用方式。
-
模板1(简洁风格):
<html> <head><title>{dede:global name='cfg_webname'/}</title></head> <body> {dede:arclist row='5'} [field:title/] {/dede:arclist} </body> </html>
-
模板2(复杂风格):
<html> <head><title>{dede:global name='cfg_webname'/}</title></head> <body> {dede:channel type='top'} [field:typename/] {/dede:channel} {dedarclist titlelen='50' row='10'} [field:title/] - [field:pubdate function="MyDate('Y-m-d',@me)"/] {/dede:arclist} </body> </html>
需注意不同模板中标签的属性和嵌套规则,确保数据正确调用。
调试与注意事项
- 模板路径错误:确保后台填写的模板路径正确,且文件存在于指定目录。
- 缓存问题:修改模板后需在后台“生成”->“更新HTML”中清除缓存。
- 权限问题:确保
/templets/
目录及其子目录有写入权限。 - 备份核心文件:修改
arc.archives.class.php
等文件前需备份,避免系统崩溃。
以下为相关操作中的关键步骤对比:
操作环节 | 模板1实现方式 | 模板2实现方式 |
---|---|---|
栏目模板关联 | 后台指定/template1/list.htm |
后台指定/template2/list.htm |
列表页差异化展示 | 指定栏目ID调用 | SQL筛选特定字段内容 |
标签使用差异 | 简单{dede:arclist}
|
相关问答FAQs
问题1:如何在同一栏目下让部分内容调用模板A,部分调用模板B?
解答:可通过添加自定义字段(如templetflag
类型,在内容页模板中使用PHP判断字段值并动态加载模板。
{dede:field name='templetflag' runphp='yes'} if(@me == 'A') @me = '/templateA/article.htm'; else @me = '/templateB/article.htm'; {/dede:field} {dede:include filename='@me' ismake='yes'/}
问题2:修改模板后前台页面未更新,是什么原因?
解答:可能是缓存未清除,解决方法:
- 登录织梦后台,点击“生成”->“一键更新网站”->“更新HTML”->“更新所有栏目”。
- 检查
/data/
目录下的缓存文件(如cache
文件夹),手动删除缓存文件。 - 确认模板文件路径正确,且未被浏览器缓存(可按Ctrl+F5强制刷新)。