} 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;
    }
}
Exemple #3
0
    $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];
                    }
                }
            }