ag游戏客服|官方二次开发

?找回密码
?立即注册
搜索
热搜: 活动 交友 discuz
查看: 1323|回复: 1
打印 上一主题 下一主题

[函数] ag游戏客服|官方返回子栏目ID列表函数

[复制链接]

1046

主题

1109

帖子

5334

积分

超级版主

Rank: 8Rank: 8

金币
256
贡献
3959
跳转到指定楼层
楼主
发表于 2015-5-31 12:07:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dedebase 于 2015-5-31 12:09 编辑

??我们知道在ag游戏客服|官方里面有几百个函数,本教程介绍的是“返回子栏目ID列表”函数GetSunTypes($id, $channel=0),代码如下:
  1. ? ? /**
  2. ? ???*??返回与某个栏目相关的下级目录的类目ID列表(删除类目或文章时调用)
  3. ? ???*
  4. ? ???* @access? ? public
  5. ? ???* @param? ???int? ?$id??栏目ID
  6. ? ???* @param? ???int? ?$channel??频道ID
  7. ? ???* @return? ? array
  8. ? ???*/
  9. ? ? function GetSunTypes($id, $channel=0)
  10. ? ? {
  11. ? ?? ???$this->dsql = $GLOBALS['dsql'];
  12. ? ?? ???$this->idArray[$this->idCounter]=$id;
  13. ? ?? ???$this->idCounter++;
  14. ? ?? ???$fid = $id;
  15. ? ?? ???if($channel!=0)
  16. ? ?? ???{
  17. ? ?? ?? ?? ?$csql = " And channeltype=$channel ";
  18. ? ?? ???}
  19. ? ?? ???else
  20. ? ?? ???{
  21. ? ?? ?? ?? ?$csql = "";
  22. ? ?? ???}
  23. ? ?? ???$this->dsql->SetQuery("SELECT id FROM `#@__arctype` WHERE reid=$id $csql");
  24. ? ?? ???$this->dsql->Execute("gs".$fid);

  25. ? ?? ???while($row=$this->dsql->GetObject("gs".$fid))
  26. ? ?? ???{
  27. ? ?? ?? ?? ?$nid = $row->id;
  28. ? ?? ?? ?? ?$this->GetSunTypes($nid,$channel);
  29. ? ?? ???}
  30. ? ?? ???return $this->idArray;
  31. ? ? }
复制代码
这个频道id为默认为0,也就是官方介绍的“返回与某个栏目相关的下级目录的类目ID列表”函数,官方的这句话,有点难懂,其实,就是把一个栏目的子栏目id全部返回,就这么简单。

??因为是一个函数,如果只讲它的具体代码,就像只读课本知道那样,这样效果不好,今天我们就以ag游戏客服|官方后台建立的栏目“网页基础”这个栏目为例子,如下图所示。



??我们就返回这个栏目下面的所有子栏目。

??要注意:我们要学ag游戏客服|官方某一个函数时,一定不要单独去拿出某个函数来学,还要看这个函数在哪个类或其它php文件里面。就像本教程的这个函数,本来源于“栏目单元类文件”typeunit.class.admin.php。

??这个函数有二个参数,一个是栏目id,这个栏目id指的是“网页基础”这个最顶级的栏目id,因为,这个函数的功能是返回子栏目所有id,这样我们要查询的时候,就用到了栏目表#@__arctype里面的字段上级栏目reid,也就是本函数中的这句sql语句
  1. "SELECT id FROM `#@__arctype` WHERE reid=$id $csql"
复制代码

一开始看这条件语句时,差点没有转过弯来,当时,想不是“网页基础”就是最顶级栏目吗?为什么还有他的上级栏目,这样思考就错了,这里的reid=$id指的是查询上级栏目为“网页基础”也就是id=1的子栏目id, 这里的reid指的是上级栏目为1,而不是指栏目为1的上级栏目,倒过来意义完全就变了,这个地方容易理解错。

