找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1200|回复: 0

[分享] DEDEcms5.7搜索结果页面中调用自定义字段

[复制链接]
发表于 2018-2-25 15:25:27 | 显示全部楼层 |阅读模式 来自 中国–河南–新乡
找了好多文章和教程,却发现dedecms的标签底层模板字段不包括这个字段呢?这就大大限制了灵活性,但dede也不可能让所有字段都允许调用的,那样就会大大降低系统效率,所以今天分享的是一个比较完美解决这个问题的方法,配合dede标签,几乎可以说没有什么不能调用的了
首先把上面代码放到 include/extend.func.php 里
使用方法:
  1. function table($table, $field, $id)
  2. {
  3. global $dsql;
  4. $primarys = array();
  5. $table = strpos($table, ‘#@_’) === false?(strpos($table, ‘dede_’) === false?’dede_’.$table:str_replace(‘dede_’,’dede_’,$table)):$table;
  6. $dsql -> Execute(“me”,”SHOW COLUMNS FROM `$table`”);
  7. while ($r = $dsql->GetArray())
  8. {
  9. if($r['Key'] == ‘PRI’) $primarys[] = $r['Field'];
  10. }
  11. if(!empty($primarys))
  12. {
  13. $primary = $primarys[0];
  14. $result = $dsql -> GetOne(“SELECT `$field` FROM `$table` WHERE `$primary`= $id”);
  15. }
  16. return isset($result[$field])?$result[$field]:”;
  17. }
复制代码

利用自定义函数对标签进行扩展
如:
{dede:标记 function=’table(“要调用的表名”,”要调用的字段”,@me)’/}
这里的“标记”就是要调用的表的主键的值,常见的就是id和aid、mid、uid之类的
标签底层模板内
[field:字段 function=table(“要调用的表名","要调用的字段",@me)/]
举例
例如arclist标签底层模板字段是没有body字段的,就是说不能用arclist把文章内容调用出来的,当然这种需求很少,但不是没有,现在我们就可以这样使用
还有很多作用,如type标签调用栏目简介,等等
另一种DEDEcms5.7搜索结果页面中调用自定义字段处理办法
默认dedecms搜索页面是没法使用 [field:price/] 来调用 dede_addonshop 里面的 price 字段, 解决方法: 修改 include/arc.searchview.class.php 第一处: 将大约 320 行地方的代码: if($this-ChannelType 0 || $this-ChannelTypeid 0){ if($this-ChannelType==0) $id=$this-Cha
默认dedecms搜索页面是没法使用[field:price/]来调用dede_addonshop里面的price字段,解决方法:
修改include/arc.searchview.class.php
第一处:
将大约320行地方的代码:
  1. if($this->ChannelType < 0 || $this->ChannelTypeid< 0){
  2. if($this->ChannelType==”0″) $id=$this->ChannelTypeid;
  3. else $id=$this->ChannelType;
  4. $row =$this->dsql->GetOne(“Select addtable From `cn_channeltype` Where id=$id”);
  5. $addtable = trim($row['addtable']);
  6. $this->AddTable=$addtable;
  7. }else{
  8. $this->AddTable=”cn_archives”;
  9. }
复制代码

改为:
  1. if($this->ChannelType==”0″) $id=$this->ChannelTypeid;
  2. else $id=$this->ChannelType;
  3. $row =$this->dsql->GetOne(“Select addtable From `cn_channeltype` Where id=$id”);
  4. $addtable = trim($row['addtable']);
  5. if($this->ChannelType < 0 || $this->ChannelTypeid< 0){
  6. $this->AddTable=$addtable;
  7. $this->AddonTable=”;
  8. }else{
  9. $this->AddTable=”cn_archives”;
  10. $this->AddonTable=$addtable;
  11. }
复制代码

第二处:
将大约500行的地方的代码:
  1. $query = “Select arc.*,act.typedir,act.typename,act.isdefault,act.defaultname,act.namerule,
  2. act.namerule2,act.ispart,act.moresite,act.siteurl,act.sitepath
  3. from `{$this->AddTable}` arc left join `cn_arctype` act on arc.typeid=act.id
  4. where {$this->AddSql} $ordersql limit $limitstart,$row”;
复制代码

改为:
  1. if (!empty($this->AddonTable)) {
  2. $this->AddonTable=”left join `{$this->AddonTable}` addon on addon.typeid=arc.typeid”;
  3. }else {
  4. $this->AddonTable=”;
  5. }
  6. $query = “Select arc.*,act.typedir,act.typename,act.isdefault,act.defaultname,act.namerule,
  7. act.namerule2,act.ispart,act.moresite,act.siteurl,act.sitepath,addon.*
  8. from `{$this->AddTable}` arc left join `cn_arctype` act on arc.typeid=act.id {$this->AddonTable}
  9. where {$this->AddSql} $ordersql limit $limitstart,$row”;
复制代码

好了,可以在search.htm中使用[field:price/]了,只要你的模型有附加表,你就可以使用表里的任何字段
另外注意:如果附加表里有字段名和主表字段名一样的,使用[field:xxxx/]的结果是未定义的

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-23 21:38 , Processed in 0.244770 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表