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$this->addJsFile('multilineinput.js'); 27$this->addJsFile('class.tab-indicators.js'); 28 29$this->includeJsFile('administration.mediatype.edit.js.php'); 30 31$widget = (new CWidget())->setTitle(_('Media types')); 32 33$tabs = new CTabView(); 34 35if ($data['form_refresh'] == 0) { 36 $tabs->setSelected(0); 37} 38 39// create form 40$mediaTypeForm = (new CForm()) 41 ->setId('media-type-form') 42 ->addVar('form', 1) 43 ->addVar('mediatypeid', $data['mediatypeid']) 44 ->addItem((new CVar('status', MEDIA_TYPE_STATUS_DISABLED))->removeId()) 45 ->disablePasswordAutofill() 46 ->setAttribute('aria-labeledby', ZBX_STYLE_PAGE_TITLE); 47 48// Create form list. 49$mediatype_formlist = (new CFormList()) 50 ->addRow((new CLabel(_('Name'), 'name'))->setAsteriskMark(), 51 (new CTextBox('name', $data['name'], false, 100)) 52 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 53 ->setAriaRequired() 54 ->setAttribute('autofocus', 'autofocus') 55 ) 56 ->addRow(new CLabel(_('Type'), 'label-type'), (new CSelect('type')) 57 ->setId('type') 58 ->setFocusableElementId('label-type') 59 ->addOptions(CSelect::createOptionsFromArray(media_type2str())) 60 ->setValue($data['type']) 61 ) 62 ->addRow((new CLabel(_('SMTP server'), 'smtp_server'))->setAsteriskMark(), 63 (new CTextBox('smtp_server', $data['smtp_server'])) 64 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 65 ->setAriaRequired() 66 ) 67 ->addRow(_('SMTP server port'), 68 (new CNumericBox('smtp_port', $data['smtp_port'], 5, false, false, false))->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 69 ) 70 ->addRow((new CLabel(_('SMTP helo'), 'smtp_helo'))->setAsteriskMark(), 71 (new CTextBox('smtp_helo', $data['smtp_helo'])) 72 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 73 ->setAriaRequired() 74 ) 75 ->addRow((new CLabel(_('SMTP email'), 'smtp_email'))->setAsteriskMark(), 76 (new CTextBox('smtp_email', $data['smtp_email'])) 77 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 78 ->setAriaRequired() 79 ) 80 ->addRow(new CLabel(_('Connection security'), 'smtp_security'), 81 (new CRadioButtonList('smtp_security', (int) $data['smtp_security'])) 82 ->addValue(_('None'), SMTP_CONNECTION_SECURITY_NONE) 83 ->addValue(_('STARTTLS'), SMTP_CONNECTION_SECURITY_STARTTLS) 84 ->addValue(_('SSL/TLS'), SMTP_CONNECTION_SECURITY_SSL_TLS) 85 ->setModern(true) 86 ) 87 ->addRow(_('SSL verify peer'), (new CCheckBox('smtp_verify_peer'))->setChecked($data['smtp_verify_peer'])) 88 ->addRow(_('SSL verify host'), (new CCheckBox('smtp_verify_host'))->setChecked($data['smtp_verify_host'])) 89 ->addRow(new CLabel(_('Authentication'), 'smtp_authentication'), 90 (new CRadioButtonList('smtp_authentication', (int) $data['smtp_authentication'])) 91 ->addValue(_('None'), SMTP_AUTHENTICATION_NONE) 92 ->addValue(_('Username and password'), SMTP_AUTHENTICATION_NORMAL) 93 ->setModern(true) 94 ) 95 ->addRow(_('Username'), (new CTextBox('smtp_username', $data['smtp_username']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)) 96 ->addRow((new CLabel(_('Script name'), 'exec_path'))->setAsteriskMark(), 97 (new CTextBox('exec_path', $data['exec_path'])) 98 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 99 ->setAriaRequired() 100 ); 101 102$exec_params_table = (new CTable()) 103 ->setId('exec_params_table') 104 ->setHeader([_('Parameter'), _('Action')]) 105 ->setAttribute('style', 'width: 100%;'); 106 107foreach ($data['exec_params'] as $i => $exec_param) { 108 $exec_params_table->addRow([ 109 (new CTextBox('exec_params['.$i.'][exec_param]', $exec_param['exec_param'], false, 255)) 110 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH), 111 (new CButton('exec_params['.$i.'][remove]', _('Remove'))) 112 ->addClass(ZBX_STYLE_BTN_LINK) 113 ->addClass('element-table-remove') 114 ], 'form_row'); 115} 116 117$exec_params_table->addRow([(new CButton('exec_param_add', _('Add'))) 118 ->addClass(ZBX_STYLE_BTN_LINK) 119 ->addClass('element-table-add')]); 120 121$mediatype_formlist->addRow(_('Script parameters'), 122 (new CDiv($exec_params_table)) 123 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 124 ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'), 125 'row_exec_params' 126); 127 128$mediatype_formlist->addRow((new CLabel(_('GSM modem'), 'gsm_modem'))->setAsteriskMark(), 129 (new CTextBox('gsm_modem', $data['gsm_modem'])) 130 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 131 ->setAriaRequired() 132); 133 134// Create password field. 135if ($data['passwd'] !== '' && !$data['change_passwd']) { 136 // Disabling 'passwd' field prevents stored passwords autofill by browser. 137 $passwd_field = [ 138 (new CButton('chPass_btn', _('Change password'))), 139 (new CPassBox('passwd', '')) 140 ->setWidth(ZBX_TEXTAREA_SMALL_WIDTH) 141 ->setAriaRequired() 142 ->addStyle('display: none;') 143 ->setAttribute('disabled', 'disabled') 144 ]; 145} 146else { 147 $passwd_field = (new CPassBox('passwd', $data['passwd']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH); 148} 149 150// MEDIA_TYPE_WEBHOOK 151$parameters_table = (new CTable()) 152 ->setId('parameters_table') 153 ->setHeader([ 154 (new CColHeader(_('Name')))->setWidth('50%'), 155 (new CColHeader(_('Value')))->setWidth('50%'), 156 _('Action') 157 ]) 158 ->setAttribute('style', 'width: 100%;'); 159 160foreach ($data['parameters'] as $parameter) { 161 $parameters_table->addRow([ 162 (new CTextBox('parameters[name][]', $parameter['name'], false, DB::getFieldLength('media_type_param', 'name'))) 163 ->setAttribute('style', 'width: 100%;') 164 ->removeId(), 165 (new CTextBox('parameters[value][]', $parameter['value'], false, 166 DB::getFieldLength('media_type_param', 'value') 167 )) 168 ->setAttribute('style', 'width: 100%;') 169 ->removeId(), 170 (new CButton('', _('Remove'))) 171 ->removeId() 172 ->onClick('jQuery(this).closest("tr").remove()') 173 ->addClass(ZBX_STYLE_BTN_LINK) 174 ->addClass('element-table-remove') 175 ], 'form_row'); 176} 177 178$row_template = (new CTag('script', true)) 179 ->setId('parameters_row') 180 ->setAttribute('type', 'text/x-jquery-tmpl') 181 ->addItem( 182 (new CRow([ 183 (new CTextBox('parameters[name][]', '', false, DB::getFieldLength('media_type_param', 'name'))) 184 ->setAttribute('style', 'width: 100%;') 185 ->removeId(), 186 (new CTextBox('parameters[value][]', '', false, DB::getFieldLength('media_type_param', 'value'))) 187 ->setAttribute('style', 'width: 100%;') 188 ->removeId(), 189 (new CButton('', _('Remove'))) 190 ->removeId() 191 ->onClick('jQuery(this).closest("tr").remove()') 192 ->addClass(ZBX_STYLE_BTN_LINK) 193 ->addClass('element-table-remove') 194 ]))->addClass('form_row') 195 ); 196 197$widget->addItem($row_template); 198 199$parameters_table->addRow([(new CButton('parameter_add', _('Add'))) 200 ->addClass(ZBX_STYLE_BTN_LINK) 201 ->addClass('element-table-add')]); 202 203// append password field to form list 204$mediatype_formlist 205 ->addRow(new CLabel(_('Password'), 'passwd'), $passwd_field) 206 ->addRow(new CLabel(_('Message format'), 'content_type'), 207 (new CRadioButtonList('content_type', (int) $data['content_type'])) 208 ->addValue(_('HTML'), SMTP_MESSAGE_FORMAT_HTML) 209 ->addValue(_('Plain text'), SMTP_MESSAGE_FORMAT_PLAIN_TEXT) 210 ->setModern(true) 211 ) 212 ->addRow(new CLabel(_('Parameters'), $parameters_table->getId()), 213 (new CDiv($parameters_table)) 214 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 215 ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'), 216 'row_webhook_parameters' 217 ) 218 ->addRow((new CLabel(_('Script'), 'script'))->setAsteriskMark(), 219 (new CMultilineInput('script', $data['script'], [ 220 'title' => _('JavaScript'), 221 'placeholder' => _('script'), 222 'placeholder_textarea' => 'return value', 223 'grow' => 'auto', 224 'rows' => 0, 225 'maxlength' => DB::getFieldLength('media_type', 'script') 226 ])) 227 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 228 ->setAriaRequired(), 229 'row_webhook_script' 230 ) 231 ->addRow((new CLabel(_('Timeout'), 'timeout'))->setAsteriskMark(), 232 (new CTextBox('timeout', $data['timeout']))->setWidth(ZBX_TEXTAREA_SMALL_WIDTH), 233 'row_webhook_timeout' 234 ) 235 ->addRow(new CLabel(_('Process tags'), 'process_tags'), 236 (new CCheckBox('process_tags', ZBX_MEDIA_TYPE_TAGS_ENABLED)) 237 ->setChecked($data['process_tags'] == ZBX_MEDIA_TYPE_TAGS_ENABLED) 238 ->setUncheckedValue(ZBX_MEDIA_TYPE_TAGS_DISABLED), 239 'row_webhook_tags' 240 ) 241 ->addRow(new CLabel(_('Include event menu entry'), 'show_event_menu'), 242 (new CCheckBox('show_event_menu', ZBX_EVENT_MENU_SHOW)) 243 ->setChecked($data['show_event_menu'] == ZBX_EVENT_MENU_SHOW) 244 ->setUncheckedValue(ZBX_EVENT_MENU_HIDE), 245 'row_webhook_show_event_menu' 246 ) 247 ->addRow((new CLabel(_('Menu entry name'), 'event_menu_name'))->setAsteriskMark(), 248 (new CTextBox('event_menu_name', $data['event_menu_name'], false, 249 DB::getFieldLength('media_type', 'event_menu_name') 250 )) 251 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 252 ->setEnabled($data['show_event_menu'] == ZBX_EVENT_MENU_SHOW) 253 ->setAriaRequired(), 254 'row_webhook_url_name' 255 ) 256 ->addRow((new CLabel(_('Menu entry URL'), 'event_menu_url'))->setAsteriskMark(), 257 (new CTextBox('event_menu_url', $data['event_menu_url'], false, 258 DB::getFieldLength('media_type', 'event_menu_url') 259 )) 260 ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 261 ->setEnabled($data['show_event_menu'] == ZBX_EVENT_MENU_SHOW) 262 ->setAriaRequired(), 263 'row_webhook_event_menu_url' 264 ) 265 ->addRow(_('Description'), 266 (new CTextArea('description', $data['description']))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 267 ) 268 ->addRow(_('Enabled'), 269 (new CCheckBox('status', MEDIA_TYPE_STATUS_ACTIVE))->setChecked($data['status'] == MEDIA_TYPE_STATUS_ACTIVE) 270 ); 271$tabs->addTab('mediaTab', _('Media type'), $mediatype_formlist); 272 273// Message templates tab. 274$message_templates_formlist = (new CFormList('messageTemplatesFormlist')) 275 ->addRow(null, 276 (new CDiv( 277 (new CTable()) 278 ->addStyle('width: 100%;') 279 ->setHeader([ 280 _('Message type'), 281 _('Template'), 282 _('Actions') 283 ]) 284 ->setFooter( 285 (new CRow( 286 (new CCol( 287 (new CSimpleButton(_('Add'))) 288 ->setAttribute('data-action', 'add') 289 ->addClass(ZBX_STYLE_BTN_LINK) 290 ))->setColSpan(3) 291 ))->setId('message-templates-footer') 292 ) 293 )) 294 ->setId('message-templates') 295 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 296 ->addStyle('width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;') 297 ); 298$tabs->addTab('messageTemplatesTab', _('Message templates'), $message_templates_formlist, 299 TAB_INDICATOR_MESSAGE_TEMPLATE 300); 301 302// media options tab 303$max_sessions = ($data['maxsessions'] > 1) ? $data['maxsessions'] : 0; 304if ($data['type'] == MEDIA_TYPE_SMS) { 305 $max_sessions = 1; 306} 307 308switch ($data['maxsessions']) { 309 case 1: 310 $data['maxsessions_type'] = 'one'; 311 break; 312 case 0: 313 $data['maxsessions_type'] = 'unlimited'; 314 break; 315 default: 316 $data['maxsessions_type'] = 'custom'; 317} 318 319$mediaOptionsForm = (new CFormList('options')) 320 ->addRow(new CLabel(_('Concurrent sessions'), 'maxsessions_type'), 321 (new CDiv()) 322 ->addClass(ZBX_STYLE_NOWRAP) 323 ->addItem([ 324 (new CDiv( 325 (new CRadioButtonList('maxsessions_type', $data['maxsessions_type'])) 326 ->addValue(_('One'), 'one') 327 ->addValue(_('Unlimited'), 'unlimited') 328 ->addValue(_('Custom'), 'custom') 329 ->setModern(true) 330 ))->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 331 (new CNumericBox('maxsessions', $max_sessions, 3, false, false, false)) 332 ->setAriaRequired() 333 ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 334 ]) 335 ) 336 ->addRow((new CLabel(_('Attempts'), 'maxattempts'))->setAsteriskMark(), 337 (new CNumericBox('maxattempts', $data['maxattempts'], 3, false, false, false)) 338 ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 339 ->setAriaRequired() 340 ) 341 ->addRow((new CLabel(_('Attempt interval'), 'attempt_interval'))->setAsteriskMark(), 342 (new CTextBox('attempt_interval', $data['attempt_interval'], false, 12)) 343 ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 344 ->setAriaRequired() 345 ); 346$tabs->addTab('optionsTab', _('Options'), $mediaOptionsForm); 347 348// append buttons to form 349$cancelButton = (new CRedirectButton(_('Cancel'), (new CUrl('zabbix.php')) 350 ->setArgument('action', 'mediatype.list') 351 ->setArgument('page', CPagerHelper::loadPage('mediatype.list', null)) 352))->setId('cancel'); 353 354if ($data['mediatypeid'] == 0) { 355 $addButton = (new CSubmitButton(_('Add'), 'action', 'mediatype.create'))->setId('add'); 356 357 $tabs->setFooter(makeFormFooter( 358 $addButton, 359 [$cancelButton] 360 )); 361} 362else { 363 $updateButton = (new CSubmitButton(_('Update'), 'action', 'mediatype.update'))->setId('update'); 364 $cloneButton = (new CSimpleButton(_('Clone')))->setId('clone'); 365 $deleteButton = (new CRedirectButton(_('Delete'), 366 'zabbix.php?action=mediatype.delete&sid='.$data['sid'].'&mediatypeids[]='.$data['mediatypeid'], 367 _('Delete media type?') 368 )) 369 ->setId('delete'); 370 371 $tabs->setFooter(makeFormFooter( 372 $updateButton, 373 [ 374 $cloneButton, 375 $deleteButton, 376 $cancelButton 377 ] 378 )); 379} 380 381// append tab to form 382$mediaTypeForm->addItem($tabs); 383 384// append form to widget 385$widget->addItem($mediaTypeForm)->show(); 386