织梦函数GetSonIds()解析获得某id的所有下级id

织梦函数GetSonIds()获得某id的所有下级id,这个函数是如何运行,下面小编为大家进行解析: 原理分析 /** *  获得某id的所有下级id * * @param     string  $id  栏目id * @param     string  $channel  模型ID * @param     string  $addthis  是否包含本身 * @re
织梦函数GetSonIds()获得某id的所有下级id,这个函数是如何运行,下面小编为大家进行解析

原理分析

/**
 *  获得某id的所有下级id
 *
 * @param     string  $id  栏目id
 * @param     string  $channel  模型ID
 * @param     string  $addthis  是否包含本身
 * @return    string
 */
function GetSonIds($id,$channel=0,$addthis=true)
{
    global $cfg_Cs;
    $GLOBALS['idArray'] = array();
    if( !is_array($cfg_Cs) )
    {
        require_once(DEDEDATA."/cache/inc_catalog_base.inc");
    }
    GetSonIdsLogic($id,$cfg_Cs,$channel,$addthis);
    $rquery = join(',',$GLOBALS['idArray']);
    $rquery = preg_replace("/,$/", '', $rquery);
    return $rquery;
}

这个函数GetSonIds($id,$channel=0,$addthis=true)跟函数GetSunTypes($id,$channel=0)功能都是获得某栏目下面的所有子栏目,也包括栏目本身,但是这二个函数返回值不同,函数GetSonIds($id,$channel=0,$addthis=true)返回的值是字符串,函数GetSunTypes($id,$channel=0)返回值是数组。

函数GetSonIds()和GetSunTypes()分别在文件:include/helpers/channelunit.helper.php和include/typeunit.class.admin.php里面。

函数GetSonIds($id,$channel=0)通过遍历cache/inc_catalog_base.inc文件,来取得栏目$id所有id值。

源码分析

1、通过上面的递归逻辑函数GetSonIdsLogic($id,$cfg_Cs,$channel,$addthis)调用后,得到了一个数组$GLOBALS['idArray'],以$id=18为例子,这个数组的值是18,19。

2、通过join(分隔符号,数组)函数把数组变成字符串,存入变量$rquery里面。

函数join()跟函数implode()是完全一样的,同一个函数的不同的叫法,join()函数是implode()函数的别名。

举例子说明这个函数的是如何把数组变成字符串的。
<?php
$arr= array('dog','cat','chiken');
$str= join('|',$arr);
echo $str;
?>
打印结果如下:

dog|cat|chiken

同样,若把join('|',$arr)换成implode('|',$arr)的结果是完全样一样的。

若数组$arr不索引数组,而是关联数组,join('|',$arr)的结果也是一样的,也就是说,无论是关联数组,还是索引数组,都不影响结果,join('|',$arr)只取数组的值。

3、变量$rquery的值是18,19,但是为了保证百分之百正确,函数用了一个正则匹配preg_replace("/,$/",'',$rquery),这个匹配的意思是把最后的符号逗号去掉。然后,return返回18,19这二个栏目id。

4、验证一下:

我们在文件/dede/catalog.do.php加入如下代码:
helper(channelunit);
echo GetSonIds(18);
exit("不能删除!");
到后台删除“网页基础”栏目,得到的结果如下图所示。

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

很多时候用dedecms织梦建站的时候会遇到在调用缩略图,要怎么做到有缩略图的时候才显示,无缩略图就不显示,方法如下 [field:array runphp='yes']@me = (strpos(@me['litpic'],'defaultpic') ? "":""); [/field:array] 带内容简介示例代码如下: [field:array runphp=’yes’
dedecms5.7 采集文章导出时出现类似于Character postion **, field Error的错误,这样的错误会导致文章里没有内容。 引起这个问题的原因可能是description中一些特殊符号引起的,如果你不想出现这个问题,可以在采集文章时过滤掉description,导出文档后再批
dedecms我们用火车头采集文章时发现,文章入库后显示发布时间为1970-1-1,这个一般是什么原因造成的,该如何操作呢? 开始我以为是发布模块有问题,因为这个不需要采集这个时间,所以我在发布模块里面把时间标签给删除了,但加上后,还是同
在{dede:arclist}这个标签中大家都知道有个[field:global.autoindex/],这个变量每生成一行就+1,我们有时候在使用{dede:sql}标签也需要加上这个功能,需要怎么操作呢? 首先打开/include/taglib/sql.lib.php这
我们有时候让分管理添加的文档,又懒得审核,那么怎么让系统自动审核并生成文档呢? 首先在plus下新建文件,名字可以随意起,比如我的是make.php 内容如下: ?php$lasttime=filemtime($_SERVER['DOCUMENT_ROOT']."/index.html");$interval=180; //更新时间秒为单位18
超级实用的dedecms织梦的数据库操作类,学习如下类之后,以后写sql语句就容易多了,使用时候请自行按照自己网站修改表前缀。 获取一条记录的内容: $row = $dsql-GetOne("Select * From dede_* where id = $aid");echo $row['id']; 将查询获取总数输出 $row = $dsql-Ge