织梦获得指定类目的URL链接函数GetTypeUrl()

admin2023-01-181447

函数名:GetTypeUrl($typeid,$typedir,$isdefault,$defaultname,$ispart,$namerule2,$moresite=0,$siteurl='',$sitepath='')

功能:获取指定类目的url,就是我们在后台建立栏目时的栏目url,这又是一个参数很多的函数。

所在文件:include/helpers/channelunit.helper.php

返回值:返回获取的栏目url

这个函数也比较重要,但是,这个函数与获取文件名函数GetFileName()相比,就简单多了。与获取文章url相比就复杂多,但是,如果我们把获取文件名函数和获取文章url函数GetFileUrl()都弄明白,那么,这个就非常简单了。设计这个函数的思想跟获取文章url的思想完全样一,无非是处理的具体内容不一罢了。

无论在前台织梦模板标签里用{dede:arclist}[field:typeurl/]{/dede:arclist}还是在动态模板引擎处理的模板里面通过{dede:datalist}{dede:field.typeurl/}{/dede:datalist}来调用数据,这里面都有一个typeurl,不知道你想过没有,这又是哪里来的?是表中的字段?其实,你在织梦所有表中查询一下这个,你不可能找到这个字段,因为它本来就不是一个字段,而是由一个函数,也就是本教程讲的函数GetTypeUrl()作为基础,组装而来的。

如果你对这个函数感兴趣,那么,请来织梦基地研究一下吧。

源代码分析开始:

1.处理栏目和站点目录,即:

$typedir: {cmspath}/a/webbase 

$site:绑定域名url也就是如下图所示

通过函数MfTypedir($varname)进行处理,也就是把{cmspath}去掉,然后,处理斜杠问题。

几个变量的说明:

以下几个变量比较重要,这里我说明一下。

一.栏目列表选项$isdefault变量:这个指的是我们在建立栏目时,选择栏目列表选项,也就是下图所示。

这个栏目列表选项$isdefault有三个值: 

1表示:链接到默认页 

0表示:链接到列表第一页 

-1表示:使用动态页 

二.栏目属性$ispart: 这个指我们在建立栏目时,选择的是列表还封面,还是外部连接,如下图所示。

53KF20200113100443134.png

$ispart的三个值:

0表示:最终列表栏目

1表示: 频道封面

2表示: 外部连接

三.变量$cfg_typedir_df指的是栏目网址使用目录名,如下图所示。

如果选择是,则栏目就会显示/a/b/c/这样的栏目,而不是显示a/b/c/index.html

把上面的变量弄明白后,我们接着分析代码。

2.若$isdefault==-1说明是我们建立的栏目要使用动态的,既然用户设置动态的,如下图所示。

我们就让栏目显示为动态的,类似如下图所示。

这一行代码非常简单了吧,就是一个判断,判断我们后台有没有设置使用动态的。

3.判断是不是跳转网址,若是则跳转,跟上面的完全一样的思路,若我们在建立栏目使用“外部链接”那么,我们就直接跳转到外部连接。例如,我建立一个栏目css3,文件保存位置为http://www.dedebase.com,然后,选择跳转网址,如下图所示。

这样当我们点击栏目上的css3变直接跳转到http://www.dedebase.com网站里面了。

4. 条件判断if($isdefault==0 && $ispart==0)的意思是,同时选择“链接到列表第一页”和“最终列表栏目”,如下图所示。

53KF20200113100653710.png

这样对应的栏目链接就是类似如下形式如下图所示。

53KF20200113100804051.png

这个条件就是定义的上面的这个链接里面的栏目id为15和后面的一个固定值为1的这么一个栏目连接,这个就是这个栏目的默认页。

5.若不使用/a/b/这种形式的栏目链接或者是选中的是“ 链接到列表第一页”,那么,栏目的链接都是/a/b/index.html这种形式。否则,为/a/b/这种形式,这段功能代码为:

if($cfg_typedir_df=='N' || $isdefault==0) $reurl = $typedir.'/'.$defaultname;
else $reurl = $typedir.'/';

6. 若栏目链接,不是以http:开头的,则把第一个"/" 开始的一个或多个"/"符号替换为一个"/",即'////a/b/' 通过preg_replace("/\/{1,}/i", '/', $reurl)函数的处理后,得到的是正常的'/a/b/' 。

代码如下:

if( !preg_match("/^http:\/\//",$reurl) ) {
$reurl = preg_replace("/\/{1,}/i", '/', $reurl);
}

7.下面这段代码,我们在函数GetFileUrl()里面已经分析了,就是通过判断$cfg_multi_site的值,来设置文件生成是不是用绝对网址,生成内容。

网友评论