理解 Phpcms 的模板体系,然后用 Phpcms 的语法和规则,重新实现 Dedecms 模板的布局和功能。

下面我将为你提供一个详细的转换指南,包括核心差异对比、转换步骤、常用标签对照以及一个完整的示例。
核心差异对比
在开始转换前,必须理解两者最根本的区别:
| 特性 | Dedecms (织梦) | Phpcms (v9) |
|---|---|---|
| 架构 | MVC 模型,但模板与控制器耦合较紧密,标签功能强大但自成体系。 | MVC 模型,分离更彻底,模板专注于展示,逻辑由 PHP 控制器处理。 |
| 模板引擎 | 自定义的模板引擎,使用 {dede:}
| |
| 数据调用 | 核心是标签,通过 {dede:arclist}、{dede:channel} 等标签在模板中直接获取和循环数据。 |
核心是循环,数据由控制器 $this->data 传递给模板,模板中使用 {loop $data $r} 来遍历数据。 |
| 配置管理 | 通过后台系统设置、模板变量 ({dede:global}) 管理。 |
通过后台“内容模型”->“字段管理”和“模块”->“模块管理”来配置。 |
| 文件结构 | /templets/ 目录下按栏目ID或目录存放模板文件。 |
/phpcms/templates/ 目录下按模块存放模板文件,如 content/、api/ 等。 |
| URL路由 | 可配置,但默认规则为 plus/view.php?aid=123 或 html/123.html。 |
默认为 index.php?m=content&c=index&a=show&catid=123&id=456,可通过伪静态美化。 |
转换步骤详解
第1步:分析 Dedecms 模板结构
拆解你的 Dedecms 模板,识别出各个部分:
- 整体布局:
head.htm(头部),index.htm(首页),footer.htm(底部),list_article.htm(列表页),article_article.htm(内容页)。 - 可复用模块:如导航栏、侧边栏、友情链接等。
- 区域:
- 首页:头条新闻、图文资讯、产品展示、友情链接等。
- 列表页:文章列表、分页条。
- 内容页、内容、发布时间、点击量、上下篇、相关文章等。
第2步:搭建 Phpcms 模板框架
- 创建目录:在
/phpcms/templates/下创建一个新的模板目录,mytheme/。 - 复制静态文件:将 Dedecms 模板中的 HTML、CSS、JS 文件复制到
mytheme/目录下。暂时忽略所有{dede:}。 - 创建模板文件:在
mytheme/下创建 Phpcms 需要的模板文件,通常一个模块对应一个目录,例如内容模块就是content/。index.php(首页模板)header.php(公共头部)footer.php(公共底部)index/category.php(栏目首页/列表页)index/show.php(内容页)
第3步:转换公共部分 (header.php, footer.php)
这是最简单的部分,因为它们通常不包含复杂的动态逻辑。

