DedeCMS的登录判断逻辑主要依赖于PHP代码和系统提供的全局变量,核心思路是:在模板中通过PHP代码检查当前用户是否已登录,并根据返回的布尔值(true/false)来显示不同的内容。

使用 global $cfg_ml; (最常用、最推荐)
这是最标准、最可靠的方法,因为它直接使用了DedeCMS内置的会员登录对象 $cfg_ml。
原理
在DedeCMS中,一旦用户登录,系统就会创建一个全局的会员登录对象 $cfg_ml,我们可以通过检查这个对象中的 M_ID 属性(会员ID)来判断用户是否登录。M_ID 大于0,则表示已登录;否则,表示未登录。
示例代码
在您的模板文件(如 head.htm、footer.htm 或任何需要判断的页面)中,使用以下代码:
{dede:php}
// 引入全局会员登录对象
global $cfg_ml;
// 判断是否登录
if ($cfg_ml->M_ID > 0) {
// 已登录状态下显示的内容
echo '<div class="user-logged-in">';
echo '欢迎您,<strong>' . $cfg_ml->M_UserName . '</strong>!'; // 显示用户名
echo '<a href="/member/index.php">会员中心</a> | ';
echo '<a href="/member/logout.php">退出登录</a>';
echo '</div>';
} else {
// 未登录状态下显示的内容
echo '<div class="user-not-logged-in">';
echo '<a href="/member/login.php">登录</a> | ';
echo '<a href="/member/reg.php">注册</a>';
echo '</div>';
}
{/dede:php}
代码解析:

{dede:php}...{/dede:php}:这是DedeCMS的PHP标签,用于在模板中执行PHP代码。global $cfg_ml;:声明并获取全局的会员登录对象。$cfg_ml->M_ID > 0:核心判断条件。M_ID存储了当前登录会员的ID,未登录时为0。$cfg_ml->M_UserName:获取当前登录会员的用户名。/member/login.php和/member/reg.php:分别是DedeCMS默认的登录和注册页面地址。/member/logout.php:默认的退出登录页面地址,它会自动清除登录状态。
使用 GetLoginUserInfo() 函数
这个函数是DedeCMS提供的便捷函数,它直接返回当前登录用户的信息,如果用户未登录,则返回 false。
示例代码
{dede:php}
// 获取登录用户信息
$userInfo = GetLoginUserInfo();
if ($userInfo) {
// 已登录状态下显示的内容
echo '<div class="user-logged-in">';
echo '欢迎您,<strong>' . $userInfo['username'] . '</strong>!'; // 注意这里是 username
echo '<a href="/member/index.php">会员中心</a> | ';
echo '<a href="/member/logout.php">退出登录</a>';
echo '</div>';
} else {
// 未登录状态下显示的内容
echo '<div class="user-not-logged-in">';
echo '<a href="/member/login.php">登录</a> | ';
echo '<a href="/member/reg.php">注册</a>';
echo '</div>';
}
{/dede:php}
代码解析:
GetLoginUserInfo():这个函数封装了$cfg_ml的调用,直接返回一个包含用户信息的数组(如['username' => 'admin', 'uid' => 1, ...])。if ($userInfo):如果用户已登录,$userInfo是一个数组,在if条件中为真;如果未登录,$userInfo是false,条件为假。- 注意:使用此方法获取用户名时,键名是
'username',而不是$cfg_ml中的'M_UserName'。
使用 if 条件标签(不推荐,仅作了解)
在DedeCMS的早期版本或某些特定场景下,可以使用 {dede:if} 标签,但这种方法不推荐,因为它不够灵活,且依赖于特定的变量,不如直接使用PHP代码直观和强大。
{dede:if $cfg_ml.M_ID > 0}
<!-- 已登录内容 -->
<div>欢迎您,<strong>{$cfg_ml.M_UserName}</strong>!</div>
{else}
<!-- 未登录内容 -->
<div><a href="/member/login.php">请登录</a></div>
{/dede:if}
为什么不推荐?

- 可读性差:复杂的逻辑难以用
{dede:if}清晰地表达。 - 功能受限:无法像PHP代码那样方便地调用函数、进行循环或更复杂的操作。
- 稳定性:依赖于模板引擎的解析,不如原生PHP代码稳定。
最佳实践与完整示例
我们会将登录判断的代码放在网站的头部模板 head.htm 中,这样所有页面都能共享这个登录状态栏。
修改 head.htm 文件
打开您的模板目录下的 templets/default/head.htm 文件(请根据您的实际模板路径修改),找到合适的位置(<body> 标签之后),添加以下代码:
<!-- 会员登录状态判断 开始 -->
<div class="user-status">
{dede:php}
global $cfg_ml;
if ($cfg_ml->M_ID > 0) {
// 已登录状态
echo '<span>欢迎,<a href="/member/index.php" class="username">' . $cfg_ml->M_UserName . '</a></span>';
echo '<span><a href="/member/logout.php?gotopage=" . urlencode($_SERVER["REQUEST_URI"]) . '">退出</a></span>';
} else {
// 未登录状态
echo '<span><a href="/member/login.php?gotopage=" . urlencode($_SERVER["REQUEST_URI"]) . '">登录</a></span>';
echo '<span><a href="/member/reg.php">注册</a></span>';
}
{/dede:php}
</div>
<!-- 会员登录状态判断 结束 -->
添加一些CSS样式
为了让登录状态栏看起来更美观,可以在您的CSS文件(如 style.css)中添加以下样式:
.user-status {
font-size: 14px;
padding: 10px 20px;
text-align: right;
}
.user-status span {
margin-left: 15px;
}
.user-status a {
color: #333;
text-decoration: none;
}
.user-status a:hover {
color: #ff6600;
text-decoration: underline;
}
.user-status .username {
color: #ff6600;
font-weight: bold;
}
gotopage 参数的说明
在登录和退出的链接中,我们添加了 gotopage=<?php echo urlencode($_SERVER["REQUEST_URI"]); ?>(在模板中需要用 urlencode($_SERVER["REQUEST_URI"]))。
- 作用:这个参数的作用是,用户在登录或退出后,可以自动跳转回他之前访问的页面,而不是默认跳转到会员中心或首页,提升了用户体验。
- 注意:在
{dede:php}标签内部直接写PHP代码即可,不需要再嵌套dede
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
global $cfg_ml |
标准、可靠、功能强大,可直接访问所有会员信息 | 需要了解PHP和DedeCMS对象结构 | ★★★★★ (最推荐) |
GetLoginUserInfo() |
代码简洁,直接返回用户信息数组 | 功能相对单一,不如 $cfg_ml 灵活 |
★★★★☆ (非常推荐) |
{dede:if} |
无需写PHP标签 | 功能受限,可读性差,不推荐复杂逻辑 | ★☆☆☆☆ (不推荐) |
对于绝大多数DedeCMS模板开发需求,强烈推荐使用方法一(global $cfg_ml),因为它最稳定、最灵活,是DedeCMS官方的推荐做法。
