dede如何调用当前登录用户的状态信息?

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

核心原理

DedeCMS 的登录状态信息主要存储在 PHP 的 $_SESSION 全局变量中,当你成功登录后,系统会在 $_SESSION 中写入一些特定的键值对来标记你的身份和权限,我们调用的过程,本质上就是读取和判断这些 $_SESSION 变量的过程。

dede 登陆状态调用
(图片来源网络,侵删)

使用内置标签 {dede:php}global (最常用、最灵活)

这是最推荐的方法,因为它非常灵活,可以在模板的任何位置执行 PHP 代码,直接访问 $_SESSION

判断用户是否已登录

如果你只想判断用户是否登录,而不关心具体是谁,可以使用以下代码:

{dede:php}
    // 引入全局对象,这是访问 $_SESSION 的前提
    global $_SESSION;
    // 检查关键的登录状态变量 'userid' 是否存在
    // DedeCMS 登录成功后,会设置 $_SESSION['userid']
    if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
        echo '<a href="/member/">会员中心</a>';
        echo ' | ';
        echo '<a href="/member/index_do.php?fmdo=login&dopost=exit">退出登录</a>';
    } else {
        echo '<a href="/member/index.php">登录</a>';
        echo ' | ';
        echo '<a href="/member/reg.php">注册</a>';
    }
{/dede:php}

代码解释:

  • {dede:php}...{/dede:php}: 这是 DedeCMS 的一个特殊标签,允许在模板中直接编写 PHP 代码。
  • global $_SESSION;: 必须要有,在模板中直接使用 $_SESSION 是不行的,需要先将其声明为全局变量。
  • isset($_SESSION['userid']): 检查 $_SESSION 中是否存在名为 userid 的键,如果存在,说明用户已登录。
  • $_SESSION['userid'] > 0: 一个额外的判断,确保 userid 是一个有效的数字,而不是 0 或其他值。

获取并显示当前登录用户的信息

如果你想获取当前登录用户的用户名、昵称、UID 等信息,可以访问 $_SESSION 中对应的键。

dede 登陆状态调用
(图片来源网络,侵删)

常用 $_SESSION 键值:

  • $_SESSION['userid']: 用户的数字ID。
  • $_SESSION['mtype']: 用户类型 (如个人、企业等)。
  • $_SESSION['uid']: 有时和 userid 相同,也是用户ID。
  • $_SESSION['username']: 用户的登录名。
  • $_SESSION['uname']: 用户的昵称/显示名称。
  • $_SESSION['adminid']: 如果是管理员登录,这个值会有意义。

示例代码:

{dede:php}
    global $_SESSION;
    // 判断是否登录
    if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
        // 已登录,显示用户信息
        $uid = $_SESSION['userid'];
        $username = $_SESSION['username'];
        $uname = $_SESSION['uname'];
        echo "欢迎您, <strong>" . $uname . "</strong> (ID: " . $uid . ")<br>";
        echo "登录名: " . $username . "<br>";
        // 退出链接
        echo '<a href="/member/index_do.php?fmdo=login&dopost=exit">安全退出</a>';
    } else {
        // 未登录,显示登录和注册链接
        echo '<a href="/member/index.php">请登录</a>';
        echo ' | ';
        echo '<a href="/member/reg.php">免费注册</a>';
    }
{/dede:php}

在自定义函数或文件中调用

如果你想在 PHP 文件(如 index.php)或者自定义的函数文件中判断登录状态,过程更直接,不需要 global 声明。

示例 (在 index.php 文件中):

dede 登陆状态调用
(图片来源网络,侵删)
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php"); // 引入核心文件
// 直接判断 $_SESSION
if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
    // 用户已登录逻辑
    $dsql->SetQuery("SELECT uname FROM `dede_member` WHERE userid = '{$_SESSION['userid']}'");
    $dsql->Execute();
    $row = $dsql->GetArray();
    $welcome_info = "欢迎您, " . $row['uname'];
} else {
    // 用户未登录逻辑
    $welcome_info = "您尚未登录,请先登录!";
}
// ... 后续模板赋值和解析
$tpl->assign('welcome_info', $welcome_info);
$tpl->Display('index.htm');
?>

通过修改或扩展 DedeCMS 标签 (高级用法)

如果你想让调用变得更像 DedeCMS 的原生标签({dede:loginstatus}),你可以修改 include/extend.func.php 文件来创建一个自定义函数。

步骤:

  1. 打开 /include/extend.func.php 文件,在文件末尾添加以下函数:

    /**
     * 获取当前登录用户信息
     * @param string $field 要获取的字段 (如 'userid', 'username', 'uname')
     * @return string 返回字段值或空字符串
     */
    function GetMemberInfo($field = '')
    {
        global $_cfg, $_SESSION;
        // 确保会话已启动
        if (!isset($_SESSION)) {
            session_start();
        }
        if (isset($_SESSION['userid']) && $_SESSION['userid'] > 0) {
            if ($field == '') {
                return "已登录";
            }
            return isset($_SESSION[$field]) ? $_SESSION[$field] : '';
        }
        return '';
    }
  2. 在你的模板文件中,就可以这样使用:

    • 判断是否登录:

      {dede:php}
          if (GetMemberInfo('userid') != '') {
              echo '已登录';
          } else {
              echo '未登录';
          }
      {/dede:php}

      或者更简单地:

      {dede:php}echo GetMemberInfo() != '' ? '已登录' : '未登录';{/dede:php}
    • 获取用户昵称:

      欢迎,{dede:php}echo GetMemberInfo('uname');{/dede:php}!
    • 获取用户ID:

      您的ID是:{dede:php}echo GetMemberInfo('userid');{/dede:php}

这种方法让模板更整洁,但本质上还是对方法一的封装。


总结与最佳实践

方法 优点 缺点 适用场景
{dede:php} 最灵活、最直接,功能强大,无需修改核心文件。 模板中 PHP 代码稍显杂乱。 绝大多数情况下的首选,尤其是在模板中需要复杂逻辑时。
PHP文件中 逻辑清晰,适合在 PHP 后端处理。 不在模板中直接展示。 在 PHP 控制器文件中处理登录逻辑,然后将结果传递给模板。
扩展函数 模板代码简洁,更像原生标签。 需要修改 extend.func.php 文件。 当需要在多个模板中重复使用登录状态逻辑,且希望代码更“模板化”时。

推荐:

对于绝大多数 DedeCMS 掌握和使用方法一 ({dede:php}) 就足够应对所有关于登录状态调用的需求了,它简单、有效且不破坏系统文件。

-- 展开阅读全文 --
头像
dede响应式模板代码
« 上一篇 昨天
自适应企业dede模版如何快速搭建与适配?
下一篇 » 昨天

相关文章

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

目录[+]