/** * Builds expression html tree * * @param array $expressionTree output of getExpressionTree() function * @param array $next parameter only for recursive call; should be empty array * @param int $letterNum parameter only for recursive call; should be 0 * @param int $level parameter only for recursive call * @param string $operand parameter only for recursive call * * @return bool returns true if element is found, false - otherwise */ function buildExpressionHtmlTree(array $expressionTree, array &$next, &$letterNum, $level = 0, $operand = null) { $treeList = array(); $outline = ''; end($expressionTree); $lastKey = key($expressionTree); foreach ($expressionTree as $key => $element) { switch ($element['type']) { case 'operand': $next[$level] = $key != $lastKey; $expr = expressionLevelDraw($next, $level); $expr[] = SPACE; $expr[] = italic($element['operand'] == '&' ? _('AND') : _('OR')); $levelDetails = array('list' => $expr, 'id' => $element['id'], 'expression' => array('value' => $element['expression'])); $levelErrors = expressionHighLevelErrors($element['expression']); if (count($levelErrors) > 0) { $levelDetails['expression']['levelErrors'] = $levelErrors; } $treeList[] = $levelDetails; list($subOutline, $subTreeList) = buildExpressionHtmlTree($element['elements'], $next, $letterNum, $level + 1, $element['operand']); $treeList = array_merge($treeList, $subTreeList); $outline .= $level == 0 ? $subOutline : '(' . $subOutline . ')'; if ($operand !== null && $next[$level]) { $outline .= ' ' . $operand . ' '; } break; case 'expression': $next[$level] = $key != $lastKey; $letter = num2letter($letterNum++); $outline .= $letter; if ($operand !== null && $next[$level]) { $outline .= ' ' . $operand . ' '; } if (defined('NO_LINK_IN_TESTING')) { $url = new CSpan($element['expression']); } else { $expressionId = 'expr_' . $element['id']; $url = new CSpan($element['expression'], 'link'); $url->setAttribute('id', $expressionId); $url->setAttribute('onclick', 'javascript: copy_expression("' . $expressionId . '");'); } $expr = expressionLevelDraw($next, $level); $expr[] = SPACE; $expr[] = bold($letter); $expr[] = SPACE; $expr[] = $url; $levelDetails = array('list' => $expr, 'id' => $element['id'], 'expression' => array('value' => $element['expression'])); $levelErrors = expressionHighLevelErrors($element['expression']); if (count($levelErrors) > 0) { $levelDetails['expression']['levelErrors'] = $levelErrors; } $treeList[] = $levelDetails; break; } } return array($outline, $treeList); }
/** * Builds expression html tree * * @param array $expressionTree output of getExpressionTree() function * @param array $next parameter only for recursive call; should be empty array * @param int $letterNum parameter only for recursive call; should be 0 * @param int $level parameter only for recursive call * @param string $operator parameter only for recursive call * * @return array array containing the trigger expression formula as the first element and an array describing the * expression tree as the second */ function buildExpressionHtmlTree(array $expressionTree, array &$next, &$letterNum, $level = 0, $operator = null) { $treeList = []; $outline = ''; end($expressionTree); $lastKey = key($expressionTree); foreach ($expressionTree as $key => $element) { switch ($element['type']) { case 'operator': $next[$level] = $key != $lastKey; $expr = expressionLevelDraw($next, $level); $expr[] = SPACE; $expr[] = $element['operator'] === 'and' ? _('And') : _('Or'); $levelDetails = ['list' => $expr, 'id' => $element['id'], 'expression' => ['value' => $element['expression']]]; $levelErrors = expressionHighLevelErrors($element['expression']); if (count($levelErrors) > 0) { $levelDetails['expression']['levelErrors'] = $levelErrors; } $treeList[] = $levelDetails; list($subOutline, $subTreeList) = buildExpressionHtmlTree($element['elements'], $next, $letterNum, $level + 1, $element['operator']); $treeList = array_merge($treeList, $subTreeList); $outline .= $level == 0 ? $subOutline : '(' . $subOutline . ')'; if ($operator !== null && $next[$level]) { $outline .= ' ' . $operator . ' '; } break; case 'expression': $next[$level] = $key != $lastKey; $letter = num2letter($letterNum++); $outline .= $letter; if ($operator !== null && $next[$level]) { $outline .= ' ' . $operator . ' '; } if (defined('NO_LINK_IN_TESTING')) { $url = $element['expression']; } else { $expressionId = 'expr_' . $element['id']; $url = (new CSpan($element['expression']))->addClass(ZBX_STYLE_LINK_ACTION)->setId($expressionId)->onClick('javascript: copy_expression("' . $expressionId . '");'); } $expr = expressionLevelDraw($next, $level); $expr[] = SPACE; $expr[] = bold($letter); $expr[] = SPACE; $expr[] = $url; $levelDetails = ['list' => $expr, 'id' => $element['id'], 'expression' => ['value' => $element['expression']]]; $levelErrors = expressionHighLevelErrors($element['expression']); if (count($levelErrors) > 0) { $levelDetails['expression']['levelErrors'] = $levelErrors; } $treeList[] = $levelDetails; break; } } return [$outline, $treeList]; }