dede内容页调用自定义字段

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

核心思想

页调用的核心逻辑是:先获取当前文章的ID,然后根据这个ID去数据库中查找并显示对应字段的值。

织梦模板引擎使用 {dede:field} 标签来处理这些调用。


第一步:确保自定义字段已正确创建和填写

在进行任何模板修改之前,请务必确认:

  1. 后台创建字段:登录DedeCMS后台,进入【核心】-> 【内容模型管理】,找到你当前文章所使用的模型(文章”),点击【管理字段】。
  2. 添加字段:点击【添加新字段】。
    • 字段名:这是数据库中的字段名,建议使用英文,如 myauthor, myvideo
    • 字段标识:这是在模板中调用的名称,通常和字段名一致即可。
    • 数据类型:选择合适的类型,如 文本编辑器附件多媒体 等。
    • 填写栏目:选择该字段在哪些栏目下显示,通常选择“所有栏目”或指定栏目。
  3. 发布文章时填写:去前台发布一篇新文章(或编辑旧文章),你应该能看到新添加的字段,并填入相应内容。

第二步:在内容页模板 (article_article.htm) 中调用

打开你当前使用的内容页模板文件,通常位于 templets/default/article_article.htm

调用【文本】、【多行文本】、【编辑器】类型字段

这类字段直接使用 {dede:field.字段名/} 即可。

示例:

假设你创建了一个名为 myauthor 的字段来存储作者信息。

<!-- 文章标题 -->
<h1>{dede:field.title/}</h1>
<!-- 文章内容 -->
{dede:field.body/}
<!-- 调用自定义的作者字段 -->
<p><strong>特约作者:</strong>{dede:field.myauthor/}</p>
<!-- 假设你还有一个名为 'source' 的来源字段 -->
<p><strong>来源:</strong>{dede:field.source/}</p>

调用【单选按钮】、【下拉框】类型字段

这类字段在数据库中存储的是选项的值,但我们需要显示选项的文本,织梦提供了专门的标签来处理这种情况。

示例:

假设你创建了一个名为 newslevel 的字段,类型为“单选按钮”,选项为:

  • 值: 1 文本: 重要
  • 值: 2 文本: 普通
  • 值: 3 文本: 转载

使用 function 函数(推荐)

这是最灵活、最常用的方法,你需要修改 /include/helpers/extend.helper.php 文件。

  1. 打开 /include/helpers/extend.helper.php 文件。
  2. 在文件末尾 ?> 之前,添加以下自定义函数:
if ( ! function_exists('GetFieldValue'))
{
    function GetFieldValue($fieldvalue, $fieldname, $aid)
    {
        global $dsql;
        $query = "SELECT `$fieldname` FROM `dede_addonarticle` WHERE aid = '$aid'";
        $row = $dsql->GetOne($query);
        $optionText = '';
        // 这里根据你的字段选项逻辑来写
        if ($row[$fieldname] == '1') {
            $optionText = '重要';
        } elseif ($row[$fieldname] == '2') {
            $optionText = '普通';
        } elseif ($row[$fieldname] == '3') {
            $optionText = '转载';
        }
        return $optionText;
    }
}

注意dede_addonarticle 是文章模型的自定义表名,如果你的模型是“图集”,它可能就是 dede_addonimages,请根据你的实际情况修改。

  1. 在你的模板文件 article_article.htm 中调用:
<!-- 使用自定义函数 -->
<p><strong>新闻级别:</strong>{dede:field.name='GetFieldValue' function='GetFieldValue(@me, newslevel, @aid)'/}</p>
  • @me:代表当前字段的值(这里是 newslevel 的值,如 '1', '2', '3')。
  • newslevel:是你要查询的字段名
  • @aid:是当前文章的ID,函数会用到它来查询数据库。

直接使用 array 标签(适用于选项固定的情况)

如果你的选项是固定的,可以直接在模板里定义一个数组。

{dede:field.name='array'}
    <?php
    $options = array(
        '1' => '重要',
        '2' => '普通',
        '3' => '转载'
    );
    // @me 是当前字段的值,作为数组的键
    echo $options[@me];
    ?>
{/dede:field.name}

在模板中这样使用:

<p><strong>新闻级别:</strong>
{dede:field.name='array' function='return array("1"=>"重要", "2"=>"普通", "3"=>"转载");'}[@me]
</p>

这种方法稍微复杂一点,方法一更通用。

