织梦CMS插件开发完全指南
第一部分:基础概念与准备工作
在开始编码之前,我们需要了解几个核心概念。
什么是织梦插件?
织梦插件是一种模块化的程序,它允许在不修改织梦核心文件的情况下,为网站增加新的功能,这样做的好处是:
- 安全:升级织梦时,你的插件代码不会被覆盖,网站功能得以保留。
- 可维护:功能独立,易于修改和调试。
- 可复用:好的插件可以轻松地在不同网站间部署。
插件的组成结构
一个标准的织梦插件通常包含以下几个关键部分:
- 插件目录:位于
/plus/目录下,以插件命名,mytest。 - 主程序文件:通常是
index.php,这是插件的核心逻辑入口。 - 安装/卸载文件:
install.php和uninstall.php,用于处理插件的安装和卸载流程。 - 配置文件:
config.php,用于定义插件的基本信息和可配置项。 - 语言包文件:
lang.php,用于多语言支持(可选)。 - 模板文件:
templets/目录,存放插件的前端展示模板。 - SQL文件:
sql/install.sql,用于在安装时创建数据表或插入初始数据(可选)。
开发环境准备
- 本地服务器环境:推荐使用
phpStudy、XAMPP或WAMP等集成环境,确保你的电脑上能运行 PHP 和 MySQL。 - 织梦CMS程序:下载一个织梦CMS程序,并安装在本地服务器上。
- 代码编辑器:如 VS Code、Sublime Text、Notepad++ 等。
- FTP/SFTP工具:用于将本地文件上传到服务器(开发阶段本地即可)。
第二部分:插件开发实战 - "Hello World" 插件
我们将创建一个最简单的插件,它将在后台显示一个菜单项,点击后在前台显示 "Hello, DedeCMS Plugin!"。
创建插件目录和基本文件
- 在织梦根目录下的
plus/文件夹中,创建一个新文件夹,命名为helloworld。 - 在
plus/helloworld/目录下,创建以下空文件:index.php(主程序)install.php(安装脚本)uninstall.php(卸载脚本)config.php(配置文件)
编写 config.php - 插件信息
这个文件定义了插件的基本信息,如名称、作者、版本等,以及后台菜单的配置。
<?php
/*
[插件名称] Hello World
[插件版权] CopyRight 2025 My Company
[适用版本] DedeCMS 5.7+
[作者信息] Your Name
[官方网站] http://www.yourwebsite.com
[插件描述] 一个简单的Hello World插件,用于演示插件开发。
[安装提示] 直接在后台插件管理中安装即可。
[支付方式] 免费
*/
// 定义插件信息
$plugin_info = array(
'name' => 'Hello World',
'copyright' => 'CopyRight 2025 My Company',
'version' => '1.0',
'适用版本' => 'DedeCMS 5.7+',
'author' => 'Your Name',
'site' => 'http://www.yourwebsite.com',
'description' => '一个简单的Hello World插件,用于演示插件开发。',
);
// 定义后台菜单
// 格式: array('菜单名称' => '插件目录名/文件名')
$plugin_menu = array(
'Hello World' => 'helloworld/index.php',
);
?>
说明:
plugin_info数组是插件的基本信息。plugin_menu数组定义了在后台插件管理页面中显示的菜单,当用户点击 "Hello World" 时,会跳转到plus/helloworld/index.php。
编写 install.php - 安装脚本
这个文件在用户点击“安装”时执行,我们可以在这里做一些初始化工作,比如显示欢迎信息。
<?php
/**
* Hello World 插件安装脚本
*/
// 引入织梦系统核心文件
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 获取插件信息
require_once(dirname(__FILE__).'/config.php');
// 显示安装确认页面
if(empty($dopost))
{
// 安装表单
$msg = "
<h3>您正在安装 [{$plugin_info['name']}] V{$plugin_info['version']}</h3>
<p>作者:{$plugin_info['author']}</p>
<p>描述:{$plugin_info['description']}</p>
<form action='install.php' method='post'>
<input type='hidden' name='dopost' value='install' />
<input type='submit' class='btn btn-primary' value='确认安装' />
</form>
";
ShowMsg($msg, 'javascript:;', 0, 5000);
}
else
{
// 执行安装逻辑
// 在这里可以执行SQL、创建目录等操作
// $dsql->ExecuteNoneQuery("INSERT INTO `#@__plus` (`name`, `info`) VALUES ('Hello World', 'Hello World Plugin')");
$msg = "恭喜![{$plugin_info['name']}] 插件安装成功!";
ShowMsg($msg, 'javascript:;', 1, 2000);
}
?>
说明:
ShowMsg()是织梦内置的函数,用于在后台弹出提示信息。$dopost是一个常见的参数,用来区分是显示安装表单还是执行安装逻辑。
编写 uninstall.php - 卸载脚本
这个文件在用户点击“卸载”时执行。
<?php
/**
* Hello World 插件卸载脚本
*/
require_once(dirname(__FILE__)."/../include/common.inc.php");
require_once(dirname(__FILE__).'/config.php');
if(empty($dopost))
{
$msg = "
<h3>您正在卸载 [{$plugin_info['name']}]</h3>
<p>此操作将删除插件相关数据,请谨慎操作!</p>
<form action='uninstall.php' method='post'>
<input type='hidden' name='dopost' value='uninstall' />
<input type='submit' class='btn btn-danger' value='确认卸载' />
</form>
";
ShowMsg($msg, 'javascript:;', 0, 5000);
}
else
{
// 执行卸载逻辑
// $dsql->ExecuteNoneQuery("DELETE FROM `#@__plus` WHERE name='Hello World'");
$msg = "[{$plugin_info['name']}] 插件已成功卸载。";
ShowMsg($msg, 'javascript:;', 1, 2000);
}
?>
编写 index.php - 主程序逻辑
这是插件的核心,当用户在后台点击 "Hello World" 菜单时,就会访问这个文件。
<?php
/**
* Hello World 插件主程序
*/
// 引入织梦系统核心文件
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 获取插件信息
require_once(dirname(__FILE__).'/config.php');
// 检查用户权限
if($cuserLogin->getUserType() < 1)
{
ShowMsg('您没有权限访问此页面!', '-1', 0, 2000);
exit();
}
// 根据操作执行不同逻辑
if($dopost == 'show')
{
// 调用模板显示内容
include(dirname(__FILE__).'/templets/show.htm');
}
else
{
// 默认操作,直接跳转到显示页面
header("Location: index.php?dopost=show");
exit();
}
?>
说明:
- 这里我们通过
$dopost参数来区分不同的操作。 - 当
dopost为show时,我们引入模板文件show.htm。 - 否则,我们直接重定向到
index.php?dopost=show。
创建模板文件
- 在
plus/helloworld/目录下创建templets文件夹。 - 在
templets文件夹中创建show.htm文件。
templets/show.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">插件演示</title>
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; padding: 20px; }
.container { max-width: 800px; margin: 0 auto; border: 1px solid #ddd; padding: 20px; border-radius: 5px; }
h1 { color: #333; }
</style>
</head>
<body>
<div class="container">
<h1>Hello, DedeCMS Plugin!</h1>
<p>这是由我们的 "Hello World" 插件生成的内容。</p>
<p>当前时间:<?php echo date('Y-m-d H:i:s'); ?></p>
</div>
</body>
</html>
安装与测试
- 登录织梦后台。
- 进入 【系统】->【插件管理】。
- 点击 【上传新插件】 或 【安装插件】(取决于你的织梦版本)。
- 在插件列表中,你应该能看到 "Hello World" 插件。
- 点击 【安装】,然后根据提示确认安装。
- 安装成功后,在插件管理页面会出现 "Hello World" 的菜单项。
- 点击这个菜单项,如果一切正常,你应该能看到
show.htm渲染出的页面。
第三部分:进阶开发技巧
如何创建数据表?
如果你的插件需要存储数据,比如文章、评论等,就需要创建数据表。
-
创建SQL文件:在插件目录下创建
sql/install.sql和sql/uninstall.sql。-
sql/install.sql:CREATE TABLE IF NOT EXISTS `#@__helloworld_data` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL, `addtime` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
注意:
#@__是织梦的数据表前缀占位符,织梦在执行时会自动替换为你配置的前缀(如dede_)。 -
sql/uninstall.sql:DROP TABLE IF EXISTS `#@__helloworld_data`;
-
-
修改安装脚本:在
install.php中,执行SQL文件。// 在 install.php 的安装逻辑部分 $sqlfile = dirname(__FILE__).'/sql/install.sql'; $dsql->SetQuery(file_get_contents($sqlfile)); $dsql->ExecuteNoneQuery();
-
修改卸载脚本:在
uninstall.php中,执行卸载SQL。// 在 uninstall.php 的卸载逻辑部分 $sqlfile = dirname(__FILE__).'/sql/uninstall.sql'; $dsql->SetQuery(file_get_contents($sqlfile)); $dsql->ExecuteNoneQuery();
如何在后台添加配置项?
通过 config.php,我们可以让插件在后台提供可配置的选项。
-
修改
config.php:// 在 plugin_info 数组后面添加 $plugin_setting = array( array('name' => 'helloworld_title', 'title' => '显示标题', 'type' => 'text', 'value' => '欢迎来到我的网站'), array('name' => 'helloworld_isopen', 'title' => '是否开启', 'type' => 'radio', 'value' => 'Y|N', 'default' => 'Y'), ); -
修改
index.php:// 在 index.php 中获取配置 $cfg = $dsql->GetOne("SELECT * FROM `#@__plus_config` WHERE `aid`='{$pluginid}'"); $helloworld_title = isset($cfg['helloworld_title']) ? $cfg['helloworld_title'] : '欢迎来到我的网站'; $helloworld_isopen = isset($cfg['helloworld_isopen']) ? $cfg['helloworld_isopen'] : 'Y'; -
修改
install.php:在安装时,将配置项插入数据库。// 在 install.php 的安装逻辑部分 $setting = ''; foreach($plugin_setting as $k=>$v) { $setting .= "INSERT INTO `#@__plus_config` (`aid`, `varname`, `value`, `type`) VALUES (0, '{$v['name']}', '{$v['value']}', '{$v['type']}');\r\n"; } $dsql->SetQuery($setting); $dsql->ExecuteNoneQuery();
如何调用织梦标签?
在插件模板中,你可以像在普通模板中一样使用织梦的标签。
templets/show.htm 示例:
<h2>{dede:global.helloworld_title/}</h2>
{dede:arclist row="5" titlelen="24"}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
注意:这些标签是否能正确解析,取决于你的 index.php 是否正确引入了织梦的全局变量和函数。
第四部分:总结与最佳实践
- 代码规范:尽量遵循织梦的代码风格,变量命名清晰。
- 安全第一:对所有用户输入进行过滤和验证,防止SQL注入和XSS攻击,使用
$dsql->GetOne()等安全方法。 - 注释清晰:为你的代码添加必要的注释,方便日后维护和他人理解。
- 善用官方文档:虽然织梦官方文档有时不够完善,但仍然是最好的参考资料。
- 从简单开始:先实现核心功能,再逐步添加复杂的特性。
开发织梦插件是一个结合了PHP、MySQL、HTML和织梦特定规则的过程,多看、多练、多思考,你很快就能成为一名合格的织梦插件开发者,祝你开发顺利!
