想模仿hostgroups.php仿写一个主机组页面。直接从页面展示开始分析。

if (isset($_REQUEST['form'])) {
//这里面是点击创建主机组的页面展示
}else{
//从这里开始分析
}
    $sortfield = getPageSortField('name');    //获取排序的字段依据
$sortorder = getPageSortOrder(); //升序降序
    $data = array(
'config' => $config, //获取配置
'displayNodes' => is_array(get_current_nodeid()) //获取展示的节点,字面意义,具体是啥不知道,暂时不深究
);

接下来是目前最让我头疼的zabbix自带的对sql语句的构造方法,里面各种字段,复杂的很。

    $groups = API::HostGroup()->get(array(
'editable' => true, //将权限设置为PERM_READ_WRITE,否则为PERM_READ
'output' => array('groupid'), //在select 后面增加字段'groupid',注释掉这句,发现获得的数据是一样的,应该默认是有groupid字段的。applyQueryOutputOptions()
'sortfield' => $sortfield, //在order by 后面增加字段$sortfield,此处为'name',会自动加表的别名,g.name。applyQuerySortOptions()->applyQuerySortField()
'limit' => $config['search_limit'] + 1 //默认是1000,不知道+1是为什么,然后在zabbix生产sql的方法createSelectQueryFromParts()发现并没有对'limit'做任何操作,感觉这里写不写无所谓
));

反正上面构造出来的sql 语句是'SELECT g.groupid FROM groups g ORDER BY g.name'。继续往下看:

$data['paging'] = getPagingLine($groups, array('groupid'));

这个是分页的,进去随便看了一下,每页显示多少数据来源于user表的rows_per_page字段。

    // get hosts and templates count
$data['groupCounts'] = API::HostGroup()->get(array(
'groupids' => zbx_objectValues($groups, 'groupid'), //在sql语句where后面添加(g.groupid BETWEEN '4' AND '17' OR g.groupid IN ('1','2')
'selectHosts' => API_OUTPUT_COUNT, //API::HostGroup()->get()->addRelatedObjects()->API::Host()->get()SELECT DISTINCT COUNT(DISTINCT h.hostid) AS rowscount,hg.groupid FROM hosts h,hosts_groups hg WHERE h.flags IN (0,4) AND (hg.groupid BETWEEN '4' AND '17' OR hg.groupid IN ('1','2')) AND hg.hostid=h.hostid AND h.status IN (0,1) GROUP BY hg.groupid
'selectTemplates' => API_OUTPUT_COUNT, //API::HostGroup()->get()->addRelatedObjects()->API::Host()->get()
'nopermissions' => true //
));
$data['groupCounts'] = zbx_toHash($data['groupCounts'], 'groupid');

这是对取得的结果进行重新排序。以结果中的groupid作为新数组的下标。

	$data['groups'] = API::HostGroup()->get(array(
'groupids' => zbx_objectValues($groups, 'groupid'),
'selectHosts' => array('hostid', 'name', 'status'),
'selectTemplates' => array('hostid', 'name', 'status'),
'selectGroupDiscovery' => array('ts_delete'),
'selectDiscoveryRule' => array('itemid', 'name'),
'output' => API_OUTPUT_EXTEND,
'limitSelects' => $config['max_in_table'] + 1
));

获取详细信息。

order_result($data['groups'], $sortfield, $sortorder);

按$sortfield,进行$sortorder排序。

zabbix2.2.2-hostgroups.php代码分析(1)的更多相关文章

  1. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  2. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  3. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

  4. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)

    Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...

  5. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  6. STM32启动代码分析 IAR 比较好

    stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

  7. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  8. SonarQube-5.6.3 代码分析平台搭建使用

    python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...

  9. angular代码分析之异常日志设计

    angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...

  10. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2)

    在 DependencyInjection项目代码分析4-微软的实现(1)中介绍了“ServiceTable”.“ServiceEntry”.“IGenericService”.“IService”. ...

随机推荐

  1. App开发中甲乙方冲突会闹出啥后果?H5 APP 开发可以改变现状吗

    随着各种应用的全面App化,因App而起的合作纠纷也日益增多,其中不乏最终对簿公堂的情形.WeX5(html5开发工具)为您汇总了三个典型的真实案例,方便您体会甲乙方冲突情景. 在围观别人争吵之余,您 ...

  2. 企业生产环境下不同业务的linux分区建议

    常规分区方案: /boot:  100M swap:内存的1至1.5倍 / : 剩余硬盘大小 DB及存储:有大量重要的数据 /boot : 100M swap: 内存的1至1.5倍,如果内存大于等于1 ...

  3. 关于Ibatis.net ,将List<T> 作为参数的学习笔记

    前言 最近做一个小项目,用到IBatis.net ,因为是现学现做,所以多少有点吃力,之前遇到一个问题,就是将List<T>作为parameterClass, 网上各种找,无奈.net方面 ...

  4. Win10 IIS以及ASP.NET 4.0配置问题日志

    问题日志 升级到Win10并安装了VS2015后,原有ASP.NET 4.0项目在本机的IIS部署出现问题. 安装IIS: 在[控制面板.程序.启用或关闭Windows功能.Internet Info ...

  5. Windows脚本

    最近项目测试比较麻烦,要启动好几个command窗口,手敲之类的有些繁琐,于是研究了一下windows脚本,实现以下功能: 懒人吗,参数意义顺序比较懒得记,所以需要友好参数提示: 根据参数数量决定启动 ...

  6. C#.net调用axis2webService

    用C#.net调用axis2webService的时候需要引用web服务, 比如访问地址为:http://111.21.32.213:8080/axis2/services/AdService/get ...

  7. RWD

    http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries http://www.webdesigns ...

  8. urllib2.urlopen超时问题

    urllib2.urlopen超时问题 没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给ur ...

  9. python re.sub

    python re.sub   python re.sub属于python正则的标准库,主要是的功能是用正则匹配要替换的字符串然后把它替换成自己想要的字符串的方法下面给个例子:import relin ...

  10. php foreach的使用注意

    众所周知,foreach用于对数组的遍历,但是,在foreach($arr as $value)中,$value只是原值的一个副本,因此如果在foreach里进行该数值的修改,是不会影响到源数组的. ...