[zabbix 二次开发] 修改 zabbix map PHP 源码通过 update 更新到 MySQL 数据库
利用 jQuery 和 $.Ajax 函数, 通过异步请求, 将 update 内容传递到 sysmap.PHP 页面, 再将个窗体 data 文件存入到 MySQL 数据库中;
jQuery->Ajax->php_REQUEST->MySQL
在修改代码之前需要先添加一个数据表:1)MySQL>zabbix>sysmaps_elements(表)>filed_name(列表项);
#MySQL -uroot -p
#MySQL>use zabbix;
#MySQL>alter table sysmaps_elements add filed_name int(11) default '0';
相关命令:
(1)show tables;
(2)describe 表名;
(3) 查看表中数据 select roamsetting from sysmaps_elements;
(4) 更新某个表数据 update sysmaps_elements set roamsetting=2 where selementid=15;
(5) 修改表中字段; alter table sysmaps modify map_scale bigint(20) default '100';
2) 然后再修改对应的数据格式文件的内容; 定义 db 格式的文件在 include/schema.INI.PHP 文件;
selements_sysmaps: 中增加一个字段;
在 4061 行'x'字段下面;'filed_name'=>[
'null'=>false,
'type'=>DB::FIELD_TYPE_CHAR,
'length'=>10,
'default'=>'0',
],
3) 接下分析窗体文件, sysmap.PHP 文件 => 修改 map 地图相应的 PHP 文件;
在该文件中有个引入脚本文件的类;$page['scripts']=['class.svg.canvas.js','class.svg.map.js','class.cmap.js','class.cviewswitcher.js',
'multiselect.js','colorpicker.js'
]; 通过分析窗体文件在这个 class.cmap.JS 文件中; 该文件在 JS / 目录下
4)class.cmap.JS=> 所有和 map 地图要素相关的 jQuery 文件;
(1) 将需要添加的船体内容到 JS 文件中, 格式为;// 如下;
varAppfield_id='
Sined_name
Sined_name_1
Sined_name_2
NULL
(2)// 通过这个语句对应将 filed_name 的值放入 values 中; 意思是 filed_name='0' '1'或'2';jQuery 窗体文件交互都是采用这种格式;
3036 行;
data[values[i].name] = values[i].value.toString();
5) 将 Appfield_id div 内容添加到页面;
在 this.domNode = $(tpl.evaluate(formTplData)).appendTo(formContainer); 这行语句之后//filed_name parameter by suneiot
//console.log(this.formContainer); 这里 sel=="0" 是表示判断是否是 host 主机类型;
varsel="";
sel=$("#elementType").val();
if(sel=="0"){
$(formContainer).append(Appfiled_id);
$("#filed_name").insertAfter($('#hostGroupSelectRow'));
}else{$("#filed_name").remove();}
$("#elementType").change(function(){
if($("filed_name")!="")$("#filed_name").remove();
sel=$("#elementType").val();
if(sel=="0"){
$(formContainer).append(Appfiled_id);
$("#filed_name").insertAfter($('#hostGroupSelectRow'));
}else{$("#filed_name").remove();}
});
6) 将以下代码插入到 615 行之后, 进行点击之后进行判断/*
Selements events
*/
// Delegate selements icons clicks.
点击图形之后, 对添加 ap,sta,null 单选按钮进行判断是否已经出现;//***//
$(this.container).on('click','.sysmap_element, .sysmap_shape',function(event){
that.selectElements([{
id:$(this).attr('data-id'),
type:$(this).attr('data-type')
}],event.ctrlKey||event.metaKey);
//
if(($("#elementType").val())=="0"){
// 将以下内容添加到这个 forContainer 对象中.
$(this.formContainer).append(Appfiled_id);
$("#filed_name").insertAfter($('#hostGroupSelectRow'));
}else{
$("#filed_name").remove()
};
});
//********************************************************************************
5) 修改完信息后通过点击窗体 update 按钮, 回到 sysmap.PHP 文件中, 通过. Ajax 函数传递窗体内容具体代码如下:save:function(){
varurl=newCurl();
$.Ajax({
url:url.getPath()+'?output=ajax&sid='+url.getArgument('sid'),
type:'post',
data:{
favobj:'sysmap',
action:'update',
sysmapid:this.sysmapid,
sysmap:Object.toJSON(this.data)// TODO: remove prototype method
},
error:function(){
thrownewError('Cannot update map.');
}
});
},
传递的数据通过 JSON 格式放到网页缓存中, 等待 $REQUEST() 函数调用;
6)sysmap.PHP 调用 $REQUEST().Ajax 代码, 代码如下if(isset($_REQUEST['favobj'])){
$JSON=newCJson();
if(getRequest('favobj')==='sysmap'&&hasRequest('action')){
if(getRequest('action')==='update'){
$sysmapid=getRequest('sysmapid',0);
@ob_start();
try{
DBstart();
$sysmap=API::Map()->get([
'sysmapids'=>$sysmapid,
'editable'=>true,
'output'=>['sysmapid'],
]);
$sysmap=reset($sysmap);
if($sysmap===false){
thrownewException(_('Access denied!'));
}
$sysmapUpdate=$JSON->decode($_REQUEST['sysmap'],true);
$sysmapUpdate['sysmapid']=$sysmapid;
$sysmapUpdate['lines']=[];
if(array_key_exists('shapes',$sysmapUpdate)){
foreach($sysmapUpdate['shapes']as$key=>&$shape){
if(array_key_exists('sysmap_shapeid',$shape)&&!is_numeric($shape['sysmap_shapeid'])){
unset($shape['sysmap_shapeid']);
}
if($shape['type']==SYSMAP_SHAPE_TYPE_LINE){
$sysmapUpdate['lines'][$key]=CMapHelper::convertShapeToLine($shape);
unset($sysmapUpdate['shapes'][$key]);
}
}
unset($shape);
}
$result=API::Map()->update($sysmapUpdate);
if($result!==false){
echo'if (confirm('.CJs::encodeJson(_('Map is updated! Return to map list?')).')) { location.href ="sysmaps.php"; }';
}
else{
thrownewException(_('Map update failed.'));
}
DBend(true);
}
/// 该代码是核心, 调用系统 API::MAP()->update 方法 将 $sysmapUpdate 字段内容存入到 zabbix 数据库中;
$result=API::Map()->update($sysmapUpdate);
[zabbix 二次开发] 修改 zabbix map PHP 源码通过 update 更新到 MySQL 数据库
原文: https://blog.51cto.com/13300270/2622705
来源: http://www.bubuko.com/infodetail-3725895.html