dede模板如何实现登录状态判断?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文

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

dede模板登录判断
(图片来源网络,侵删)

使用 global $cfg_ml; (最常用、最推荐)

这是最标准、最可靠的方法,因为它直接使用了DedeCMS内置的会员登录对象 $cfg_ml

原理

在DedeCMS中,一旦用户登录,系统就会创建一个全局的会员登录对象 $cfg_ml,我们可以通过检查这个对象中的 M_ID 属性(会员ID)来判断用户是否登录。M_ID 大于0,则表示已登录;否则,表示未登录。

示例代码

在您的模板文件(如 head.htmfooter.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模板登录判断
(图片来源网络,侵删)
  1. {dede:php}...{/dede:php}:这是DedeCMS的PHP标签,用于在模板中执行PHP代码。
  2. global $cfg_ml;:声明并获取全局的会员登录对象。
  3. $cfg_ml->M_ID > 0:核心判断条件。M_ID 存储了当前登录会员的ID,未登录时为0。
  4. $cfg_ml->M_UserName:获取当前登录会员的用户名。
  5. /member/login.php/member/reg.php:分别是DedeCMS默认的登录和注册页面地址。
  6. /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 条件中为真;如果未登录,$userInfofalse,条件为假。
  • 注意:使用此方法获取用户名时,键名是 '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模板登录判断
(图片来源网络,侵删)
  1. 可读性差:复杂的逻辑难以用 {dede:if} 清晰地表达。
  2. 功能受限:无法像PHP代码那样方便地调用函数、进行循环或更复杂的操作。
  3. 稳定性:依赖于模板引擎的解析,不如原生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官方的推荐做法。

-- 展开阅读全文 --
头像
dede文章权重如何提升?
« 上一篇 04-22
dede首页如何调用图集?
下一篇 » 04-22

相关文章

取消
微信二维码
支付宝二维码