这是一个在模板开发中非常常用且核心的函数,主要用于根据用户ID(mid)获取用户的用户名、昵称等信息。

函数定义与作用
GetMemberName 是一个自定义的PHP函数,它被设计用来在模板文件(.htm)中调用,以避免在模板里写复杂的PHP逻辑。
核心作用:
根据一个给定的会员ID(mid),查询数据库,并返回该会员的指定字段(如用户名、昵称、邮箱等)的值。
函数签名:
function GetMemberName($mid, $field='mtype')
参数详解
该函数接受两个参数,其中第二个是可选的。

$mid (必需)
- 类型: 整数
- 含义: 会员的唯一ID,即
dede_member表中的mid字段值。 - 来源: 通常通过其他织梦标签或变量获取。
{dede:arclist}标签中的mid字段:[field:mid /]- 当前登录会员的ID:
{$cfg_ml->M_ID} - 评论者、发布者等关联的会员ID。
$field (可选)
- 类型: 字符串
- 含义: 你希望从
dede_member表中获取的字段名。 - 默认值:
'mtype',这是很多人容易混淆的一点,默认获取的不是用户名,而是会员类型(如“个人”、“企业”等)。 - 常用值:
'uname':用户名(注册时填写的账号)。'mtype':会员类型(默认值)。'userid':用户名(和uname通常是同一个值)。'matt':会员状态(如0为正常,1为禁用)。- (空字符串):如果设置为空字符串,函数会直接返回该会员ID对应的用户名,这是一种简写形式。
使用场景与示例
GetMemberName 最常见的场景是在列表页或内容页显示文章作者、评论人等信息。
在文章列表页显示作者用户名
假设你在修改 arclist.htm 模板,想在文章标题旁边显示发布者的用户名。
错误的做法(直接调用):
{dede:arclist titlelen='50'}
<li>
[field:title/] - 作者:[field:uname/] <!-- 这样是错误的,field:uname 通常为空 -->
</li>
{/dede:arclist}
arclist 标签默认不提供 uname 字段,[field:uname/] 通常是空的。

正确的做法(使用 GetMemberName):
{dede:arclist titlelen='50'}
<li>
[field:title/] - 作者:[field:function GetMemberName(@me,'uname')/]
</li>
{/dede:arclist}
代码解析:
{dede:arclist}循环输出文章列表。[field:mid/]会获取到当前这篇文章的发布者会员ID。[field:function ... /]是织梦模板的一个特殊用法,允许你在标签内调用一个PHP函数。@me是一个占位符,在这里它代表了[field:mid/]的值,也就是当前的会员ID。GetMemberName(@me, 'uname')就等同于GetMemberName(123, 'uname')(假设当前文章作者的ID是123)。- 函数执行后,会返回ID为123的用户的
uname字段值(即用户名)。
更简洁的写法(利用默认参数):
因为当 $field 参数为空字符串时,函数会返回用户名,所以可以这样写,效果完全一样:
[field:function GetMemberName(@me,'')/]
或者,更常见的简写形式(省略引号):
[field:function GetMemberName(@me)/]
注意: 这种简写依赖于函数内部对空字符串的判断,虽然常用,但为了代码清晰,推荐使用 GetMemberName(@me, 'uname')。
页显示作者信息
在 article_article.htm 中,你可以这样调用:
发布者:{dede:field.userid function='GetMemberName(@me,"uname")'/}
或者更简洁的:
发布者:{dede:field.userid function='GetMemberName(@me)'/}
这里 {dede:field.userid} 获取的就是当前文章的 mid。
获取会员昵称(如果昵称字段存在)
如果你的系统启用了昵称功能,并且有一个 nickname 字段,你可以这样获取:
[field:function GetMemberName(@me, 'nickname')/]
注意: 你需要确保 dede_member 表中确实存在 nickname 这个字段,并且有数据。
源码解析(了解其工作原理)
如果你想深入了解,可以在 /include/helpers/extend.helper.php 文件中找到这个函数的定义:
if ( ! function_exists('GetMemberName'))
{
function GetMemberName($mid, $field='mtype')
{
if(empty($mid)) return '';
$dsql = new DedeSql(false);
$row = $dsql->GetOne("SELECT $field FROM `dede_member` WHERE mid='$mid';");
if(is_array($row))
{
if($field == '') return $row['uname'];
return $row[$field];
}
else
{
return '';
}
}
}
源码逻辑:
- 检查ID: 首先检查
$mid是否为空,如果为空则直接返回空字符串。 - 连接数据库: 创建一个数据库连接对象
$dsql。 - 执行查询: 执行一条SQL语句,从
dede_member表中根据mid查询你指定的$field。 - 处理结果:
- 如果查询成功(
is_array($row)为真):- 特殊处理:
$field参数是空字符串,则返回用户名字段uname的值,这就是为什么GetMemberName(@me)能工作的原因。 - 常规处理: 否则,返回查询到的
$field对应的值(如mtype,matt等)。
- 特殊处理:
- 如果查询失败(没有找到该ID的会员),则返回空字符串。
- 如果查询成功(
总结与注意事项
| 项目 | 说明 |
|---|---|
| 功能 | 根据会员ID (mid) 获取会员信息。 |
| 核心参数 | GetMemberName($mid, $field) |
$mid |
会员ID,通常来自 [field:mid] 或 {dede:field.userid}。 |
$field |
要获取的字段名。默认是 mtype,不是用户名! |
| 获取用户名 | GetMemberName(@me, 'uname') 或 GetMemberName(@me, '') 或 GetMemberName(@me)。 |
| 适用位置 | 所有织梦模板文件(.htm),通常与 {dede:arclist}、{dede:list}、{dede:field} 等标签结合使用。 |
| 注意事项 | 确保传入的 $mid 是有效的。明确 $field 的值,不要误用默认的 mtype。如果获取的字段在数据库中不存在,函数会返回空。 |
熟练掌握 GetMemberName 函数,能让你在开发织梦模板时事半功倍,轻松实现各种与会员信息相关的显示需求。
