函数名:GetOptionList($hid=0,$oper=0,$channeltype=0,$usersg=0),它的同名函数为GetOptionArray($hid=0,$oper=0,$channeltype=0,$usersg=0),可以认为这二个是一个函数。唯一不同是第二个函数调用第一个函数,所以,它们返回的结果完全一样。
参数:$hid指的是栏目id,但是,包括了值为0的的特殊值,当为0时,表示“请选择类目”或“不限类目”;oper是用户允许管理的类目,0表示所有类目;channeltype是指类目的内容类型,0表示不限频道。
返回值:返回栏目列表字符串
所在文件:include/typelink.class.php
代码分析开始:
1.声明一下全局变量$cfg_admin_channel这个变量是用户登录后台后,生成的缓存文件里面的一个变量。若这个为空则把值设置为all,即$cfg_admin_channel='all'。
处理当前数据库对象,若为空则从超全局数组获取,代码为:
if(!$this->dsql) $this->dsql = $GLOBALS['dsql']
2. 因为,这个函数在批量添加栏目里有使用,默认的$hid=0,若$hid>0,即栏目id>0时,栏目有值,下面代码就处理这个栏目id>0的情况,代码如下:
上面代码里面查询出模型id:
$channeltype = $row['channeltype'];
为什么要查询这个?若函数的参数为0或其它值,而$hid值大于0,则使用从栏目表查询出id=$hid的对应的模型id,即$channeltype的值作为下面的查询条件,若$hid=0,则使用参数里面的设置的模型id的值。所以,这里要查询出这个模型id来。
若$row['ispart']==1,指的是栏目属性为封面频道,若为封面频道则在选项里面加上一个栏目,代码为:
$this->OptionArrayList .= "<option value='".$row['id']."' style='background-color:#DFDFDB;color:#888888' selected>".$row['typename']."</option>\r\n";
其它情况就不加样式,注意这里说的其它情况指的是当$hid>0时的其它情况,而不是$hid=0时的情况。
接下来根据$channeltype值组装sql语句:
if($channeltype==0) $ctsql = '';
else $ctsql=" AND channeltype='$channeltype' ";
3.处理$per参数为数组的情况,若if(is_array($oper)&&$cfg_admin_channel!='all'),即$oper为数组且$cfg_admin_channel不为all时的情况,其中$cfg_admin_channel不等于all,就是指不是管理员登录后台的情况。
若if(count($oper)==0)即这个$per虽然是一个数组,但是,是一个空的数组,这时的$query="SELECT id,typename,ispart FROM`# __arctype`WHERE 1=2";
这条语句其实是查不出任何东西的,除了这种空数组的情况,其它就是正常情况了。
把数组里面的值拿出来用逗号隔开,放到$admin_catalog里面,然后,查询这些id对应的上级栏目id,然后,查询这些id的上级栏目,若上级栏目为0,即$row->reid==0,则跳过,然后,找到的上级栏目不为0的id,放入$topidstr里面,实际上这个while遍历的是三级栏目及其以下的栏目。
然后,把$oper里面的值与查询出来的查询出来的栏目的上级栏目的id,一起放入到$admin_catalog里面,去掉最后的逗号,重复的id去掉。
然后设置sql语句:
$query = "SELECT id,typename,ispart FROM `dede_arctype` WHERE ispart<>2 AND id in({$admin_catalog}) AND reid=0 $ctsql";
若$oper不是数组或$cfg_admin_channel的值为all时,则直接查询所有栏目不是外部连接的栏目id,typenamet和ispart。
4.组装栏目列表,代码如下:
条件if($row->id!=$hid)指的是顶级栏目id不是参数$hid的值,也就是顶级栏目id不是指定默认显示的栏目id的值,当这个条件成立,且顶级栏目的属性为1,也就是栏目为最终列表时,即if($row->id==1),选择列表项添加一个栏目,
代码为:
$this->OptionArrayList .= "<option value='".$row->id."' style='background-color:#EFEFEF;color:#666666'>".$row->typename."</option>\r\n";
否则,不添加样式。
然后,调用获取子栏目列表函数:
$this->LogicGetOptionArray($row->id, "─", $oper);
把顶级栏目$row->id里面的子栏目查询出来。
最后,返回查询出来的栏目列表,这时的列表既包括顶级栏目也包括顶级栏目里面的子栏目,如果这个顶级栏目有子栏目的话。
这个函数跟获取顶级栏目列表函数GetCatalog()有类似的地方,有兴趣可以比较一下。