织梦 dede_fieldshash 作用是什么?

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

dede_fieldshash 是什么?

dede_fieldshash 是一个在DedeCMS 列表页(list*.html)和内容页(article*.html) 模板中可用的PHP数组变量。

织梦 dede_fieldshash
(图片来源网络,侵删)

它的核心作用是:在页面加载时,获取并存储当前文档(文章)的所有自定义字段及其值。

它就像一个“数据容器”,把你在后台为这篇文章添加的所有自定义字段(如“作者简介”、“产品规格”、“视频链接”等)的“字段名”和“字段值”都存了进去,方便你在模板中直接调用。


dede_fieldshash 的核心作用与优势

dede_fieldshash 出现之前,调用自定义字段需要使用 {dede:field.字段名/} 这种方式,但这种方式存在两个主要问题:

  1. 效率低下:每调用一个自定义字段,系统就需要执行一次数据库查询,如果一篇文章有10个自定义字段,列表页显示10篇文章,那么就需要执行 10 * 10 = 100 次额外的数据库查询,这对网站性能是巨大的负担。
  2. 灵活性差:模板写死,无法动态处理,你无法在模板里写一个循环来遍历所有自定义字段并显示出来。

dede_fieldshash 的出现完美解决了这两个问题:

织梦 dede_fieldshash
(图片来源网络,侵删)
  1. 性能优化:它只在页面加载时一次性查询并缓存所有自定义字段的数据,之后在模板中无论调用多少次,都只是从这个内存数组中读取,无需再访问数据库,极大地提升了页面加载速度。
  2. 灵活调用:因为它是一个标准的PHP数组,你可以在模板中结合PHP代码(使用 {dede:php}...{/dede:php} 标签)进行各种复杂的操作,如遍历、判断、格式化输出等。

如何使用 dede_fieldshash

dede_fieldshash 的使用分为两种情况:列表页内容页

在列表页模板 (list_*.html) 中使用

在列表页,{dede:list} 标签的底层会循环生成每一篇文章,在循环内部,field 变量代表当前文章的常规字段(如标题、ID、发布时间等),而 fields 变量则代表当前文章的自定义字段集合

重要提示:在列表页,自定义字段的数组变量名是 fields,而不是 fieldshashfieldshash 通常在内容页或通过PHP代码中指代这个概念。

示例:调用文章的“产品价格”这个自定义字段

织梦 dede_fieldshash
(图片来源网络,侵删)

假设你在后台模型中添加了一个名为 price 的自定义字段。

{dede:list pagesize='10'}
    <li>
        <!-- 调用常规字段 -->
        <a href="[field:arcurl/]">[field:title/]</a>
        <!-- 调用自定义字段 "price" -->
        <!-- 方法一:直接调用(推荐) -->
        价格:[field:price/]
        <!-- 方法二:通过PHP代码调用(更灵活) -->
        {dede:php}
            if(isset($fields['price']) && !empty($fields['price'])) {
                echo "价格(PHP方式):" . $fields['price'];
            }
        {/dede:php}
    </li>
{/dede:list}

遍历并显示所有自定义字段(高级用法)

如果你想显示一篇文章的所有自定义字段,而不是一个个写死,可以这样:

{dede:list pagesize='10'}
    <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
    <div class="custom-fields">
        {dede:php}
            // 遍历 $fields 数组
            foreach ($fields as $fieldname => $fieldvalue) {
                // 过滤掉一些系统内置的或不需要显示的字段
                if (!in_array($fieldname, array('id', 'typeid', 'arcrank', 'channel', 'senddate', 'mid'))) {
                    // 自定义字段的配置信息通常存储在 @me 中
                    $fieldInfo = $GLOBALS['fields_array'][$fieldname];
                    if ($fieldInfo) {
                        echo "<p><strong>" . $fieldInfo['itemname'] . ":</strong> " . $fieldvalue . "</p>";
                    }
                }
            }
        {/dede:php}
    </div>
{/dede:list}

注意:$GLOBALS['fields_array'] 存储了所有自定义字段的配置信息,如字段名、字段别名、字段说明等。


页模板 (article_*.html) 中使用

页,系统已经将当前文章的所有数据(包括常规字段和自定义字段)加载到了 this 对象中。dede_fieldshash 在这里通常以 this->Fields 的形式存在,并且它是一个包含了所有字段的大数组

示例:调用文章的“作者简介”和“视频链接”

假设自定义字段名为 author_introvideo_url

<h1>{dede:field.title/}</h1>
<div class="content">
    {dede:field.body/}
</div>
<div class="additional-info">
    <!-- 方法一:直接调用(最常用) -->
    <h3>作者简介</h3>
    <p>{dede:field.author_intro/}</p>
    <h3>相关视频</h3>
    <video src="{dede:field.video_url/}" controls width="100%"></video>
</div>
<!-- 方法二:通过PHP代码遍历所有自定义字段 -->
{dede:php}
    if (isset($this->Fields) && is_array($this->Fields)) {
        echo "<h3>所有自定义字段信息:</h3><ul>";
        foreach ($this->Fields as $key => $value) {
            // 通常我们不希望显示一些系统字段
            if (!in_array($key, array('id', 'typeid', 'sortrank', 'ismake', 'channel', 'arcrank', 'click', 'money', 'title'))) {
                echo "<li><strong>" . $key . ":</strong> " . $value . "</li>";
            }
        }
        echo "</ul>";
    }
{/dede:php}

总结与最佳实践

特性 说明
变量本质 一个PHP数组,存储了当前文档的自定义字段名和值。
核心优势 性能优化:一次查询,多次调用,避免数据库冗余访问。
列表页使用 变量名为 fields,在 {dede:list} 循环内部使用。
调用方式 首选{dede:field.字段名/}
备选:在 {dede:php} 标签内通过 $fields['字段名']$this->Fields['字段名'] 调用。
适用场景 所有需要调用自定义字段的列表页和内容页模板。

最佳实践建议:

  1. 优先使用简写:在模板中,直接使用 {dede:field.字段名/} 是最简洁、最高效的方式,DedeCMS底层会自动从 fieldsthis->Fields 数组中取值。
  2. 复杂逻辑用PHP:当你需要对自定义字段进行判断、循环、拼接等复杂操作时,务必使用 {dede:php}...{/dede:php} 标签,利用PHP的强大功能来实现。
  3. 保持命名规范:在后台添加自定义字段时,使用有意义的英文字段名(如 product_price, author_intro),方便在模板中记忆和调用。

掌握 dede_fieldshash(及其在列表页的体现 fields)的使用,是提升DedeCMS模板制作效率和网站性能的关键一步。

-- 展开阅读全文 --
头像
织梦后台dede目录文件有哪些作用?
« 上一篇 2025-12-11
dede showmsg如何实现0延时设置?
下一篇 » 2025-12-11

相关文章

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

目录[+]