__('Delete'), 2 => __('Migrate Aggregate to use a Template'), 3 => __('Create New Aggregate from Aggregates') ); $agg_item_actions = array( 10 => __('Associate with Aggregate'), 11 => __('Disassociate with Aggregate') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'edit': top_header(); graph_edit(); bottom_footer(); break; default: top_header(); aggregate_graph(); bottom_footer(); break; } function add_tree_names_to_actions_array() { global $graph_actions; /* add a list of tree names to the actions dropdown */ $trees = db_fetch_assoc('SELECT id,name FROM graph_tree ORDER BY name'); if (sizeof($trees)) { foreach ($trees as $tree) { $graph_actions{'tr_' . $tree['id']} = __('Place on a Tree (%s)', $tree['name']); } } } function form_save() { if (!isset_request_var('save_component_graph')) { header('Location: aggregate_graphs.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); return null; } /* remember some often used values */ $local_graph_id = get_nfilter_request_var('local_graph_id', 0); $graph_template_id = get_nfilter_request_var('graph_template_id', 0); $aggregate_template_id = get_nfilter_request_var('aggregate_template_id', 0); $graph_title = form_input_validate(get_nfilter_request_var('title_format'), 'title_format', '', false, 3); if (is_error_message()) { raise_message(2); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); return null; } /* get the aggregate graph id */ $aggregate_graph_id = db_fetch_cell_prepared('SELECT id FROM aggregate_graphs WHERE local_graph_id = ?', array($local_graph_id)); /* if user disabled template propagation we need to get graph data from form */ if (!isset_request_var('template_propogation')) { $aggregate_template_id = 0; $new_data = aggregate_validate_graph_params($_POST, false); } else { $new_data = array(); } if (is_error_message()) { raise_message(2); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); return null; } /* save graph data to cacti tables */ $graph_templates_graph_id = aggregate_graph_templates_graph_save( $local_graph_id, $graph_template_id, $graph_title, $aggregate_template_id, $new_data ); /* update title in aggregate graphs table */ db_execute_prepared('UPDATE aggregate_graphs SET title_format = ? WHERE id = ?', array($graph_title, $aggregate_graph_id)); /* next lets see if any of the aggregate has changed and save as applicable * if the graph is templates, we can simply ignore. A simple check will * determine if aggregation propagation is enabled */ if (!isset_request_var('template_propogation')) { /* template propagation is disabled */ $save = array(); $save['id'] = $aggregate_graph_id; $save['template_propogation'] = ''; $save['gprint_prefix'] = get_nfilter_request_var('gprint_prefix'); $save['total_prefix'] = get_nfilter_request_var('total_prefix'); $save['total'] = get_filter_request_var('total'); $save['graph_type'] = get_filter_request_var('graph_type'); $save['total_type'] = get_filter_request_var('total_type'); $save['order_type'] = get_filter_request_var('order_type'); /* see if anything changed, if so, we will have to push out the aggregate */ if (!empty($aggregate_graph_id)) { $old = db_fetch_row_prepared('SELECT * FROM aggregate_graphs WHERE id = ?', array($aggregate_graph_id)); $save_me = 0; $save_me += ($old['template_propogation'] != $save['template_propogation']); $save_me += ($old['gprint_prefix'] != $save['gprint_prefix']); $save_me += ($old['graph_type'] != $save['graph_type']); $save_me += ($old['total'] != $save['total']); $save_me += ($old['total_type'] != $save['total_type']); $save_me += ($old['total_prefix'] != $save['total_prefix']); $save_me += ($old['order_type'] != $save['order_type']); if ($save_me) { $aggregate_graph_id = sql_save($save, 'aggregate_graphs'); } /* save the template items now */ /* get existing item ids and sequences from graph template */ $graph_templates_items = array_rekey( db_fetch_assoc_prepared('SELECT id, sequence FROM graph_templates_item WHERE local_graph_id=0 AND graph_template_id = ?', array($graph_template_id)), 'id', array('sequence') ); /* get existing aggregate template items */ $aggregate_graph_items_old = array_rekey( db_fetch_assoc_prepared('SELECT * FROM aggregate_graphs_graph_item WHERE aggregate_graph_id = ?', array($aggregate_graph_id)), 'graph_templates_item_id', array('aggregate_graph_id', 'graph_templates_item_id', 'sequence', 'color_template', 't_graph_type_id', 'graph_type_id', 't_cdef_id', 'cdef_id', 'item_skip', 'item_total') ); /* update graph template item values with posted values */ aggregate_validate_graph_items($_POST, $graph_templates_items); $items_changed = false; $items_to_save = array(); foreach($graph_templates_items as $item_id => $data) { $item_new = array(); $item_new['aggregate_graph_id'] = $aggregate_graph_id; $item_new['graph_templates_item_id'] = $item_id; $item_new['color_template'] = isset($data['color_template']) ? $data['color_template']:0; $item_new['item_skip'] = isset($data['item_skip']) ? 'on':''; $item_new['item_total'] = isset($data['item_total']) ? 'on':''; $item_new['sequence'] = isset($data['sequence']) ? $data['sequence']:-1; /* compare with old item to see if we need to push out. */ if (!isset($aggregate_graph_items_old[$item_id])) { /* this item does not yet exist */ $items_changed = true; } else { /* compare data from user to data from DB */ foreach ($item_new as $field => $new_value) { if ($aggregate_graph_items_old[$item_id][$field] != $new_value) { $items_changed = true; } } /* fill in missing fields with db values */ $item_new = array_merge($aggregate_graph_items_old[$item_id], $item_new); } $items_to_save[] = $item_new; } if ($items_changed) { aggregate_graph_items_save($items_to_save, 'aggregate_graphs_graph_item'); } if ($save_me || $items_changed) { push_out_aggregates(0, $local_graph_id); } } } raise_message(1); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); } /* ------------------------ The "actions" function ------------------------ */ function form_actions() { global $graph_actions, $agg_item_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* we are performing two set's of actions here */ $graph_actions += $agg_item_actions; /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { /* delete */ api_aggregate_remove_multi($selected_items); }elseif (get_request_var('drp_action') == '2') { /* migrate to template */ api_aggregate_convert_template($selected_items); }elseif (get_request_var('drp_action') == '3') { /* create aggregate from aggregate */ $aggregate_name = get_request_var('aggregate_name'); api_aggregate_create($aggregate_name, $selected_items); }elseif (get_request_var('drp_action') == '10') { /* associate with aggregate */ api_aggregate_associate($selected_items); }elseif (get_request_var('drp_action') == '11') { /* dis-associate with aggregate */ api_aggregate_disassociate($selected_items); }elseif (preg_match('/^tr_([0-9]+)$/', get_request_var('drp_action'), $matches)) { /* place on tree */ get_filter_request_var('tree_id'); get_filter_request_var('tree_item_id'); for ($i=0;($i'; $graph_array[$i] = $matches[1]; $i++; } } top_header(); /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); form_start('aggregate_graphs.php'); html_start_box($graph_actions{get_request_var('drp_action')}, '60%', '', '3', 'center', ''); if (isset($graph_array) && sizeof($graph_array)) { if (get_request_var('drp_action') == '1') { /* delete */ print "

" . __('Click \'Continue\' to delete the following Aggregate Graph(s).') . "

\n"; $save_html = " "; }elseif (get_request_var('drp_action') == '2') { /* migrate to aggregate */ /* determine the common graph template if any */ reset($_POST); while (list($var,$val) = each($_POST)) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { $local_graph_ids[] = $matches[1]; } } $lgid = implode(',',$local_graph_ids); /* for whatever reason, subquery performance in mysql is sub-optimal. Therefore, let's do this * as a few queries instead. */ $task_items = array_rekey(db_fetch_assoc("SELECT DISTINCT task_item_id FROM graph_templates_item WHERE local_graph_id IN($lgid)"), 'task_item_id', 'task_item_id'); $task_items = implode(',', $task_items); $graph_templates = db_fetch_assoc("SELECT DISTINCT graph_template_id FROM graph_templates_item WHERE task_item_id IN ($task_items) AND graph_template_id>0"); if (sizeof($graph_templates) > 1) { print "

" . __('The selected Aggregate Graphs represent elements from more than one Graph Template.') . "

" . __('In order to migrate the Aggregate Graphs below to a Template based Aggregate, they must only be using one Graph Template. Please press \'Return\' and then select only Aggregate Graph that utilize the same Graph Template.') . "

\n"; $save_html = ""; }else{ $graph_template = $graph_templates[0]['graph_template_id']; $aggregate_templates = db_fetch_assoc_prepared('SELECT id, name FROM aggregate_graph_templates WHERE graph_template_id = ? ORDER BY name', array($graph_template)); if (sizeof($aggregate_templates)) { print "

" . __('Click \'Continue\' and the following Aggregate Graph(s) will be migrated to use the Aggregate Template that you choose below.') . "

\n"; print " " . __('Aggregate Template:') . " \n"; $save_html = " "; }else{ print "

" . __('There are currently no Aggregate Templates defined for the selected Legacy Aggregates.') . "

" . __('In order to migrate the Aggregate Graphs below to a Template based Aggregate, first create an Aggregate Template for the Graph Template \'%s\'.', db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array($graph_template))) . "

" . __('Please press \'Return\' to continue.') . "

\n"; $save_html = ""; } } }elseif (get_request_var('drp_action') == '3') { /* create aggregate from aggregates */ print "

" . __('Click \'Continue\' to combined the following Aggregate Graph(s) into a single Aggregate Graph.') . "

\n"; print " " . __('Aggregate Name:') . "\n"; print " \n"; $save_html = " "; }elseif (get_request_var('drp_action') == '10') { /* associate with aggregate */ print "

" . __('Click \'Continue\' to associate the following Graph(s) with the Aggregate Graph.') . "

\n"; $save_html = " "; }elseif (get_request_var('drp_action') == '11') { /* dis-associate with aggregate */ print "

" . __('Click \'Continue\' to disassociate the following Graph(s) from the Aggregate.') . "

\n"; $save_html = " "; }elseif (preg_match("/^tr_([0-9]+)$/", get_request_var('drp_action'), $matches)) { /* place on tree */ print "

" . __('Click \'Continue\' to place the following Aggregate Graph(s) under the Tree Branch.') . "

" . __('Destination Branch:') . "
"; grow_dropdown_tree($matches[1], "tree_item_id", "0"); print "

\n \n"; $save_html = " "; } }else{ print "" . __('You must select at least one graph.') . "\n"; $save_html = ""; } print " $save_html \n"; html_end_box(false); form_end(); bottom_footer(); } /* ----------------------- item - Graph Items ----------------------- */ function item() { global $consolidation_functions, $graph_item_types, $struct_graph_item; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (isempty_request_var('id')) { $template_item_list = array(); $header_label = __('Graph Items [new]'); }else{ $template_item_list = db_fetch_assoc_prepared('SELECT gti.id, gti.text_format, gti.value, gti.hard_return, gti.graph_type_id, gti.consolidation_function_id, dtr.data_source_name, gti.alpha, cdef.name AS cdef_name, colors.hex FROM graph_templates_item AS gti LEFT JOIN data_template_rrd AS dtr ON (gti.task_item_id=dtr.id) LEFT JOIN data_local AS dl ON (dtr.local_data_id=dl.id) LEFT JOIN data_template_data AS dtd ON (dl.id=dtd.local_data_id) LEFT JOIN cdef ON (gti.cdef_id=cdef.id) LEFT JOIN colors ON (gti.color_id=colors.id) WHERE gti.local_graph_id = ? ORDER BY gti.sequence', array(get_request_var('id'))); $header_label = __('Graph Items [edit: %s]', htmlspecialchars(get_graph_title(get_request_var('id')))); } $graph_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array(get_request_var('id'))); if (empty($graph_template_id)) { $add_text = 'aggregate_items.php?action=item_edit&local_graph_id=' . get_request_var('id'); }else{ $add_text = ''; } html_start_box($header_label, '100%', '', '3', 'center', $add_text); draw_graph_items_list($template_item_list, 'aggregate_items.php', 'local_graph_id=' . get_request_var('id') , (empty($graph_template_id) ? false : true)); html_end_box(false); } /* ------------------------------------ graph - Graphs ------------------------------------ */ function graph_edit() { global $config, $struct_graph, $struct_aggregate_graph, $image_types, $consolidation_functions, $graph_item_types, $struct_graph_item; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ /* purge any old graphs */ aggregate_prune_graphs(get_request_var('id')); if (isset_request_var('reset')) { $_SESSION['aggregate_referer'] = 'aggregate_graphs.php'; }elseif (isset($_SERVER['HTTP_REFERER']) && !substr_count($_SERVER['HTTP_REFERER'], 'aggregate_graphs.php')) { $_SESSION['aggregate_referer'] = $_SERVER['HTTP_REFERER']; }elseif (isset($_SERVER['HTTP_REFERER']) && !isset($_SESSION['aggregate_referer'])) { $_SESSION['aggregate_referer'] = $_SERVER['HTTP_REFERER']; } $referer = $_SESSION['aggregate_referer']; $use_graph_template = false; $aginfo = array(); $graphs = array(); if (!isempty_request_var('id')) { $graphs = db_fetch_row_prepared('SELECT * FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('id'))); $aginfo = db_fetch_row_prepared('SELECT * FROM aggregate_graphs WHERE local_graph_id = ?', array($graphs['local_graph_id'])); $header_label = '[edit: ' . htmlspecialchars(get_graph_title(get_request_var('id'))) . ']'; } if (sizeof($aginfo)) { if ($aginfo['aggregate_template_id'] > 0) { $template = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates WHERE id = ?', array($aginfo['aggregate_template_id'])); }else{ $template = $aginfo; } $aggregate_tabs = array('details' => __('Details'), 'items' => __('Items'), 'preview' => __('Preview')); }else{ $template = array(); $aggregate_tabs = array('details' => __('Details'), 'preview' => __('Preview')); } /* ================= input validation and session storage ================= */ $filters = array( 'tab' => array( 'filter' => FILTER_CALLBACK, 'default' => 'details', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_aggregate'); /* ================= input validation ================= */ $current_tab = get_request_var('tab'); /* draw the categories tabs on the top of the page */ print "\n"; print "\n"; /* handle debug mode */ if (isset_request_var('debug')) { if (get_filter_request_var('debug') == '0') { kill_session_var('graph_debug_mode'); }elseif (get_filter_request_var('debug') == '1') { $_SESSION['graph_debug_mode'] = true; } } if (isset($_SESSION['graph_debug_mode'])) { $message = __('Turn Off Graph Debug Mode'); }else{ $message = __('Turn On Graph Debug Mode'); } if (!isempty_request_var('id') && $current_tab == 'preview') { print "\n
" . $message . "
\n"; }elseif (!isempty_request_var('id') && $current_tab == 'details' && (!sizeof($template))) { print "" . __('Show Item Details') . "\n\n"; }else{ print "\n\n"; } if (!isempty_request_var('id') && $current_tab == 'preview') { html_start_box(__('Aggregate Preview %s', $header_label), '100%', '', '3', 'center', ''); ?> ' alt=''>


"; html_start_box(__('Aggregate Graph %s', $header_label), '100%', '', '3', 'center', ''); /* add template propagation to the structure */ draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($struct_aggregate_graph, (isset($aginfo) ? $aginfo : array())) ) ); html_end_box(false); if (isset($template)) { draw_aggregate_graph_items_list(0, $template['graph_template_id'], $aginfo); } form_hidden_box('id', (isset($template['id']) ? $template['id'] : '0'), ''); form_hidden_box('save_component_template', '1', ''); ?> '; } /* we will show the classic representation only when we are not templating */ print "
"; ?> '> '> $struct_graph[$field_name]); $form_array[$field_name]['value'] = (isset($graphs) ? $graphs[$field_name] : ''); $form_array[$field_name]['form_id'] = (isset($graphs) ? $graphs['id'] : '0'); if (!(($use_graph_template == false) || ($graphs_template{'t_' . $field_name} == 'on'))) { $form_array[$field_name]['method'] = 'template_' . $form_array[$field_name]['method']; $form_array[$field_name]['description'] = ''; } } }else{ $form_array += array($field_name => $struct_graph[$field_name]); } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(false); } form_hidden_box('save_component_graph','1',''); form_hidden_box('save_component_input','1',''); form_hidden_box('rrdtool_version', read_config_option('rrdtool_version'), ''); form_save_button($referer, 'return', 'id'); echo '
'; ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'filter' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'matching' => array( 'filter' => FILTER_CALLBACK, 'default' => 'on', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), ); validate_store_request_vars($filters, 'sess_agraph_item'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); }else{ $rows = get_request_var('rows'); } ?>
'> > ' title=''> ' title=''>
'> '>
array('display' => __('Graph Title'), 'align' => 'left', 'sort' => 'ASC'), 'local_graph_id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC'), 'agg_graph_id' => array('display' => __('Included in Aggregate'), 'align' => 'left', 'sort' => 'ASC'), 'height' => array('display' => __('Size'), 'align' => 'left', 'sort' => 'ASC')); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), 'action=edit&tab=items&id=' . get_request_var('id'), false); if (sizeof($graph_list) > 0) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell(get_request_var('filter') != '' ? aggregate_format_text(htmlspecialchars($graph['title_cache']), get_request_var('filter')) : htmlspecialchars($graph['title_cache']), $graph['local_graph_id']); form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'text-align:right'); form_selectable_cell(($graph['agg_graph_id'] != '' ? "" . __('Yes') . "":"" . __('No') . ""), $graph['local_graph_id']); form_selectable_cell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id']); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } }else{ print '' . __('No Graphs Found') . ''; } html_end_box(false); /* put the nav bar on the bottom as well */ print $nav; /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ form_hidden_box('local_graph_id', get_request_var('id'), ''); draw_actions_dropdown($agg_item_actions); form_end(); } function aggregate_make_sql_where($sql_where, $items, $field) { if (strlen($sql_where)) { $sql_where .= ' AND ('; }else{ $sql_where = 'WHERE ('; } $indentation = 0; if (sizeof($items)) { foreach($items as $i) { $i = trim($i); while (substr($i,0,1) == '(') { $indentation++; $sql_where .= '('; $i = substr($i,1); } $split = strpos($i, ')'); if ($split !== false) { $end = trim(substr($i,$split)); $i = substr($i,0,$split); }else{ $end = ''; } if (strlen($i)) { if (strtolower($i) == 'and') { $sql_where .= ' AND '; }elseif (strtolower($i) == 'or') { $sql_where .= ' OR '; }else{ $sql_where .= $field . " LIKE '%%" . trim($i) . "%%'"; } } if ($end != '') { while (substr($end,0,1) == ')') { $indentation--; $sql_where .= ')'; $end = trim(substr($end,1)); } } } } $sql_where .= ')'; return trim($sql_where); } function aggregate_format_text($text, $filter) { $items = explode(' ', $filter); $tags = array(); foreach($items as $i) { $i = trim($i); $i = str_replace('(','',$i); $i = str_replace(')','',$i); if (strtolower($i) == 'and' || strtolower($i) == 'or') { continue; } if (substr_count($text, $i) !== false) { $tagno = rand(); $tags[$tagno] = $i; $text = str_replace($i, "<<$tagno>>", $text); } } if (sizeof($tags)) { foreach($tags as $k => $t) { $text = str_replace("<<$k>>", "" . htmlspecialchars($t) . "", $text); } } return $text; } function aggregate_graph() { global $graph_actions, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'filter' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), ); validate_store_request_vars($filters, 'sess_agraph'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); }else{ $rows = get_request_var('rows'); } ?>
'> ' title=''> ' title=''>
'>
array('display' => __('Graph Title'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The title for the Aggregate Graphs')), 'local_graph_id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database identifier for this object')), 'name' => array('display' => __('Aggregate Template'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Aggregate Template that this Aggregate Graphs is based upon')), 'height' => array('display' => __('Size'), 'align' => 'right', 'sort' => 'ASC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false, 'filter=' . get_request_var('filter')); if (sizeof($graph_list)) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ $template_name = htmlspecialchars($graph['name']); form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell(filter_value(title_trim($graph['title_cache'], read_config_option('max_title_length')), get_request_var('filter'), 'aggregate_graphs.php?action=edit&id=' . $graph['local_graph_id']), $graph['local_graph_id']); form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'text-align:right;'); form_selectable_cell((empty($graph['name']) ? '' . __('None') . '' : filter_value($template_name, get_request_var('filter'))), $graph['local_graph_id']); form_selectable_cell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id']); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } }else{ print '' . __('No Aggregate Graphs Found') .''; } html_end_box(false); if (sizeof($graph_list)) { /* put the nav bar on the bottom as well */ print $nav; } /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($graph_actions); /* remove old graphs */ purge_old_graphs(); form_end(); } function purge_old_graphs() { /* workaround to handle purged graphs */ $old_graphs = array_rekey(db_fetch_assoc('SELECT DISTINCT local_graph_id FROM aggregate_graphs_items AS pagi LEFT JOIN graph_local AS gl ON pagi.local_graph_id=gl.id WHERE gl.id IS NULL AND local_graph_id>0'), 'local_graph_id', 'local_graph_id'); if (sizeof($old_graphs)) { db_execute('DELETE FROM aggregate_graphs_items WHERE local_graph_id IN (' . implode(',', $old_graphs) . ')'); } $old_aggregates = array_rekey(db_fetch_assoc('SELECT DISTINCT local_graph_id FROM aggregate_graphs AS pag LEFT JOIN graph_local AS gl ON pag.local_graph_id=gl.id WHERE gl.id IS NULL AND local_graph_id>0'), 'local_graph_id', 'local_graph_id'); $old_agg_ids = array_rekey(db_fetch_assoc('SELECT DISTINCT pag.id FROM aggregate_graphs AS pag LEFT JOIN graph_local AS gl ON pag.local_graph_id=gl.id WHERE gl.id IS NULL'), 'id', 'id'); if (sizeof($old_aggregates)) { db_execute('DELETE FROM graph_templates_item WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); db_execute('DELETE FROM graph_templates_graph WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); db_execute('DELETE FROM aggregate_graphs WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); } if (sizeof($old_agg_ids)) { db_execute('DELETE FROM aggregate_graphs_items WHERE aggregate_graph_id IN (' . implode(',', $old_agg_ids) . ')'); } }