??第二个参数是频道id,这里默认为0。

??下面这四行做了一个初始化设置,
  1. ? ?? ???$this->dsql = $GLOBALS['dsql'];
  2. ? ?? ???$this->idArray[$this->idCounter]=$id;
  3. ? ?? ???$this->idCounter++;
  4. ? ?? ???$fid = $id;
复制代码
这就是为什么我上面提到的学习某一ag游戏客服|官方函数要与对应的文件关联起来,要不会出错,前三个初始化都有在“栏目单元”类文件开始就定义好的,所以,大家在看这个教程前先打开文件typeunit.class.admin.php对比着看,要不就会出错。

??接下来就是判断频道id是不是零,只要有参数的函数一定会对参数处理的,具体到某个函数要不要参数,这与某个函数具体功能有关,在这个函数中频道id是否为零真接决定了查询的结果。在这个条件sql语句里面,有一个重要的知识点就是对接,当频道模型不为零时,定义了一个变量
  1. $csql = " And channeltype=$channel "
复制代码

??这个变量$csql可以为接下来的sql查询语句进行对接,这个在织ag游戏客服|官方系统里面的“高级搜索”体现的淋漓尽致,关于“高级搜索”的教程,里面有详细的讲解,大家可以去查看。

??设置sql:$this->dsql->SetQuery("SELECT id FROM `#@__arctype` WHERE reid=$id $csql");
??
??执行查询:$this->dsql->Execute("gs".$fid);

??接下来就是一个while循环遍历,这是这个函数的核心,并且这个while里面还有一个递归调用,因为,一个栏目可能有很多级子栏目,像本例子中“网页基础”下面有一个栏目Javascript/Ajax,而这个栏目下面又有二个栏目js和ajax,在js栏目下面又有一个js教程栏目,所以,这里用到了递归调用。

??当把“网页基础”下面的第一个栏目id为4的栏目遍历出来时,又把栏目id为4的栏目,作为上级栏目,即reid=4, 此时,程序进行递归,查询出id为14的栏目,这时再把14作为上级栏目,即reid=14,再查询它的子栏目“js教程”id为16,再经过查询发现id=16的在栏目表里面已经没有了reid对应,此时,递归结束。同样id为15的栏目“ajax”同样的遍历递归。

??我们从数据库里面看一下这几个栏目的关系,也许会对我们理解更加容易,程序递归遍历图。
??

??通过上面的分析,我们已经对家个函数已经有了一定的了解,其实,如果弄明白了上面的这些讲解,你对这个函数一定印象深刻吧,我们再从ag游戏客服|官方系统里面找一个例子,再看看这个函数的功能。

??我们以ag游戏客服|官方后台“网站栏目管理”里面的“删除”功能为例子来进一步研究一下这个例子。“删除”功能如下图所示。



??这个“删除”功能对应的文件是www.dedebase.com/dede/catalog_del.php

??在代码$ut = new TypeUnit();后面加入如下代码:
  1. $arr= $ut->GetSunTypes($id,1);
  2. echo "
    ";
  3. print_r($arr);
  4. echo "
  5. ";
  6. exit("先不要删除!");
复制代码

??然后,点击“网页基础”后面的“删除”——“确定”后得到如下结果:
  1. Array
  2. (
  3. ? ? [0] => 1
  4. ? ? [1] => 4
  5. ? ? [2] => 14
  6. ? ? [3] => 16
  7. ? ? [4] => 15
  8. )

  9. 先不要删除!
复制代码
游客,如果您要查看本帖隐藏内容请回复

0

主题

1

帖子

10

积分

vip用户

Rank: 5Rank: 5

金币
0
贡献
9
沙发
发表于 2018-4-25 22:36:06 | 只看该作者
内容很充实,正在努力学习中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|ag游戏客服|官方二次开发

GMT+8, 2019-11-13 19:56 , Processed in 0.314727 second(s), 22 queries .

Powered by Discuz! X3.2

? 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表