读出所有分类的织梦函数ListAllType($channel=0,$nowdir=0)分析

admin2020-02-011199

当我们点击“网站栏目管理”后,就会看到如下图所示效果。

122645t1hpe1a6a3xem266.jpg

之所以能够看到我们建立的栏目,主要是因为函数ListAllType($channel=0,$nowdir=0)功劳,本教程主要对这个函数进行分析研究,这样对于我们进行织梦二次开发有一定好处。

函数:ListAllType($channel=0,$nowdir=0)

参数:int   $channel  频道ID

int   $nowdir  当前操作ID

返回值:字符串

所在文件:后台栏目管理类,include/typeunit.calss.admin.php

1. 设置全局变量$cfg_admin_channel,$admin_catalogs;设置全局变量dsql。

2. 处理用户有权限的栏目:因为我们可以在后台设置不同的用户,例如信息发布员、频道管理员、超级管理员,这些后台用户由于权限不一样,操作的栏目也是不一样的,这个是我们在添加管理员的时候自己设置某用户可以操作哪些栏目,所以,要读取所有分析,就要根据登录后台的用户来判断一下这个用户可以列出哪些栏目来,下面的代码:

122645t1hpe1a6a3xem266.jpg

就是检测用户列出栏目的权限代码,其中if($cfg_admin_channel=='array')条件里面的参数 $cfg_admin_channel=='array' 其实调用的是用户登录后的内容,也就是说当用户登录后台后,织梦系统就会在data/cache/目录里面生成一个缓存文件类似admincat_8.inc,具体如何生成的我已经在织梦基地里面的教程里面详细分析了,这里不用多解释。

我们查询一下这个文件里面的内容是什么,代码如下所示:

<?php
$cfg_admin_channel = 'array';
$admin_catalogs = array(1,2,3,4,5);
?>

这正好对应着我用test用户名登录后台时的栏目,如下图所示。

所以,从上面我们就可以知道通过$cfg_admin_channel = 'array'来判断一个用户的列出目录权限是有根据的。

通过join(',',$admin_catalogs) 把数组转换成:1,2,3,4,5 这样的字符串,放入到$admin_catalog里面,然后,通过sql查询这几个栏目id对应的上级栏目reid的值。

要注意这个sql:

SELECT reid FROM `#@__arctype` WHERE id in($admin_catalog) group by reid

里面的 group by reid 通过这个grup by 后得到的,查询结果为0,1,虽然,2,3,4,5的reid都是1,因为这样一分组结果就只是1 这个有点像若重复只取一个的意思。

这样通过里面的while执行,代码如下所示:

            while($row = $this->dsql->GetObject())
            {
                if($row->reid==0) continue;
                $topidstr .= ($topidstr=='' ? $row->reid : ','.$row->reid);
            }

最后,得到的结果$topidstr的值为1,实际上这个while就是为了去掉顶级栏目为0的栏目id。

再经过下面的三行代码:

            $admin_catalog .= ','.$topidstr;
            $admin_catalogs = explode(',', $admin_catalog);
            $admin_catalogs = array_unique($admin_catalogs);

最终得到的$admin_catlogs的值是一个一维数组:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

这根文件admincat_8.inc里面的数组完全一样,为什么不直接用这个文件里面的数组呢?非要经过查询一次数据库呢? 这是因为,当我们登录后台后,有可能我们人为的修复的数据库里面的相关内容,例如删除了其中一个id的值记录,这样这个文件和数据库里面的内容就不对应了,如果直接从文件admincat_8.inc里面取值,就出错了。

接着执行代码:

$this->dsql->SetQuery("SELECT id,typedir,typename,ispart,sortrank,ishidden FROM `#@__arctype` WHERE reid=0 order by sortrank");

在这个sql语句里面的条件语句reid=0,也就是说这个sql语句查询的是所有顶级栏目。

通过in_array($row->id, $admin_catalogs)来判断是不是顶级栏目,若不是则跳回到while执行下一条记录,直到找到一个顶级栏目,当然,这个顶级栏目是这个用户登录后有权限操作的顶级栏目,下面的处理就跟“获取子栏目递归调用的织梦函数LogicListAllSunType($id, $step)”一样了,一直到代码$lastid = GetCookie('lastCid')这里,是一样的,虽然,具体的某些代码不同,但是,处理方式完全一样这里就不用多解释。

获取cookie设置的顶级栏目id,代码是:

$lastid = GetCookie('lastCid');

这个是在建立栏目时就设置的一个cookie变量。

只要条件if($channel==$id || $lastid==$id || isset($GLOBALS['exallct']) || $cfg_admin_channel=='array')里面任何一个成立,说明这个栏目里面必定有子栏目,既然有子栏目就调用这个子栏目:

   $this->LogicListAllSunType($id," ");

从上面我们可以看出函数ListAllType($channel=0,$nowdir=0)的功能直接调取并显示的是顶级栏目,而子栏目是通过函数LogicListAllSunType($id," ")来获得的,一般我们设计一个函数时,如果代码太多,这样分开是比较好阅读,而且,还可以单独调用获取子栏目列表这个函数一举二得。

网友评论