.平时做网站的时候,难免遇上一些特殊情况,默认的CMS是无法实现的,这时就需要改程序,就比如说,让频道自动跳转到第一个子栏目,当我还对DEDECMS不熟悉的时候,采用了一个非常笨的方法,用JS去跳转,这对优化非常不好。但是反正客户不懂,效果能实现就OK了。
<script>
{dede:channel type='son' row='1'}
window.location.href='[field:typelink /]';
{/dede:channel}
</script>
新建一个url.htm文件,然后将一级栏目的栏目属性设置为封面页。并将封面模版更改为url.htm。
将以下代码复制到该文件中即可;
今天我就来说说用如果通过修改源码来简单实现,其实DEDECMS在数据库表@#_arctype中,是否为频道,是用ispart这个字段去保存的,它有3个值(0,-1,1),对应的网站后台的 频道封面、最终栏目、外部连接。
所以我们只需要在程序中对ispart进行一个简单的判断,就OK。废话不多说了,
第一步:打开/include/helpers/channelunit.helper.php 打开下面的代码 GetOneTypeUrlA函数
function GetOneTypeUrlA($typeinfos)
{
return GetTypeUrl($typeinfos['id'],MfTypedir($typeinfos['typedir']),$typeinfos['isdefault'],$typeinfos['defaultname'],
$typeinfos['ispart'],$typeinfos['namerule2'],$typeinfos['moresite'],$typeinfos['siteurl'],$typeinfos['sitepath']);
}
function GetOneTypeUrlA( $typeinfos ) |
| if ( $typeinfos [ 'ispart' ]==1) { |
| $typeinfos = $dsql ->GetOne( 'select * from idea_arctype where reid=' . $typeinfos [ 'id' ].' |
| return GetTypeUrl( $typeinfos [ 'id' ],MfTypedir( $typeinfos [ 'typedir' ]), |
| $typeinfos [ 'isdefault' ], $typeinfos [ 'defaultname' ], |
| $typeinfos [ 'ispart' ], $typeinfos [ 'namerule2' ], |
| $typeinfos [ 'moresite' ], $typeinfos [ 'siteurl' ], $typeinfos [ 'sitepath' ]); |
就这样OK了~! 但是这样频道封面就没有用了,其实我们还可以去给ispart增加一个其它的值,比如“2”来代表需要跳转到第一个子栏目的,把程序中的$typeinfos['ispart']==1改成$typeinfos['ispart']==2就OK了
以上方法网上找的,不行。列表页的链接不对了。
自己研究了一下 include/taglib/channelartlist.lib.php line85增加一个if判断,搞定!!
while($row = $dsql->GetArray()) {
if($row["ispart"]==1&&$row["reid"]==0){//lyy2014-8-12 当栏目为单页,且为顶级栏目调用第一个子栏目链接。
$row1 = $dsql->GetOne("select reid,id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath from #@__arctype where reid='".$row['id']."' ORDER BY sortrank ASC");
if(!empty($row1)){//有子类,没有不作操作
$row['defaultname']=$row1['defaultname'];
}
}
$typeids[] = $row;
}