调用【附件】、【图片】、【多媒体】类型字段

这类字段通常存储的是附件的路径或ID,需要通过特殊标签来获取详细信息。

示例:

假设你创建了一个名为 myvideo 的字段来存储视频。

直接获取路径

如果你的字段只是存了一个简单的URL路径。

<!-- 直接调用字段值,它可能是一个MP4文件的路径 -->
<video src="{dede:field.myvideo/}" controls width="600"></video>

使用 ddgetvalue 标签(更规范)

这是织梦官方推荐的方法,可以获取附件的完整信息。

  1. 在模板中调用
<!-- 调用视频 -->
{dede:field.myvideo function='ddgetvalue(@me)'/}
  1. 修改 /include/helpers/extend.helper.php 文件,添加 ddgetvalue 函数:
if ( ! function_exists('ddgetvalue'))
{
    function ddgetvalue($aid)
    {
        global $dsql;
        $row = $dsql->GetOne("SELECT * FROM `dede_addonarticle` WHERE aid='$aid'");
        if(is_array($row)) {
            return $row[$aid]; // 这里简化了,实际可以根据附件ID获取更多信息
        } else {
            return "";
        }
    }
}

注意ddgetvalue 函数的实现可能需要根据你的具体字段类型进行调整,对于多媒体字段,它通常会返回 <embed><video> 标签的HTML代码,如果你发现调用后显示的是一串ID而不是播放器,说明函数需要完善。

一个更完善的 ddgetvalue 函数示例(用于视频):

if ( ! function_exists('ddgetvalue'))
{
    function ddgetvalue($body)
    {
        // 如果字段内容本身就是完整的HTML标签,直接返回
        if (strpos($body, '<video') !== false || strpos($body, '<embed') !== false) {
            return $body;
        }
        // 否则,假设它只是一个路径,我们手动构建标签
        // 这里可以根据你的需求调整标签属性
        return "<video src='".$body."' controls width='600'></video>";
    }
}

第三步:高级技巧与常见问题

如何调用自定义字段在列表页或首页?

这需要用到 {dede:arclist} 标签的 addfields 属性。

{dede:arclist addfields='myauthor,myvideo' channelid='1'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <!-- 调用自定义字段 -->
        <p>作者:[field:myauthor/]</p>
        [field:myvideo/]
    </li>
{/dede:arclist}
  • addfields='myauthor,myvideo':告诉arclist标签,除了默认字段,还要额外查询 myauthormyvideo 这两个字段。
  • channelid='1'模型的ID,1通常是“文章”模型,请根据你的模型ID填写。

调用后显示为空,怎么办?

这是最常见的问题,请按以下顺序排查:

  1. 检查字段名:确保模板中 {dede:field.字段名/} 的“字段名”和你后台创建的“字段名”完全一致,包括大小写。
  2. 检查文章内容:去后台编辑这篇文章,确保自定义字段已经填写了内容。
  3. 检查模型和表:确认你的文章使用了正确的模型,自定义字段存储在 dede_addonarticle(文章)、dede_addonimages(图集)等表中,如果模型搞错了,数据自然找不到。
  4. 检查模板缓存:删除 /data/tplcache/ 目录下的所有缓存文件,然后刷新页面。
  5. 检查文件权限:确保你修改的模板文件和 extend.helper.php 文件有正确的读写权限。

自定义字段无法在后台编辑文章时显示?

模型管理】->【管理字段】中,该字段的 “前台参数” 设置是否正确,通常需要勾选“使字段可以在前台发布内容时使用”或类似的选项。


字段类型 模板调用代码 备注
文本/编辑器 {dede:field.你的字段名/} 最简单的调用方式。
单选/下拉框 {dede:field.name='GetFieldValue' function='GetFieldValue(@me, 字段名, @aid)'/} 需要在 extend.helper.php 中编写函数。
附件/图片/视频 {dede:field.你的字段名 function='ddgetvalue(@me)'/} 需要在 extend.helper.php 中编写函数,以获取完整HTML。

希望这份详细的指南能帮助你成功地在DedeCMS内容页中调用自定义字段!如果遇到具体问题,可以提供你的字段类型、名称和遇到的具体错误,我可以给出更精确的解决方案。

-- 展开阅读全文 --
头像
织梦不能采集 空间支持
« 上一篇 02-03
C语言标准1002的核心内容是什么?
下一篇 » 02-03

相关文章

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

目录[+]