1<?php
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22require_once dirname(__FILE__).'/include/config.inc.php';
23
24$page['title'] = _('Configuration of value mapping');
25$page['file'] = 'adm.valuemapping.php';
26
27require_once dirname(__FILE__).'/include/page_header.php';
28
29// VAR	TYPE	OPTIONAL	FLAGS	VALIDATION	EXCEPTION
30$fields = [
31	'valuemapids' =>	[T_ZBX_INT, O_OPT,	P_SYS,			DB_ID,		null],
32	'valuemapid' =>		[T_ZBX_INT, O_NO,	P_SYS,			DB_ID,		'isset({form}) && {form} == "update"'],
33	'name' =>			[T_ZBX_STR, O_OPT,	null,			NOT_EMPTY,	'isset({add}) || isset({update})'],
34	'mappings' =>		[T_ZBX_STR, O_OPT,	null,			null,		null],
35	// actions
36	'add' =>			[T_ZBX_STR, O_OPT,	P_SYS|P_ACT,	null,		null],
37	'update' =>			[T_ZBX_STR, O_OPT,	P_SYS|P_ACT,	null,		null],
38	'form' =>			[T_ZBX_STR, O_OPT,	P_SYS,			null,		null],
39	'form_refresh' =>	[T_ZBX_INT, O_OPT,	null,			null,		null],
40	'action' =>			[T_ZBX_STR, O_OPT,	P_SYS|P_ACT,	IN('"valuemap.export","valuemap.delete"'), null],
41	// sort and sortorder
42	'sort' =>			[T_ZBX_STR, O_OPT, P_SYS, IN('"name"'),									null],
43	'sortorder' =>		[T_ZBX_STR, O_OPT, P_SYS, IN('"'.ZBX_SORT_DOWN.'","'.ZBX_SORT_UP.'"'),	null]
44];
45check_fields($fields);
46
47/*
48 * Permissions
49 */
50if (hasRequest('valuemapid')) {
51	$valuemaps = API::ValueMap()->get([
52		'output' => [],
53		'valuemapids' => getRequest('valuemapid')
54	]);
55
56	if (!$valuemaps) {
57		access_deny();
58	}
59}
60
61/*
62 * Actions
63 */
64if (hasRequest('add') || hasRequest('update')) {
65	$valuemap = [
66		'name' => getRequest('name'),
67		'mappings' => getRequest('mappings')
68	];
69
70	if (hasRequest('update')) {
71		$valuemap['valuemapid'] = getRequest('valuemapid');
72
73		$result = (bool) API::ValueMap()->update($valuemap);
74
75		show_messages($result, _('Value map updated'), _('Cannot update value map'));
76	}
77	else {
78		$result = (bool) API::ValueMap()->create($valuemap);
79
80		show_messages($result, _('Value map added'), _('Cannot add value map'));
81	}
82
83	if ($result) {
84		unset($_REQUEST['form']);
85	}
86}
87elseif (getRequest('action') === 'valuemap.delete' && hasRequest('valuemapids')) {
88	$valuemapids = getRequest('valuemapids', []);
89
90	$result = (bool) API::ValueMap()->delete($valuemapids);
91
92	if ($result) {
93		unset($_REQUEST['form']);
94		uncheckTableRows();
95	}
96	else {
97		$valuemaps = API::ValueMap()->get([
98			'output' => ['valuemapid'],
99			'valuemapids' => getRequest('valuemapids')
100		]);
101		uncheckTableRows(null, zbx_objectValues($valuemaps, 'valuemapid'));
102	}
103
104	$deleted = count($valuemapids);
105
106	show_messages($result,
107		_n('Value map deleted', 'Value maps deleted', $deleted),
108		_n('Cannot delete value map', 'Cannot delete value maps', $deleted)
109	);
110}
111
112/*
113 * Display
114 */
115if (hasRequest('form')) {
116	$data = [
117		'form' => getRequest('form', ''),
118		'valuemapid' => getRequest('valuemapid', 0),
119		'valuemap_count' => 0,
120		'sid' => substr(CWebUser::getSessionCookie(), 16, 16)
121	];
122
123	if ($data['valuemapid'] != 0 && !hasRequest('form_refresh')) {
124		$valuemaps = API::ValueMap()->get([
125			'output' => ['valuemapid', 'name'],
126			'selectMappings' => ['value', 'newvalue'],
127			'valuemapids' => $data['valuemapid']
128		]);
129		$valuemap = reset($valuemaps);
130
131		$data = zbx_array_merge($data, $valuemap);
132		order_result($data['mappings'], 'value');
133	}
134	else {
135		$data['name'] = getRequest('name', '');
136		$data['mappings'] = array_values(getRequest('mappings', []));
137	}
138
139	if ($data['valuemapid'] != 0) {
140		$data['valuemap_count'] += API::Item()->get([
141			'countOutput' => true,
142			'webitems' => true,
143			'filter' => ['valuemapid' => $data['valuemapid']]
144		]);
145		$data['valuemap_count'] += API::ItemPrototype()->get([
146			'countOutput' => true,
147			'filter' => ['valuemapid' => $data['valuemapid']]
148		]);
149	}
150
151	if (!$data['mappings']) {
152		$data['mappings'][] = ['value' => '', 'newvalue' => ''];
153	}
154
155	$view = new CView('administration.general.valuemapping.edit', $data);
156}
157else {
158	$sortfield = getRequest('sort', CProfile::get('web.'.$page['file'].'.sort', 'name'));
159	$sortorder = getRequest('sortorder', CProfile::get('web.'.$page['file'].'.sortorder', ZBX_SORT_UP));
160
161	CProfile::update('web.'.$page['file'].'.sort', $sortfield, PROFILE_TYPE_STR);
162	CProfile::update('web.'.$page['file'].'.sortorder', $sortorder, PROFILE_TYPE_STR);
163
164	$data = [
165		'sort' => $sortfield,
166		'sortorder' => $sortorder
167	];
168
169	$data['valuemaps'] = API::ValueMap()->get([
170		'output' => ['valuemapid', 'name'],
171		'selectMappings' => ['value', 'newvalue'],
172		'sortfield' => $sortfield,
173		'limit' => $config['search_limit'] + 1
174	]);
175
176	order_result($data['valuemaps'], $sortfield, $sortorder);
177	$data['paging'] = getPagingLine($data['valuemaps'], $sortorder, new CUrl('adm.valuemapping.php'));
178
179	foreach ($data['valuemaps'] as &$valuemap) {
180		order_result($valuemap['mappings'], 'value');
181
182		$valuemap['used_in_items'] =
183			(bool) API::Item()->get([
184				'output' => [],
185				'webitems' => true,
186				'filter' => ['valuemapid' => $valuemap['valuemapid']],
187				'limit' => 1
188			])
189			|| (bool) API::ItemPrototype()->get([
190				'output' => [],
191				'filter' => ['valuemapid' => $valuemap['valuemapid']],
192				'limit' => 1
193			]);
194	}
195	unset($valuemap);
196
197	$view = new CView('administration.general.valuemapping.list', $data);
198}
199
200$view->render();
201$view->show();
202
203require_once dirname(__FILE__).'/include/page_footer.php';
204