核心思想
页调用的核心逻辑是:先获取当前文章的ID,然后根据这个ID去数据库中查找并显示对应字段的值。
织梦模板引擎使用 {dede:field} 标签来处理这些调用。
第一步:确保自定义字段已正确创建和填写
在进行任何模板修改之前,请务必确认:
- 后台创建字段:登录DedeCMS后台,进入【核心】-> 【内容模型管理】,找到你当前文章所使用的模型(文章”),点击【管理字段】。
- 添加字段:点击【添加新字段】。
- 字段名:这是数据库中的字段名,建议使用英文,如
myauthor,myvideo。 - 字段标识:这是在模板中调用的名称,通常和字段名一致即可。
- 数据类型:选择合适的类型,如
文本、编辑器、附件、多媒体等。 - 填写栏目:选择该字段在哪些栏目下显示,通常选择“所有栏目”或指定栏目。
- 字段名:这是数据库中的字段名,建议使用英文,如
- 发布文章时填写:去前台发布一篇新文章(或编辑旧文章),你应该能看到新添加的字段,并填入相应内容。
第二步:在内容页模板 (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 文件。
- 打开
/include/helpers/extend.helper.php文件。 - 在文件末尾
?>之前,添加以下自定义函数:
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,请根据你的实际情况修改。
- 在你的模板文件
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 标签(更规范)
这是织梦官方推荐的方法,可以获取附件的完整信息。
- 在模板中调用:
<!-- 调用视频 -->
{dede:field.myvideo function='ddgetvalue(@me)'/}
- 修改
/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标签,除了默认字段,还要额外查询myauthor和myvideo这两个字段。channelid='1'模型的ID,1通常是“文章”模型,请根据你的模型ID填写。
调用后显示为空,怎么办?
这是最常见的问题,请按以下顺序排查:
- 检查字段名:确保模板中
{dede:field.字段名/}的“字段名”和你后台创建的“字段名”完全一致,包括大小写。 - 检查文章内容:去后台编辑这篇文章,确保自定义字段已经填写了内容。
- 检查模型和表:确认你的文章使用了正确的模型,自定义字段存储在
dede_addonarticle(文章)、dede_addonimages(图集)等表中,如果模型搞错了,数据自然找不到。 - 检查模板缓存:删除
/data/tplcache/目录下的所有缓存文件,然后刷新页面。 - 检查文件权限:确保你修改的模板文件和
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内容页中调用自定义字段!如果遇到具体问题,可以提供你的字段类型、名称和遇到的具体错误,我可以给出更精确的解决方案。
