} else { $sortField = getRequest('sort', CProfile::get('web.' . $page['file'] . '.sort', 'name')); $sortOrder = getRequest('sortorder', CProfile::get('web.' . $page['file'] . '.sortorder', ZBX_SORT_UP)); CProfile::update('web.' . $page['file'] . '.sort', $sortField, PROFILE_TYPE_STR); CProfile::update('web.' . $page['file'] . '.sortorder', $sortOrder, PROFILE_TYPE_STR); $pageFilter = new CPageFilter(array('groups' => array('editable' => true, 'with_hosts_and_templates' => true), 'hosts' => array('editable' => true, 'templated_hosts' => true), 'hostid' => getRequest('hostid'), 'groupid' => getRequest('groupid'))); $data = array('pageFilter' => $pageFilter, 'sort' => $sortField, 'sortorder' => $sortOrder, 'hostid' => $pageFilter->hostid, 'groupid' => $pageFilter->groupid); if ($pageFilter->hostsSelected) { // get application ids $applications = API::Application()->get(array('hostids' => $pageFilter->hostid > 0 ? $pageFilter->hostid : null, 'groupids' => $pageFilter->groupid > 0 ? $pageFilter->groupid : null, 'output' => array('applicationid'), 'editable' => true, 'sortfield' => $sortField, 'limit' => $config['search_limit'] + 1)); $applicationIds = zbx_objectValues($applications, 'applicationid'); // get applications $data['applications'] = API::Application()->get(array('applicationids' => $applicationIds, 'output' => API_OUTPUT_EXTEND, 'selectItems' => array('itemid'), 'selectHost' => array('hostid', 'name'))); order_result($data['applications'], $sortField, $sortOrder); // fetch template application source parents $applicationSourceParentIds = getApplicationSourceParentIds($applicationIds); $parentAppIds = array(); foreach ($applicationSourceParentIds as $applicationParentIds) { foreach ($applicationParentIds as $parentId) { $parentAppIds[$parentId] = $parentId; } } if ($parentAppIds) { $parentTemplates = DBfetchArrayAssoc(DBselect('SELECT a.applicationid,h.hostid,h.name' . ' FROM applications a,hosts h' . ' WHERE a.hostid=h.hostid' . ' AND ' . dbConditionInt('a.applicationid', $parentAppIds)), 'applicationid'); foreach ($data['applications'] as &$application) { if ($application['templateids'] && isset($applicationSourceParentIds[$application['applicationid']])) { foreach ($applicationSourceParentIds[$application['applicationid']] as $parentAppId) { $application['sourceTemplates'][] = $parentTemplates[$parentAppId]; } } }
/** * Returns the farthest application ancestor for each given application. * * @param array $applicationIds * @param array $templateApplicationIds array with parent application IDs as keys and arrays of child application * IDs as values * * @return array an array with child IDs as keys and arrays of ancestor IDs as values */ function getApplicationSourceParentIds(array $applicationIds, array $templateApplicationIds = array()) { $query = DBSelect('SELECT at.applicationid,at.templateid' . ' FROM application_template at' . ' WHERE ' . dbConditionInt('at.applicationid', $applicationIds)); $applicationIds = array(); $unsetApplicationIds = array(); while ($applicationTemplate = DBfetch($query)) { // check if we already have an application inherited from the current application // if we do - copy all of its child applications to the parent template if (isset($templateApplicationIds[$applicationTemplate['applicationid']])) { $templateApplicationIds[$applicationTemplate['templateid']] = $templateApplicationIds[$applicationTemplate['applicationid']]; $unsetApplicationIds[$applicationTemplate['applicationid']] = $applicationTemplate['applicationid']; } else { $templateApplicationIds[$applicationTemplate['templateid']][] = $applicationTemplate['applicationid']; } $applicationIds[$applicationTemplate['applicationid']] = $applicationTemplate['templateid']; } // unset children of all applications that we found a new parent for foreach ($unsetApplicationIds as $applicationId) { unset($templateApplicationIds[$applicationId]); } // continue while we still have new applications to check if ($applicationIds) { return getApplicationSourceParentIds($applicationIds, $templateApplicationIds); } else { // return an inverse hash with application IDs as keys and arrays of parent application IDs as values $result = array(); foreach ($templateApplicationIds as $templateId => $applicationIds) { foreach ($applicationIds as $applicationId) { $result[$applicationId][] = $templateId; } } return $result; } }
$applicationView->show(); } else { $data = array('pageFilter' => new CPageFilter(array('groups' => array('editable' => true, 'with_hosts_and_templates' => true), 'hosts' => array('editable' => true, 'templated_hosts' => true), 'hostid' => get_request('hostid'), 'groupid' => get_request('groupid')))); $data['groupid'] = $data['pageFilter']->groupid; $data['hostid'] = $data['pageFilter']->hostid; $data['displayNodes'] = is_array(get_current_nodeid()) && $data['pageFilter']->groupid == 0 && $data['pageFilter']->hostid == 0; if ($data['pageFilter']->hostsSelected) { // get application ids $sortfield = getPageSortField('name'); $sortorder = getPageSortOrder(); $data['applications'] = API::Application()->get(array('hostids' => $data['pageFilter']->hostid > 0 ? $data['pageFilter']->hostid : null, 'groupids' => $data['pageFilter']->groupid > 0 ? $data['pageFilter']->groupid : null, 'output' => array('applicationid'), 'editable' => true, 'sortfield' => $sortfield, 'limit' => $config['search_limit'] + 1)); // get applications $data['applications'] = API::Application()->get(array('applicationids' => zbx_objectValues($data['applications'], 'applicationid'), 'output' => API_OUTPUT_EXTEND, 'selectItems' => array('itemid'), 'expandData' => true)); order_result($data['applications'], $sortfield, $sortorder); // fetch template application source parents $applicationSourceParentIds = getApplicationSourceParentIds(zbx_objectValues($data['applications'], 'applicationid')); $parentAppIds = array(); foreach ($applicationSourceParentIds as $applicationParentIds) { foreach ($applicationParentIds as $parentId) { $parentAppIds[$parentId] = $parentId; } } if ($parentAppIds) { $parentTemplates = DBfetchArrayAssoc(DBselect('SELECT a.applicationid,h.hostid,h.name' . ' FROM applications a,hosts h' . ' WHERE a.hostid=h.hostid' . ' AND ' . dbConditionInt('a.applicationid', $parentAppIds)), 'applicationid'); foreach ($data['applications'] as &$application) { if ($application['templateids'] && isset($applicationSourceParentIds[$application['applicationid']])) { foreach ($applicationSourceParentIds[$application['applicationid']] as $parentAppId) { $application['sourceTemplates'][] = $parentTemplates[$parentAppId]; } } }