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
22/**
23 * @var CView $this
24 */
25
26$widget = (new CWidget())->setTitle(_('Item prototypes'));
27
28if (!empty($data['hostid'])) {
29	$widget->addItem(get_header_host_table('items', $data['hostid'], $data['parent_discoveryid']));
30}
31
32$form = (new CForm())
33	->setName('itemForm')
34	->setAttribute('aria-labeledby', ZBX_STYLE_PAGE_TITLE)
35	->addVar('form', $data['form'])
36	->addVar('parent_discoveryid', $data['parent_discoveryid']);
37
38if (!empty($data['itemid'])) {
39	$form->addVar('itemid', $data['itemid']);
40}
41
42$form_list = new CFormList('itemFormList');
43if (!empty($data['templates'])) {
44	$form_list->addRow(_('Parent items'), $data['templates']);
45}
46
47$readonly = false;
48if ($data['limited']) {
49	$readonly = true;
50}
51
52$form_list->addRow(
53	(new CLabel(_('Name'), 'name'))->setAsteriskMark(),
54	(new CTextBox('name', $data['name'], $readonly))
55		->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
56		->setAriaRequired()
57		->setAttribute('autofocus', 'autofocus')
58);
59
60// Append type to form list.
61$form_list->addRow(new CLabel(_('Type'), 'label-type'),
62	(new CSelect('type'))
63		->setFocusableElementId('label-type')
64		->setId('type')
65		->setValue($data['type'])
66		->addOptions(CSelect::createOptionsFromArray($data['types']))
67		->setReadonly($readonly)
68);
69
70// Append key to form list.
71$key_controls = [
72	(new CTextBox('key', $data['key'], $readonly, DB::getFieldLength('item_discovery', 'key_')))
73		->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
74		->setAriaRequired()
75];
76if (!$readonly) {
77	$key_controls[] = (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN);
78	$key_controls[] = (new CButton('keyButton', _('Select')))
79		->addClass(ZBX_STYLE_BTN_GREY)
80		->onClick('return PopUp("popup.generic",jQuery.extend('.
81			json_encode([
82				'srctbl' => 'help_items',
83				'srcfld1' => 'key',
84				'dstfrm' => $form->getName(),
85				'dstfld1' => 'key'
86			]).
87				',{itemtype: jQuery("#type").val()}), null, this);'
88		);
89
90}
91
92$form_list
93	->addRow((new CLabel(_('Key'), 'key'))->setAsteriskMark(), $key_controls)
94	// Append ITEM_TYPE_HTTPAGENT URL field to form list.
95	->addRow(
96		(new CLabel(_('URL'), 'url'))->setAsteriskMark(),
97		[
98			(new CTextBox('url', $data['url'], $readonly, DB::getFieldLength('items', 'url')))
99				->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
100				->setAriaRequired(),
101			(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
102			(new CButton('httpcheck_parseurl', _('Parse')))
103				->setEnabled(!$readonly)
104				->addClass(ZBX_STYLE_BTN_GREY)
105				->setAttribute('data-action', 'parse_url')
106		],
107		'url_row'
108	);
109
110// Append ITEM_TYPE_HTTPAGENT Query fields to form list.
111$query_fields_data = [];
112
113if (is_array($data['query_fields']) && $data['query_fields']) {
114	foreach ($data['query_fields'] as $pair) {
115		$query_fields_data[] = ['name' => key($pair), 'value' => reset($pair)];
116	}
117}
118elseif (!$readonly) {
119	$query_fields_data[] = ['name' => '', 'value' => ''];
120}
121$query_fields = (new CTag('script', true))->setAttribute('type', 'text/json');
122$query_fields->items = [json_encode($query_fields_data)];
123
124$form_list
125	->addRow(
126		new CLabel(_('Query fields'), 'query_fields_pairs'),
127		(new CDiv([
128			(new CTable())
129				->setAttribute('style', 'width: 100%;')
130				->setHeader(['', _('Name'), '', _('Value'), ''])
131				->addRow((new CRow)->setAttribute('data-insert-point', 'append'))
132				->setFooter(new CRow(
133					(new CCol(
134						(new CButton(null, _('Add')))
135							->setEnabled(!$readonly)
136							->addClass(ZBX_STYLE_BTN_LINK)
137							->setAttribute('data-row-action', 'add_row')
138					))->setColSpan(5)
139				)),
140			(new CTag('script', true))
141				->setAttribute('type', 'text/x-jquery-tmpl')
142				->addItem(new CRow([
143					(new CCol((new CDiv)->addClass(ZBX_STYLE_DRAG_ICON)))->addClass(ZBX_STYLE_TD_DRAG_ICON),
144					(new CTextBox('query_fields[name][#{index}]', '#{name}', $readonly))
145						->setAttribute('placeholder', _('name'))
146						->setWidth(ZBX_TEXTAREA_HTTP_PAIR_NAME_WIDTH),
147					'&rArr;',
148					(new CTextBox('query_fields[value][#{index}]', '#{value}', $readonly))
149						->setAttribute('placeholder', _('value'))
150						->setWidth(ZBX_TEXTAREA_HTTP_PAIR_VALUE_WIDTH),
151					(new CButton(null, _('Remove')))
152						->setEnabled(!$readonly)
153						->addClass(ZBX_STYLE_BTN_LINK)
154						->setAttribute('data-row-action', 'remove_row')
155				])),
156			$query_fields
157		]))
158			->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
159			->setId('query_fields_pairs')
160			->setAttribute('data-sortable-pairs-table', $readonly ? '0': '1')
161			->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH . 'px;'),
162		'query_fields_row'
163	)
164	// Append ITEM_TYPE_HTTPAGENT Request type to form list.
165	->addRow(
166		new CLabel(_('Request type'), 'label-request-method'),
167		(new CSelect('request_method'))
168			->setFocusableElementId('label-request-method')
169			->setId('request_method')
170			->setValue($data['request_method'])
171			->setReadonly($readonly)
172			->addOptions(CSelect::createOptionsFromArray([
173				HTTPCHECK_REQUEST_GET => 'GET',
174				HTTPCHECK_REQUEST_POST => 'POST',
175				HTTPCHECK_REQUEST_PUT => 'PUT',
176				HTTPCHECK_REQUEST_HEAD => 'HEAD'
177			])),
178		'request_method_row'
179	)
180	// Append ITEM_TYPE_HTTPAGENT Timeout field to form list.
181	->addRow(
182		(new CLabel(_('Timeout'), 'timeout'))->setAsteriskMark(),
183		(new CTextBox('timeout', $data['timeout'], $readonly))
184			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
185			->setAriaRequired(),
186		'timeout_row'
187	)
188	// Append ITEM_TYPE_HTTPAGENT Request body type to form list.
189	->addRow(
190		new CLabel(_('Request body type'), 'post_type'),
191		(new CRadioButtonList('post_type', (int) $data['post_type']))
192			->addValue(_('Raw data'), ZBX_POSTTYPE_RAW)
193			->addValue(_('JSON data'), ZBX_POSTTYPE_JSON)
194			->addValue(_('XML data'), ZBX_POSTTYPE_XML)
195			->setEnabled(!$readonly)
196			->setModern(true),
197		'post_type_row'
198	)
199	// Append ITEM_TYPE_HTTPAGENT Request body to form list.
200	->addRow(
201		new CLabel(_('Request body'), 'posts'),
202		(new CTextArea('posts', $data['posts'], compact('readonly')))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
203		'posts_row'
204	);
205
206// Append ITEM_TYPE_HTTPAGENT Headers fields to form list.
207$headers_data = [];
208
209if (is_array($data['headers']) && $data['headers']) {
210	foreach ($data['headers'] as $pair) {
211		$headers_data[] = ['name' => key($pair), 'value' => reset($pair)];
212	}
213}
214elseif (!$readonly) {
215	$headers_data[] = ['name' => '', 'value' => ''];
216}
217$headers = (new CTag('script', true))->setAttribute('type', 'text/json');
218$headers->items = [json_encode($headers_data)];
219
220$form_list
221	->addRow(
222		new CLabel(_('Headers'), 'headers_pairs'),
223		(new CDiv([
224			(new CTable())
225				->setAttribute('style', 'width: 100%;')
226				->setHeader(['', _('Name'), '', _('Value'), ''])
227				->addRow((new CRow)->setAttribute('data-insert-point', 'append'))
228				->setFooter(new CRow(
229					(new CCol(
230						(new CButton(null, _('Add')))
231							->addClass(ZBX_STYLE_BTN_LINK)
232							->setEnabled(!$readonly)
233							->setAttribute('data-row-action', 'add_row')
234					))->setColSpan(5)
235				)),
236			(new CTag('script', true))
237				->setAttribute('type', 'text/x-jquery-tmpl')
238				->addItem(new CRow([
239					(new CCol((new CDiv)->addClass(ZBX_STYLE_DRAG_ICON)))->addClass(ZBX_STYLE_TD_DRAG_ICON),
240					(new CTextBox('headers[name][#{index}]', '#{name}', $readonly))
241						->setAttribute('placeholder', _('name'))
242						->setWidth(ZBX_TEXTAREA_HTTP_PAIR_NAME_WIDTH),
243					'&rArr;',
244					(new CTextBox('headers[value][#{index}]', '#{value}', $readonly, 2000))
245						->setAttribute('placeholder', _('value'))
246						->setWidth(ZBX_TEXTAREA_HTTP_PAIR_VALUE_WIDTH),
247					(new CButton(null, _('Remove')))
248						->addClass(ZBX_STYLE_BTN_LINK)
249						->setEnabled(!$readonly)
250						->setAttribute('data-row-action', 'remove_row')
251				])),
252			$headers
253		]))
254			->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
255			->setId('headers_pairs')
256			->setAttribute('data-sortable-pairs-table', $readonly ? '0': '1')
257			->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH . 'px;'),
258		'headers_row'
259	)
260	// Append ITEM_TYPE_HTTPAGENT Required status codes to form list.
261	->addRow(
262		new CLabel(_('Required status codes'), 'status_codes'),
263		(new CTextBox('status_codes', $data['status_codes'], $readonly))
264			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
265		'status_codes_row'
266	)
267	// Append ITEM_TYPE_HTTPAGENT Follow redirects to form list.
268	->addRow(
269		new CLabel(_('Follow redirects'), 'follow_redirects'),
270		(new CCheckBox('follow_redirects', HTTPTEST_STEP_FOLLOW_REDIRECTS_ON))
271			->setEnabled(!$readonly)
272			->setChecked($data['follow_redirects'] == HTTPTEST_STEP_FOLLOW_REDIRECTS_ON),
273		'follow_redirects_row'
274	)
275	// Append ITEM_TYPE_HTTPAGENT Retrieve mode to form list.
276	->addRow(
277		new CLabel(_('Retrieve mode'), 'retrieve_mode'),
278		(new CRadioButtonList('retrieve_mode', (int) $data['retrieve_mode']))
279			->addValue(_('Body'), HTTPTEST_STEP_RETRIEVE_MODE_CONTENT)
280			->addValue(_('Headers'), HTTPTEST_STEP_RETRIEVE_MODE_HEADERS)
281			->addValue(_('Body and headers'), HTTPTEST_STEP_RETRIEVE_MODE_BOTH)
282			->setEnabled(!($readonly || $data['request_method'] == HTTPCHECK_REQUEST_HEAD))
283			->setModern(true),
284		'retrieve_mode_row'
285	)
286	// Append ITEM_TYPE_HTTPAGENT Convert to JSON to form list.
287	->addRow(
288		new CLabel(_('Convert to JSON'), 'output_format'),
289		(new CCheckBox('output_format', HTTPCHECK_STORE_JSON))
290			->setEnabled(!$readonly)
291			->setChecked($data['output_format'] == HTTPCHECK_STORE_JSON),
292		'output_format_row'
293	)
294	// Append ITEM_TYPE_HTTPAGENT HTTP proxy to form list.
295	->addRow(
296		new CLabel(_('HTTP proxy'), 'http_proxy'),
297		(new CTextBox('http_proxy', $data['http_proxy'], $readonly, DB::getFieldLength('items', 'http_proxy')))
298			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
299			->setAttribute('placeholder', '[protocol://][user[:password]@]proxy.example.com[:port]')
300			->disableAutocomplete(),
301		'http_proxy_row'
302	)
303	// Append ITEM_TYPE_HTTPAGENT HTTP authentication to form list.
304	->addRow(
305		new CLabel(_('HTTP authentication'), 'label-http-authtype'),
306		(new CSelect('http_authtype'))
307			->setFocusableElementId('label-http-authtype')
308			->setId('http_authtype')
309			->setValue($data['http_authtype'])
310			->setReadonly($readonly)
311			->addOptions(CSelect::createOptionsFromArray([
312				HTTPTEST_AUTH_NONE => _('None'),
313				HTTPTEST_AUTH_BASIC => _('Basic'),
314				HTTPTEST_AUTH_NTLM => _('NTLM'),
315				HTTPTEST_AUTH_KERBEROS => _('Kerberos')
316			])),
317		'http_authtype_row'
318	)
319	// Append ITEM_TYPE_HTTPAGENT User name to form list.
320	->addRow(
321		new CLabel(_('User name'), 'http_username'),
322		(new CTextBox('http_username', $data['http_username'], $readonly, DB::getFieldLength('items', 'username')))
323			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
324			->disableAutocomplete(),
325		'http_username_row'
326	)
327	// Append ITEM_TYPE_HTTPAGENT Password to form list.
328	->addRow(
329		new CLabel(_('Password'), 'http_password'),
330		(new CTextBox('http_password', $data['http_password'], $readonly, DB::getFieldLength('items', 'password')))
331			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
332			->disableAutocomplete(),
333		'http_password_row'
334	)
335	// Append ITEM_TYPE_HTTPAGENT SSL verify peer to form list.
336	->addRow(
337		new CLabel(_('SSL verify peer'), 'verify_peer'),
338		(new CCheckBox('verify_peer', HTTPTEST_VERIFY_PEER_ON))
339			->setEnabled(!$readonly)
340			->setChecked($data['verify_peer'] == HTTPTEST_VERIFY_PEER_ON),
341		'verify_peer_row'
342	)
343	// Append ITEM_TYPE_HTTPAGENT SSL verify host to form list.
344	->addRow(
345		new CLabel(_('SSL verify host'), 'verify_host'),
346		(new CCheckBox('verify_host', HTTPTEST_VERIFY_HOST_ON))
347			->setEnabled(!$readonly)
348			->setChecked($data['verify_host'] == HTTPTEST_VERIFY_HOST_ON),
349		'verify_host_row'
350	)
351	// Append ITEM_TYPE_HTTPAGENT SSL certificate file to form list.
352	->addRow(
353		new CLabel(_('SSL certificate file'), 'ssl_cert_file'),
354		(new CTextBox('ssl_cert_file', $data['ssl_cert_file'], $readonly, DB::getFieldLength('items', 'ssl_cert_file')))
355			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
356		'ssl_cert_file_row'
357	)
358	// Append ITEM_TYPE_HTTPAGENT SSL key file to form list.
359	->addRow(
360		new CLabel(_('SSL key file'), 'ssl_key_file'),
361		(new CTextBox('ssl_key_file', $data['ssl_key_file'], $readonly, DB::getFieldLength('items', 'ssl_key_file')))
362			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
363		'ssl_key_file_row'
364	)
365	// Append ITEM_TYPE_HTTPAGENT SSL key password to form list.
366	->addRow(
367		new CLabel(_('SSL key password'), 'ssl_key_password'),
368		(new CTextBox('ssl_key_password', $data['ssl_key_password'], $readonly,
369			DB::getFieldLength('items', 'ssl_key_password')
370		))
371			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
372			->disableAutocomplete(),
373		'ssl_key_password_row'
374	);
375
376$master_itemname = ($data['master_itemid'] != 0) ? $data['hostname'].NAME_DELIMITER.$data['master_itemname'] : '';
377
378// Append master item select.
379$master_item = [
380	(new CTextBox('master_itemname', $master_itemname, true))
381		->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
382		->setAriaRequired(),
383	(new CVar('master_itemid', $data['master_itemid'], 'master_itemid'))
384];
385
386if (!$readonly) {
387	$master_item[] = (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN);
388	$master_item[] = (new CButton('button', _('Select')))
389		->addClass(ZBX_STYLE_BTN_GREY)
390		->removeId()
391		->onClick('return PopUp("popup.generic",'.
392			json_encode([
393				'srctbl' => 'items',
394				'srcfld1' => 'itemid',
395				'srcfld2' => 'name',
396				'dstfrm' => $form->getName(),
397				'dstfld1' => 'master_itemid',
398				'dstfld2' => 'master_itemname',
399				'only_hostid' => $data['hostid'],
400				'excludeids' => [$data['itemid']],
401				'with_webitems' => 1,
402				'normal_only' => 1
403			]).', null, this);'
404		);
405	$master_item[] = (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN);
406	$master_item[] = (new CButton('button', _('Select prototype')))
407		->addClass(ZBX_STYLE_BTN_GREY)
408		->removeId()
409		->onClick('return PopUp("popup.generic",'.
410			json_encode([
411				'srctbl' => 'item_prototypes',
412				'srcfld1' => 'itemid',
413				'srcfld2' => 'name',
414				'dstfrm' => $form->getName(),
415				'dstfld1' => 'master_itemid',
416				'dstfld2' => 'master_itemname',
417				'parent_discoveryid' => $data['parent_discoveryid'],
418				'excludeids' => [$data['itemid']]
419			]).', null, this);'
420		);
421}
422
423$form_list->addRow(
424	(new CLabel(_('Master item'), 'master_itemname'))->setAsteriskMark(),
425	$master_item,
426	'row_master_item'
427);
428
429// append interfaces to form list
430if (!empty($data['interfaces'])) {
431	$select_interface = getInterfaceSelect($data['interfaces'])
432		->setId('interface-select')
433		->setValue($data['interfaceid'])
434		->addClass(ZBX_STYLE_ZSELECT_HOST_INTERFACE)
435		->setFocusableElementId('interfaceid')
436		->setAriaRequired();
437
438	$form_list->addRow(
439		(new CLabel(_('Host interface'), $select_interface->getFocusableElementId()))->setAsteriskMark(),
440		[
441			$select_interface,
442			(new CSpan(_('No interface found')))
443				->addClass(ZBX_STYLE_RED)
444				->setId('interface_not_defined')
445				->setAttribute('style', 'display: none;')
446		], 'interface_row');
447	$form->addVar('selectedInterfaceId', $data['interfaceid']);
448}
449
450$form_list
451	->addRow(
452		(new CLabel(_('SNMP OID'), 'snmp_oid'))->setAsteriskMark(),
453		(new CTextBox('snmp_oid', $data['snmp_oid'], $readonly, 512))
454			->setAttribute('placeholder', '[IF-MIB::]ifInOctets.1')
455			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
456			->setAriaRequired(),
457		'row_snmp_oid'
458	)
459	->addRow(_('IPMI sensor'),
460		(new CTextBox('ipmi_sensor', $data['ipmi_sensor'], $readonly, 128))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
461		'row_ipmi_sensor'
462	)
463	// Append authentication method to form list.
464	->addRow(new CLabel(_('Authentication method'), 'label-authtype'),
465		(new CSelect('authtype'))
466			->setFocusableElementId('label-authtype')
467			->setId('authtype')
468			->setValue($data['authtype'])
469			->addOptions(CSelect::createOptionsFromArray([
470				ITEM_AUTHTYPE_PASSWORD => _('Password'),
471				ITEM_AUTHTYPE_PUBLICKEY => _('Public key')
472			])),
473		'row_authtype'
474	)
475	->addRow((new CLabel(_('JMX endpoint'), 'jmx_endpoint'))->setAsteriskMark(),
476		(new CTextBox('jmx_endpoint', $data['jmx_endpoint'], false, 255))
477			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
478			->setAriaRequired(),
479		'row_jmx_endpoint'
480	)
481	->addRow(_('User name'),
482		(new CTextBox('username', $data['username'], false, 64))
483			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
484			->disableAutocomplete(),
485		'row_username'
486	)
487	->addRow(
488		(new CLabel(_('Public key file'), 'publickey'))->setAsteriskMark(),
489		(new CTextBox('publickey', $data['publickey'], false, 64))
490			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
491			->setAriaRequired(),
492		'row_publickey'
493	)
494	->addRow(
495		(new CLabel(_('Private key file'), 'privatekey'))->setAsteriskMark(),
496		(new CTextBox('privatekey', $data['privatekey'], false, 64))
497			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
498			->setAriaRequired(),
499		'row_privatekey'
500	)
501	->addRow(_('Password'),
502		(new CTextBox('password', $data['password'], false, 64))
503			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
504			->disableAutocomplete(),
505		'row_password'
506	)
507	->addRow(
508		(new CLabel(_('Executed script'), 'params_es'))->setAsteriskMark(),
509		(new CTextArea('params_es', $data['params']))
510			->addClass(ZBX_STYLE_MONOSPACE_FONT)
511			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
512			->setAriaRequired(),
513		'label_executed_script'
514	)
515	->addRow(
516		(new CLabel(_('SQL query'), 'params_ap'))->setAsteriskMark(),
517		(new CTextArea('params_ap', $data['params']))
518			->addClass(ZBX_STYLE_MONOSPACE_FONT)
519			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
520			->setAriaRequired(),
521		'label_params'
522	)
523	->addRow(
524		(new CLabel(_('Formula'), 'params_f'))->setAsteriskMark(),
525		(new CTextArea('params_f', $data['params']))
526			->addClass(ZBX_STYLE_MONOSPACE_FONT)
527			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
528			->setAriaRequired(),
529		'label_formula'
530	);
531
532// Append value type to form list.
533$form_list->addRow((new CLabel(_('Type of information'), 'label-value-type')),
534(new CSelect('value_type'))
535	->setId('value_type')
536	->setFocusableElementId('label-value-type')
537	->setValue($data['value_type'])
538	->addOptions(CSelect::createOptionsFromArray([
539		ITEM_VALUE_TYPE_UINT64 => _('Numeric (unsigned)'),
540		ITEM_VALUE_TYPE_FLOAT => _('Numeric (float)'),
541		ITEM_VALUE_TYPE_STR => _('Character'),
542		ITEM_VALUE_TYPE_LOG => _('Log'),
543		ITEM_VALUE_TYPE_TEXT => _('Text')
544	]))
545	->setReadonly($readonly)
546);
547
548$form_list
549	->addRow(_('Units'),
550		(new CTextBox('units', $data['units'], $readonly))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
551		'row_units'
552	)
553	->addRow((new CLabel(_('Update interval'), 'delay'))->setAsteriskMark(),
554		(new CTextBox('delay', $data['delay']))
555			->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
556			->setAriaRequired(),
557		'row_delay'
558	);
559
560// Append delay_flex to form list.
561$delayFlexTable = (new CTable())
562	->setId('delayFlexTable')
563	->setHeader([_('Type'), _('Interval'), _('Period'), _('Action')])
564	->setAttribute('style', 'width: 100%;');
565
566foreach ($data['delay_flex'] as $i => $delay_flex) {
567	$type_input = (new CRadioButtonList('delay_flex['.$i.'][type]', (int) $delay_flex['type']))
568		->addValue(_('Flexible'), ITEM_DELAY_FLEXIBLE)
569		->addValue(_('Scheduling'), ITEM_DELAY_SCHEDULING)
570		->setModern(true);
571
572	if ($delay_flex['type'] == ITEM_DELAY_FLEXIBLE) {
573		$delay_input = (new CTextBox('delay_flex['.$i.'][delay]', $delay_flex['delay']))
574			->setAttribute('placeholder', ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT);
575		$period_input = (new CTextBox('delay_flex['.$i.'][period]', $delay_flex['period']))
576			->setAttribute('placeholder', ZBX_DEFAULT_INTERVAL);
577		$schedule_input = (new CTextBox('delay_flex['.$i.'][schedule]'))
578			->setAttribute('placeholder', ZBX_ITEM_SCHEDULING_DEFAULT)
579			->setAttribute('style', 'display: none;');
580	}
581	else {
582		$delay_input = (new CTextBox('delay_flex['.$i.'][delay]'))
583			->setAttribute('placeholder', ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT)
584			->setAttribute('style', 'display: none;');
585		$period_input = (new CTextBox('delay_flex['.$i.'][period]'))
586			->setAttribute('placeholder', ZBX_DEFAULT_INTERVAL)
587			->setAttribute('style', 'display: none;');
588		$schedule_input = (new CTextBox('delay_flex['.$i.'][schedule]', $delay_flex['schedule']))
589			->setAttribute('placeholder', ZBX_ITEM_SCHEDULING_DEFAULT);
590	}
591
592	$button = (new CButton('delay_flex['.$i.'][remove]', _('Remove')))
593		->addClass(ZBX_STYLE_BTN_LINK)
594		->addClass('element-table-remove');
595
596	$delayFlexTable->addRow([$type_input, [$delay_input, $schedule_input], $period_input, $button], 'form_row');
597}
598
599$delayFlexTable->addRow([(new CButton('interval_add', _('Add')))
600	->addClass(ZBX_STYLE_BTN_LINK)
601	->addClass('element-table-add')]);
602
603$form_list
604	->addRow(_('Custom intervals'),
605		(new CDiv($delayFlexTable))
606			->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
607			->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'),
608		'row_flex_intervals'
609	)
610	->addRow((new CLabel(_('History storage period'), 'history'))->setAsteriskMark(),
611		(new CDiv([
612			(new CRadioButtonList('history_mode', (int) $data['history_mode']))
613				->addValue(_('Do not keep history'), ITEM_STORAGE_OFF)
614				->addValue(_('Storage period'), ITEM_STORAGE_CUSTOM)
615				->setModern(true),
616			(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
617			(new CTextBox('history', $data['history']))
618				->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
619				->setAriaRequired()
620		]))->addClass('wrap-multiple-controls')
621	)
622	->addRow((new CLabel(_('Trend storage period'), 'trends'))->setAsteriskMark(),
623		(new CDiv([
624			(new CRadioButtonList('trends_mode', (int) $data['trends_mode']))
625				->addValue(_('Do not keep trends'), ITEM_STORAGE_OFF)
626				->addValue(_('Storage period'), ITEM_STORAGE_CUSTOM)
627				->setModern(true),
628			(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
629			(new CTextBox('trends', $data['trends']))
630				->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
631				->setAriaRequired()
632		]))->addClass('wrap-multiple-controls'),
633		'row_trends'
634	)
635	->addRow(_('Log time format'),
636		(new CTextBox('logtimefmt', $data['logtimefmt'], $readonly, 64))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
637		'row_logtimefmt'
638	);
639
640// Append valuemap to form list.
641if ($readonly) {
642	if ($data['valuemaps']) {
643		$valuemaps = [['valuemapid' => $data['valuemapid'], 'name' => $data['valuemaps']]];
644	}
645	else {
646		$valuemaps = [['valuemapid' => $data['valuemapid'], 'name' => _('As is')]];
647	}
648}
649else {
650	$valuemaps = $data['valuemaps'];
651	array_unshift($valuemaps, ['valuemapid' => 0, 'name' => _('As is')]);
652}
653
654$valuemap_select = (new CSelect('valuemapid'))
655	->setId('valuemapid')
656	->setValue($data['valuemapid'])
657	->setFocusableElementId('label-valuemap')
658	->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
659	->setReadonly($readonly);
660
661foreach ($valuemaps as $valuemap) {
662	$valuemap_select->addOption(new CSelectOption($valuemap['valuemapid'], $valuemap['name']));
663}
664
665$form_list
666	->addRow(new CLabel(_('Show value'), 'label-valuemap'), [$valuemap_select, SPACE,
667		(new CLink(_('show value mappings'), (new CUrl('zabbix.php'))
668			->setArgument('action', 'valuemap.list')
669			->getUrl()
670		))->setTarget('_blank')], 'row_valuemap'
671	)
672	->addRow(
673		new CLabel(_('Enable trapping'), 'allow_traps'),
674		(new CCheckBox('allow_traps', HTTPCHECK_ALLOW_TRAPS_ON))
675			->setChecked($data['allow_traps'] == HTTPCHECK_ALLOW_TRAPS_ON),
676		'allow_traps_row'
677	)
678	->addRow(_('Allowed hosts'),
679		(new CTextBox('trapper_hosts', $data['trapper_hosts']))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
680		'row_trapper_hosts'
681	)
682	->addRow(new CLabel(_('New application'), 'new_application'),
683		(new CSpan(
684			(new CTextBox('new_application', $data['new_application']))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
685		))->addClass(ZBX_STYLE_FORM_NEW_GROUP)
686	);
687
688$application_list_box = new CListBox('applications[]', $data['applications'], 6);
689$application_list_box->addItem(0, '-'._('None').'-');
690foreach ($data['db_applications'] as $application) {
691	$application_list_box->addItem($application['applicationid'], CHtml::encode($application['name']));
692}
693$form_list
694	->addRow(_('Applications'), $application_list_box)
695	// Append application prototypes to form list.
696	->addRow(new CLabel(_('New application prototype'), 'new_application_prototype'),
697		(new CSpan(
698			(new CTextBox('new_application_prototype', $data['new_application_prototype']))
699				->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
700		))->addClass(ZBX_STYLE_FORM_NEW_GROUP)
701	);
702
703$application_prototype_listbox = new CListBox('application_prototypes[]', $data['application_prototypes'], 6);
704$application_prototype_listbox->addItem(0, '-'._('None').'-');
705foreach ($data['db_application_prototypes'] as $application_prototype) {
706	$application_prototype_listbox->addItem($application_prototype['name'], $application_prototype['name']);
707}
708$form_list
709	->addRow(_('Application prototypes'), $application_prototype_listbox)
710	// Append description to form list.
711	->addRow(_('Description'),
712		(new CTextArea('description', $data['description']))
713			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
714			->setMaxlength(DB::getFieldLength('items', 'description'))
715	)
716	// Append status to form list.
717	->addRow(_('Create enabled'),
718		(new CCheckBox('status', ITEM_STATUS_ACTIVE))->setChecked($data['status'] == ITEM_STATUS_ACTIVE)
719	)
720	->addRow(_('Discover'),
721		(new CCheckBox('discover', ZBX_PROTOTYPE_DISCOVER))
722			->setChecked($data['discover'] == ZBX_PROTOTYPE_DISCOVER)
723			->setUncheckedValue(ZBX_PROTOTYPE_NO_DISCOVER)
724	);
725
726// Append tabs to form.
727$tab = (new CTabView())
728	->addTab('itemTab', $data['caption'], $form_list)
729	->addTab('preprocTab', _('Preprocessing'),
730		(new CFormList('item_preproc_list'))
731			->addRow(_('Preprocessing steps'),
732				getItemPreprocessing($form, $data['preprocessing'], $readonly, $data['preprocessing_types'])
733			)
734	);
735
736if (!hasRequest('form_refresh')) {
737	$tab->setSelected(0);
738}
739
740// append buttons to form
741if ($data['itemid'] != 0) {
742	$tab->setFooter(makeFormFooter(
743		new CSubmit('update', _('Update')), [
744			new CSubmit('clone', _('Clone')),
745			(new CSimpleButton(_('Test')))->setId('test_item'),
746			(new CButtonDelete(_('Delete item prototype?'),
747				url_params(['form', 'itemid', 'parent_discoveryid'])
748			))->setEnabled(!$readonly),
749			new CButtonCancel(url_params(['parent_discoveryid']))
750		]
751	));
752}
753else {
754	$tab->setFooter(makeFormFooter(
755		new CSubmit('add', _('Add')),
756		[(new CSimpleButton(_('Test')))->setId('test_item'), new CButtonCancel(url_params(['parent_discoveryid']))]
757	));
758}
759
760$form->addItem($tab);
761$widget->addItem($form);
762
763require_once dirname(__FILE__).'/js/configuration.item.prototype.edit.js.php';
764
765$widget->show();
766