'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) > 0) { foreach ($trees as $tree) { $graph_actions{'tr_' . $tree['id']} = 'Place on a Tree (' . $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('SELECT id FROM aggregate_graphs WHERE local_graph_id=' . $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("UPDATE aggregate_graphs " . "SET title_format='" . $graph_title . "' " . "WHERE id=$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("SELECT * FROM aggregate_graphs WHERE id=$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('SELECT id, sequence FROM graph_templates_item WHERE local_graph_id=0 AND graph_template_id=' . $graph_template_id), 'id', array('sequence') ); /* get existing aggregate template items */ $aggregate_graph_items_old = array_rekey( db_fetch_assoc('SELECT * FROM aggregate_graphs_graph_item WHERE aggregate_graph_id='.$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_nfilter_request_var('drp_action') == '1') { /* delete */ api_aggregate_remove_multi($selected_items); }elseif (get_nfilter_request_var('drp_action') == '2') { /* migrate to template */ api_aggregate_convert_template($selected_items); }elseif (get_nfilter_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_nfilter_request_var('drp_action') == '10') { /* associate with aggregate */ api_aggregate_associate($selected_items); }elseif (get_nfilter_request_var('drp_action') == '11') { /* dis-associate with aggregate */ api_aggregate_disassociate($selected_items); }elseif (preg_match('/^tr_([0-9]+)$/', get_nfilter_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_nfilter_request_var('drp_action')}, '60%', '', '3', 'center', ''); if (isset($graph_array) && sizeof($graph_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

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

\n"; $save_html = " "; }elseif (get_nfilter_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("SELECT id, name FROM aggregate_graph_templates WHERE graph_template_id=$graph_template ORDER BY name"); 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 '" . db_fetch_cell("SELECT name FROM graph_templates WHERE id=$graph_template") . "'.

Please press 'Return' to continue.

\n"; $save_html = ""; } } }elseif (get_nfilter_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_nfilter_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_nfilter_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_nfilter_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 = '[new]'; }else{ $template_item_list = db_fetch_assoc('SELECT gti.id, gti.text_format, gti.value, gti.hard_return, gti.graph_type_id, gti.consolidation_function_id, dtr.data_source_name, 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=' . get_request_var('id') . ' ORDER BY gti.sequence'); $header_label = '[edit: ' . htmlspecialchars(get_graph_title(get_request_var('id'))) . ']'; } $graph_template_id = db_fetch_cell('SELECT graph_template_id FROM graph_local WHERE id=' . 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("Graph Items $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('SELECT * FROM graph_templates_graph WHERE local_graph_id=' . get_request_var('id')); $aginfo = db_fetch_row('SELECT * FROM aggregate_graphs WHERE local_graph_id=' . $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('SELECT * FROM aggregate_graph_templates WHERE id=' . $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_request_var('debug') == '0') { kill_session_var('graph_debug_mode'); }elseif (get_request_var('debug') == '1') { $_SESSION['graph_debug_mode'] = true; } } if (!isempty_request_var('id') && $current_tab == 'preview') { print "\n
Turn " . (isset($_SESSION['graph_debug_mode']) ? 'Off' : 'On') . " Graph Debug Mode
\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 $header_label", '100%', '', '3', 'center', ''); ?> ' alt=''>
RRDTool Command:
RRDTool Says:
"; html_start_box("Aggregate Graph $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'] = ''; } } } 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' => read_config_option('num_rows_table') ), '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 the number of rows is -1, set it to the default */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); }else{ $rows = get_request_var('rows'); } ?>
Search '> Rows >
'> '>
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 */ $template_name = ((empty($graph['name'])) ? 'None' : htmlspecialchars($graph['name'])); 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(); } /* put the nav bar on the bottom as well */ print $nav; }else{ print 'No Graphs Found'; } html_end_box(false); /* 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>>", "" . $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' => read_config_option('num_rows_table') ), '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 the number of rows is -1, set it to the default */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); }else{ $rows = get_request_var('rows'); } ?>
Search '> Template Graphs
'>
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', 'top' => 'The Aggregate Template that this Aggregate Graphs is based upon'), 'height' => array('Size', 'ASC')); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), 'filter=' . get_request_var('filter'), 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 */ $template_name = ((empty($graph['name'])) ? 'None' : htmlspecialchars($graph['name'])); form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell("" . ((get_request_var('filter') != '') ? preg_replace('/(' . preg_quote(get_request_var('filter'), '/') . ')/i', "\\1", title_trim(htmlspecialchars($graph['title_cache']), read_config_option('max_title_length'))) : title_trim(htmlspecialchars($graph['title_cache']), read_config_option('max_title_length'))) . '', $graph['local_graph_id']); form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'text-align:right;'); form_selectable_cell(((get_request_var('filter') != '') ? preg_replace('/(' . preg_quote(get_request_var('filter'), '/') . ')/i', "\\1", $template_name) : $template_name), $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(); } /* put the nav bar on the bottom as well */ print $nav; }else{ print 'No Aggregate Graphs Found'; } html_end_box(false); /* 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) . ')'); } } ?>