- :
- Dedecms:
{dede:global.cfg_webname/} - Phpcms:
{$site_name}
- Dedecms:
- 网站路径:
- Dedecms:
{dede:global.cfg_cmsurl/} - Phpcms:
{CSS_PATH},{JS_PATH}(用于静态资源) 或直接用{$site_url}拼接。
- Dedecms:
- 友情链接:
- Dedecms:
{dede:flink/} - Phpcms: 需要在后台“模块”->“链接”中添加,然后在模板中调用:
{loop $link_list $r} <a href="{$r[url]}" target="{$r[target]}">{$r[name]}</a> {/loop}
- Dedecms:
第4步:转换首页动态内容
这是转换的核心和难点,你需要将 Dedecms 的标签调用,替换为 Phpcms 的控制器逻辑 + 模板循环。
场景1:首页头条新闻
-
Dedecms 模板:
{dede:arclist flag='h' titlelen='24' row='5'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} -
Phpcms 转换方案:
-
后台设置: 在 Phpcms 后台,确保你的头条文章被设置了“推荐位”,进入“内容”->“推荐位管理”,创建一个名为“首页头条”的推荐位,并记下其ID(假设为1)。
-
控制器逻辑 (
phpcms/modules/content/index.php): 在首页的index()方法中,添加调用推荐位数据的代码。public function index() { // ... 其他逻辑 ... // 调用推荐位ID为1的数据 $this->posid = 1; $this->data['headline_list'] = get_keywords_list($this->posid, '0', '5'); // '0'表示全部模型,'5'表示5条 // ... 其他逻辑 ... $this->template_content = 'index'; // 指定使用的模板文件 include $this->template(); // 输出模板 }注意:
get_keywords_list()是 Phpcms 调用推荐位数据的常用函数,你可能需要根据你的 Phpcms 版本和需求调整。 -
Phpcms 模板 (
index.php):{loop $headline_list $r} <li><a href="{$r[url]}">{$r[title]}</a></li> {/loop}$r是循环变量,$r[url]对应文章链接,$r[title]对应文章标题,字段名可能因模型不同而略有差异。
-
场景2:首页图文资讯列表
-
Dedecms 模板:
{dede:arclist type='image' titlelen='30' row='6'} <dl> <dt><a href="[field:arcurl/]"><img src="[field:picname/]" alt="[field:title/]"></a></dt> <dd><a href="[field:arcurl/]">[field:title/]</a></dd> </dl> {/dede:arclist} -
Phpcms 转换方案:
-
控制器逻辑 (
phpcms/modules/content/index.php): 调用指定栏目ID下的文章列表。public function index() { // ... 其他逻辑 ... // 假设图文资讯的栏目ID是 5 $catid = 5; $this->data['article_list'] = get_listinfo('catid='.$catid, 'id DESC', 1, 6, '', 'id'); // ... 其他逻辑 ... $this->template_content = 'index'; include $this->template(); }get_listinfo()是 Phpcms 调用列表数据的函数,参数非常灵活,类似于 SQL 的 WHERE 和 ORDER BY。 -
Phpcms 模板 (
index.php):{loop $article_list $r} <dl> <dt><a href="{$r[url]}"><img src="{$r[thumb]}" alt="{$r[title]}"></a></dt> <dd><a href="{$r[url]}">{$r[title]}</a></dd> </dl> {/loop}$r[thumb]通常存储着缩略图路径。
-
第5步:转换列表页
列表页的转换与首页的列表部分类似。
-
Dedecms 模板 (
list_article.htm):{dede:list pagesize='20'} <li><a href="[field:arcurl/]">[field:title/]</a> - [field:pubdate function="MyDate('Y-m-d',@me)"/]</li> {/dede:list} {dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/} -
Phpcms 转换方案:
-
控制器逻辑 (
phpcms/modules/content/index.php的category()方法): Phpcms 的列表页控制器通常已经内置了分页逻辑,你只需要确保$this->catid被正确设置,并将数据传递给模板。public function category() { $catid = intval($_GET['catid']); $this->catid = $catid; $this->category = get_cat($catid); // 调用列表数据,分页功能已内置 $this->data['list'] = get_listinfo('catid='.$catid, 'id DESC', $page, $this->category['pagesize']); $this->template_content = 'index/category'; // 指定列表页模板 include $this->template(); } -
Phpcms 模板 (
index/category.php):{loop $list $r} <li><a href="{$r[url]}">{$r[title]}</a> - {date('Y-m-d', $r[updatetime])}</li> {/loop} <!-- 分页条 --> <div class="page"> {$pages} </div>{$pages}是 Phpcms 内置的分页变量,会自动生成分页链接。
-
第6步:转换内容页
页相对简单,因为文章的所有信息都作为一条记录传递给模板。
-
Dedecms 模板 (
article_article.htm):<h1>{dede:field.title/}</h1> <div class="info">作者:{dede:field.writer/} 时间:{dede:field.pubdate function="MyDate('Y-m-d',@me)"/} 点击:{dede:field.click/}</div> <div class="content">{dede:field.body/}</div> <div class="pages">{dede:pagebreak/}</div> -
Phpcms 转换方案:
-
控制器逻辑 (
phpcms/modules/content/index.php的show()方法): 同样,Phpcms 的内容页控制器也已内置逻辑。public function show() { $id = intval($_GET['id']); $this->content = get_content($id); // 获取文章内容 // ... 其他逻辑如下一篇、相关文章等 ... $this->template_content = 'index/show'; include $this->template(); } -
Phpcms 模板 (
index/show.php):<h1>{$content['title']}</h1> <div class="info">作者:{$content['username']} 时间:{date('Y-m-d', $content['updatetime'])} 点击:{$content['hits']}</div> <div class="content">{$content['content']}</div> <div class="pages">{$pages}</div>$content是包含当前文章所有字段信息的数组,字段名(如title,content,hits)需要根据你的内容模型来确认。
-
常用标签对照表
| 功能 | Dedecms 标签 | Phpcms 模板写法 | 备注 |
|---|---|---|---|
| 循环文章列表 | {dede:arclist...}{/dede:arclist} |
{loop $data $r}...{/loop} |
$data 由控制器传入 |
| 获取单篇文章 | {dede:field.name/} |
{$content['field_name']} |
$content 由控制器传入 |
| 栏目名称 | {dede:field.typename/} |
{$category['catname']} |
$category 由控制器传入 |
| 栏目链接 | {dede:field.typeurl/} |
{$category['url']} |
|
| 分页 | {dede:pagelist/} |
{$pages} |
Phpcms 内置变量 |
| 发布时间 | {dede:field.pubdate function="..."/} |
{date('Y-m-d', $r['updatetime'])} |
使用PHP的date函数 |
| 缩略图 | [field:picname/] |
{$r['thumb']} |
|
| 文章链接 | [field:arcurl/] |
{$r['url']} |
|
| 调用子栏目 | {dede:channel type='son'}{/dede:channel} |
需在控制器用 get_child_ids() 获取ID,再用 get_category() 循环输出 |
Phpcms 稍显复杂 |
| 网站配置 | {dede:global.cfg_name/} |
{$site_name}, {$site_url} 等 |
总结与建议
- 耐心是关键:模板转换不是简单的复制粘贴,而是一个“翻译”和“重建”的过程,你需要不断地在 Dedecms 模板和 Phpcms 后台/控制器之间切换。
- 先静态,后动态:先把所有静态样式和布局调整好,再逐个添加动态内容块。
- 善用 Phpcms 后台:Phpcms 的很多功能(如推荐位、内容模型、字段管理)都是为了方便模板调用而设计的,充分利用后台可以减少前端的代码量。
- 阅读官方文档:Phpcms 虽然老旧,但仍有社区和文档可以参考,了解其核心函数如
get_listinfo(),get_content(),get_category()等至关重要。 - 不要试图100%还原:如果某个 Dedecms 的特效在 Phpcms 中实现成本过高,可以考虑用更简单的方式替代,或者放弃,目标是网站功能和基本布局的迁移。
遵循以上步骤,你就能系统地将一个 Dedecms 模板成功转换为功能完善的 Phpcms 模板,祝你转换顺利!
