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 '⇒', 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 '⇒', 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