以前用织梦DEDECMS做二次开发时获取附加表字段内容都是通过runphp执行SQL查询获得,最近看了看手册,发现一个非常简便的方法。

用arclist调用于附加表字段的方法:

要获取附加表内容,必须符合两个条件
1、指定 channelid 属性
2、指定要获得的字段 addfields=’字段1,字段’
如:
{dede:arclist addfields=’video_description,video_id’ row=’8′ channelid=’3′}
[field:video_description /] – [field:video_id /]
{/dede:arclist}

其中addfields=’video_description,video_id’是附加表中的两个字段,channelid是项目指定的内容频道模型的id而不是项目本身的id。除指定的附加表字段外,其它底层字段如arcurl,title,infos等均能正常调用。

同样,dede:list标签也可调取附加表字段,和arclist不同的是不用指定channeli同时也不用指定addfields,因为系统能自动判断。
调用格式如下:

在larc.listview.class.php 文件中将  找到$addtable  = $this->ChannelUnit->ChannelInfos['addtable']; 将else条件中的两句话给替换成//获取附加表信息 下面这代码( 替换后效代码样式如红字显示):
  //获取附加表信息
     $addfield = trim($ctag->GetAtt('addfields'));
     $addfieldsSql = '';
     $addfieldsSqlJoin = '';
     if($addfield != '' && !empty($channelid))
     {
       $row = $dsql->GetOne("SELECT addtable FROM `#@__channeltype‘ WHERE id='$channelid' ");
       if(isset($row['addtable']) && trim($row['addtable']) != '')
       {
         $addtable = trim($row['addtable']);
         $addfields = explode(',', $addfield);
         $row['addtable'] = trim($row['addtable']);
         $addfieldsSql = ",addf.".join(',addf.', $addfields);
         $addfieldsSqlJoin = " LEFT JOIN `$addtable` addf ON addf.aid = arc.id ";
       }
     }

 

 

 

 

 

     //获得附加表的相关信息
      $addtable  = $this->ChannelUnit->ChannelInfos['addtable'];
  
        if($addtable!="")
        {
            $addJoin = " LEFT JOIN `$addtable` ON arc.id = ".$addtable.'.aid ';
            $addField = '';
            $fields = explode(',',$this->ChannelUnit->ChannelInfos['listfields']);
            foreach($fields as $k=>$v)
            {
                $nfields[$v] = $k;
            }
            if(is_array($this->ChannelUnit->ChannelFields) && !empty($this->ChannelUnit->ChannelFields))
            {
                foreach($this->ChannelUnit->ChannelFields as $k=>$arr)
                {
                    if(isset($nfields[$k]))
                    {
                        if(!empty($arr['rename'])) {
                            $addField .= ','.$addtable.'.'.$k.' as '.$arr['rename'];
                        }
                        else {
                            $addField .= ','.$addtable.'.'.$k;
                        }
                    }
                }
            }
        }
        else
        {
       
     //获取附加表信息
     $addfield = trim($ctag->GetAtt('addfields'));
     $addfieldsSql = '';
     $addfieldsSqlJoin = '';
     if($addfield != '' && !empty($channelid))
     {
       $row = $dsql->GetOne("SELECT addtable FROM `#@__channeltype` WHERE id='$channelid' ");
       if(isset($row['addtable']) && trim($row['addtable']) != '')
       {
         $addtable = trim($row['addtable']);
         $addfields = explode(',', $addfield);
         $row['addtable'] = trim($row['addtable']);
         $addfieldsSql = ",addf.".join(',addf.', $addfields);
         $addfieldsSqlJoin = " LEFT JOIN `$addtable` addf ON addf.aid = arc.id ";
       }
     }

  }