Index: frontends/php/actionconf.php =================================================================== --- frontends/php/actionconf.php (revision 53174) +++ frontends/php/actionconf.php (working copy) @@ -254,16 +254,59 @@ $new_opcondition = $_REQUEST['new_opcondition']; try { - CAction::validateOperationConditions($new_opcondition); $new_operation = getRequest('new_operation', array()); - if (!isset($new_operation['opconditions'])) { $new_operation['opconditions'] = array(); } - if (!str_in_array($new_opcondition, $new_operation['opconditions'])) { - array_push($new_operation['opconditions'], $new_opcondition); + $opconditions = $new_operation['opconditions']; + + if ($new_opcondition['conditiontype'] == CONDITION_TYPE_MAINTENANCE) { + $new_opcondition['value'] = ''; } + // check existing conditions and remove duplicate condition values + foreach ($opconditions as $condition) { + if ($new_opcondition['conditiontype'] == $condition['conditiontype']) { + if (is_array($new_opcondition['value'])) { + foreach ($new_opcondition['value'] as $key => $newValue) { + if ($condition['value'] == $newValue) { + unset($new_opcondition['value'][$key]); + } + } + } + else { + if ($new_opcondition['value'] == $condition['value']) { + $new_opcondition['value'] = null; + } + } + } + } + + $usedFormulaIds = zbx_objectValues($opconditions, 'formulaid'); + + $validateOpConditions = $opconditions; + + if (isset($new_opcondition['value'])) { + if (is_array($new_opcondition['value'])) { + $newConditionValues = zbx_toArray($new_opcondition['value']); + foreach ($newConditionValues as $newValue) { + $condition = $new_opcondition; + $condition['value'] = $newValue; + $condition['formulaid'] = CConditionHelper::getNextFormulaId($usedFormulaIds); + $usedFormulaIds[] = $condition['formulaid']; + $validateOpConditions[] = $condition; + } + } else { + $new_opcondition['formulaid'] = CConditionHelper::getNextFormulaId($usedFormulaIds); + $usedFormulaIds[] = $new_opcondition['formulaid']; + $validateOpConditions[] = $new_opcondition; + } + } + + CAction::validateOperationConditions($validateOpConditions); + + $new_operation['opconditions'] = $validateOpConditions; + $_REQUEST['new_operation'] = $new_operation; unset($_REQUEST['new_opcondition']); Index: frontends/php/include/actions.inc.php =================================================================== --- frontends/php/include/actions.inc.php (revision 53174) +++ frontends/php/include/actions.inc.php (working copy) @@ -555,10 +555,20 @@ } function get_opconditions_by_eventsource($eventsource) { - $conditions = array( - EVENT_SOURCE_TRIGGERS => array(CONDITION_TYPE_EVENT_ACKNOWLEDGED), - EVENT_SOURCE_DISCOVERY => array(), + $conditions[EVENT_SOURCE_TRIGGERS] = array( + CONDITION_TYPE_EVENT_ACKNOWLEDGED, + CONDITION_TYPE_APPLICATION, + CONDITION_TYPE_HOST_GROUP, + CONDITION_TYPE_TEMPLATE, + CONDITION_TYPE_HOST, + CONDITION_TYPE_TRIGGER, + CONDITION_TYPE_TRIGGER_NAME, + CONDITION_TYPE_TRIGGER_SEVERITY, + CONDITION_TYPE_TRIGGER_VALUE, + CONDITION_TYPE_TIME_PERIOD, + CONDITION_TYPE_MAINTENANCE ); + $conditions[EVENT_SOURCE_DISCOVERY] = array(); if (isset($conditions[$eventsource])) { return $conditions[$eventsource]; Index: frontends/php/include/classes/api/services/CAction.php =================================================================== --- frontends/php/include/classes/api/services/CAction.php (revision 53174) +++ frontends/php/include/classes/api/services/CAction.php (working copy) @@ -1460,26 +1460,43 @@ */ public static function validateOperationConditions($conditions) { $conditions = zbx_toArray($conditions); - $ackStatuses = array( - EVENT_ACKNOWLEDGED => 1, - EVENT_NOT_ACKNOWLEDGED => 1 - ); + $usedFormulaIds = zbx_objectValues($conditions, 'formulaid'); - foreach ($conditions as $condition) { - switch ($condition['conditiontype']) { - case CONDITION_TYPE_EVENT_ACKNOWLEDGED: - if (!isset($ackStatuses[$condition['value']])) { - self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action operation condition acknowledge type.')); - } - break; + $validateConditions = $conditions; - default: - self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action operation condition type.')); + if (isset($conditions['value'])) { + $newConditionValues = zbx_toArray($conditions['value']); + foreach ($newConditionValues as $newValue) { + $condition = $conditions; + $condition['value'] = $newValue; + $condition['formulaid'] = CConditionHelper::getNextFormulaId($usedFormulaIds); + $usedFormulaIds[] = $condition['formulaid']; + $validateConditions[] = $condition; + } + } + + $conditionsValid = true; + if ($validateConditions) { + $filterConditionValidator = new CActionCondValidator(); + foreach ($validateConditions as $condition) { + if ($condition['conditiontype'] == CONDITION_TYPE_MAINTENANCE) { + $condition['value'] = ''; + } + if (!$filterConditionValidator->validate($condition)) { + $conditionsValid = false; break; + } } } - return true; + if ($conditionsValid) { + return true; + } + else { + error($filterConditionValidator->getError()); + self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action operation condition type.')); + return false; + } } protected function addRelatedObjects(array $options, array $result) { Index: frontends/php/include/classes/validators/CActionCondValidator.php =================================================================== --- frontends/php/include/classes/validators/CActionCondValidator.php (revision 53174) +++ frontends/php/include/classes/validators/CActionCondValidator.php (working copy) @@ -198,6 +198,12 @@ } break; + case CONDITION_TYPE_EVENT_ACKNOWLEDGED: + if (zbx_empty($conditionValue)) { + $this->setError(_('Incorrect action operation condition acknowledge type.')); + } + break; + default: $this->setError(_('Incorrect action condition type.')); } Index: frontends/php/include/views/configuration.action.edit.php =================================================================== --- frontends/php/include/views/configuration.action.edit.php (revision 53174) +++ frontends/php/include/views/configuration.action.edit.php (working copy) @@ -1035,12 +1035,114 @@ } array_push($rowCondition, $operationConditionComboBox); - if ($new_opcondition['conditiontype'] == CONDITION_TYPE_EVENT_ACKNOWLEDGED) { - $operationConditionValueComboBox = new CComboBox('new_opcondition[value]', $new_opcondition['value']); - $operationConditionValueComboBox->addItem(0, _('Not Ack')); - $operationConditionValueComboBox->addItem(1, _('Ack')); - $rowCondition[] = $operationConditionValueComboBox; + switch ($new_opcondition['conditiontype']) { + case CONDITION_TYPE_HOST_GROUP: + $condition = new CMultiSelect(array( + 'name' => 'new_opcondition[value][]', + 'objectName' => 'hostGroup', + 'objectOptions' => array( + 'editable' => true + ), + 'defaultValue' => 0, + 'popup' => array( + 'parameters' => 'srctbl=host_groups&dstfrm='.$actionForm->getName().'&dstfld1=new_opcondition_value_'. + '&srcfld1=groupid&writeonly=1&multiselect=1', + 'width' => 450, + 'height' => 450 + ) + )); + break; + + case CONDITION_TYPE_TEMPLATE: + $condition = new CMultiSelect(array( + 'name' => 'new_opcondition[value][]', + 'objectName' => 'templates', + 'objectOptions' => array( + 'editable' => true + ), + 'defaultValue' => 0, + 'popup' => array( + 'parameters' => 'srctbl=templates&srcfld1=hostid&srcfld2=host&dstfrm='.$actionForm->getName(). + '&dstfld1=new_opcondition_value_&templated_hosts=1&multiselect=1&writeonly=1', + 'width' => 450, + 'height' => 450 + ) + )); + break; + + case CONDITION_TYPE_HOST: + $condition = new CMultiSelect(array( + 'name' => 'new_opcondition[value][]', + 'objectName' => 'hosts', + 'objectOptions' => array( + 'editable' => true + ), + 'defaultValue' => 0, + 'popup' => array( + 'parameters' => 'srctbl=hosts&dstfrm='.$actionForm->getName().'&dstfld1=new_opcondition_value_'. + '&srcfld1=hostid&writeonly=1&multiselect=1', + 'width' => 450, + 'height' => 450 + ) + )); + break; + + case CONDITION_TYPE_TRIGGER: + $condition = new CMultiSelect(array( + 'name' => 'new_opcondition[value][]', + 'objectName' => 'triggers', + 'objectOptions' => array( + 'editable' => true + ), + 'defaultValue' => 0, + 'popup' => array( + 'parameters' => 'srctbl=triggers&dstfrm='.$actionForm->getName().'&dstfld1=new_opcondition_value_'. + '&srcfld1=triggerid&writeonly=1&multiselect=1&noempty=1', + 'width' => 600, + 'height' => 450 + ) + )); + break; + + case CONDITION_TYPE_TRIGGER_NAME: + $condition = new CTextBox('new_opcondition[value]', '', ZBX_TEXTBOX_STANDARD_SIZE); + break; + + case CONDITION_TYPE_TRIGGER_VALUE: + $condition = new CComboBox('new_opcondition[value]'); + foreach (array(TRIGGER_VALUE_FALSE, TRIGGER_VALUE_TRUE) as $trigerValue) { + $condition->addItem($trigerValue, trigger_value2str($trigerValue)); + } + break; + + case CONDITION_TYPE_TIME_PERIOD: + $condition = new CTextBox('new_opcondition[value]', ZBX_DEFAULT_INTERVAL, ZBX_TEXTBOX_STANDARD_SIZE); + break; + + case CONDITION_TYPE_TRIGGER_SEVERITY: + $condition = new CComboBox('new_opcondition[value]'); + $condition->addItems(getSeverityCaption()); + break; + + case CONDITION_TYPE_MAINTENANCE: + $condition = new CCol(_('maintenance')); + break; + + case CONDITION_TYPE_APPLICATION: + $condition = new CTextBox('new_opcondition[value]', '', ZBX_TEXTBOX_STANDARD_SIZE); + break; + + case CONDITION_TYPE_EVENT_ACKNOWLEDGED: + $condition = new CComboBox('new_opcondition[value]'); + $condition->addItem(0, _('Not Ack')); + $condition->addItem(1, _('Ack')); + break; + + default: + $condition = null; } + array_push($rowCondition, $condition); + $newOperationConditionTable->addRow($rowCondition); $newOperationConditionFooter = array(