zabbix二次开发之引入Smarty模板

       最近一直在搞zabbix的开发,zabbix是自己搞了一套库去生成前端的代码,

后台代码和前端是混合在一起的,灰常操蛋。改起来异常费劲,得看懂每个

组件是怎么生成的,窝心,于是我开始倒腾smarty,将代码与模板进行分离,方便二次开发。

 

1.为啥是smarty:

 

    上手简单,功能强大,你值得拥有~

 

 

2.引入smarty模块的好处:

 

       最大的好处其实就是模板与php代码分离开了,前端的归前端,后台的归

后台,井水不犯河水。我不用在php中去echo “<br>“这种标签了,灰常操蛋有没有。

 

3.配置smarty:

 

  1.搭建:

              这部分没啥特别的,就是网上的教程,快速入门参见这篇博文(http://linux.chinaitlab.com/PHP/38324.html)。

 

       看下我相应的目录树吧:

       smarty_class 存放所有的库文件,对应的是smarty下载解压之后的libs文件夹。

       templates 用来存放模块,templates_c用来缓存模板。

 

   2.配置:

              主要就是配置了下main.php这个脚本,代码如下:

cat smarty_main.py
<?php
include "smarty_class/Smarty.class.php";
define('__SITE_ROOT', '/var/www/html/zabbix'); 
$tpl = new Smarty();
$tpl->template_dir = __SITE_ROOT . "/templates/";
$tpl->compile_dir = __SITE_ROOT . "/templates_c/";
$tpl->config_dir = __SITE_ROOT . "/configs/";
$tpl->cache_dir = __SITE_ROOT . "/cache/";
$tpl->left_delimiter = '<{';
$tpl->right_delimiter = '}>';
?>
 
        也很简单,就是配置了下smarty所在的目录以及模板的路径这些。
         
        

4.zabbix入口:

 
    zabbix每个页面的菜单都是由page_header这个文件去生成的,而且里面有对应的
权限控制,所以我们必须也把我们写的脚本加入到这个菜单里面去,不然是没办法在菜单
上看到的。
 
    具体的入口文件为:include/menu.inc.php,这个文件控制了所有的菜单
以及二级菜单的url和对应的权限控制。我们把自己的菜单加到这个ZBX_MENU数组中去:
               
                                        
                                                  image
             
      我这里是加到了admin一级菜单中去了,然后新建了一个二级菜单
user hosts。大致解释下每项的含义,url对应的是菜单对应的url地址,label
就是菜单对应的标签,也就是我们在界面上看到的名称。S_INSTALLATION其实
是针对多语言做的定义,可以按照用户的locale显示不同的值,新建的话
写在include/locales下面的多语言文件中去就可以了,如include/locales/cn_zh.inc.php
 
[root@vm-1 zabbix]# grep 'CMDB' -rn include/locales/*
include/locales/cn_zh.inc.php:1789:        'S_CMDB'  => '固资管理',
include/locales/cn_zh.inc.php726:1765:        'S_CMDB'  => '固资管理',
include/locales/en_gb.inc.php:2527:        'S_CMDB'  => 'CMDB',
include/locales/en_gb.inc.php726:2503:        'S_CMDB'  => 'CMDB',
 
   CMDB就是我自己定义的,想做的按照这个格式来写就可以了。其实应该
不用写726的这些文件的,具体也没仔细研究。
 

5.实践:

         
   ok,现在是万事俱备了,只差我们的代码没写了。user_hosts.php代码如下:
 
<?php

        require_once('include/user_hosts.inc.php');
        include_once('include/page_header.php');

        require "smarty_main.py";
        $tpl->assign("title","user special hosts admin");

        $self = $_SERVER['PHP_SELF'];
        $tpl->assign("script", $self);

        $tpl->display("user_hosts.html");

?>

<?php

        include_once('include/page_footer.php');
?>

 

    没有html标签,也没有乱七八糟的wdget,就是Php。self用来传递当前脚本
给前端的html表格,我是打算用来搞一个表格的自提交的。唯一需要注意的大概
就是require "smarty_main.py"; 的引用位置了,我刚开始最到了最前面,zabbix报了
一个错误,很莫名其妙,扔现在的位置就正常了。
 
    再看下对应的前端模板templates/user_hosts.html:
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
        <title><{$title}></title>
        <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
        <script>
        $(document).ready(function(){
          $("#hosts").click(function(){
            $("#hosts").text("");
          });
        });
        </script>
<style>
#hosts
{
margin-left:auto;
margin-right:auto;
width:20%;
}
</style>


</head>

<body>
<form name="input" action="<{$script}>" method="post">
<textarea rows="5" cols="10" id = "hosts" name="hosts_array">
请输入需要添加的IP列表,每行一个
</textarea>
<input type="hidden" name="action" value="submitted" />
<input type="submit" name="submit" value="submit me!" />
</form>

</body>
</html>
         

  随便写了一个表格,扔了一个文本框在里面。然后用了一个jquery的函数,在点击
文本框的时候清空里面的内容。ss的那个是为了调整下表格大小,直接删了也可以的,
我不会css,随便写的。
 

6.效果展示:

 
                                image
  

       

        很丑,不过算是实现我的主要目的,代码和模块分离嘛,我可以自由的写php后台代码,改动的时候也自由很多。

 

7.总结:

 

        个人感觉zabbix这种代码模板搞一块的做法很蛋疼,最近有朋友也在研究这个,说根本不知道

界面上每个组件、表格是怎么生成的,足见二次开发的不便。我也一直烦这种风格,开始也是

echo “<br>”的去嵌入html,再用来用heredoc去嵌入,但嵌入的总归是蛋疼,各种不便、不爽,

维护起来也麻烦。之前的一个同事也是直接嵌入html标签的方式去做的,看的我头疼,研究zabbix

自己的组件库也不是不行,但很麻烦。所以最后还是引入了smarty,一切都轻松了。

 

     当然了,你也不一定非要用smarty,甚至也不一定要用Php、模块,其实zabbix的菜单就是一个

入口,你可以自由的写你的php、py代码,然后加入到menu中去就可以了。最好的做法就是直接独立出来吧,

干嘛为要啥都放到zabbix现在的前端界面里面呢?独立搞个tornado啥的去搞也很爽的,zabbix只做一个

API的提供者和数据的提供者就好。

Leave a Reply

Your email address will not be published. Required fields are marked *


To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax