'BoardReport', 'board_perms' => 'BoardPermissionsReport', 'member_groups' => 'MemberGroupsReport', 'group_perms' => 'GroupPermissionsReport', 'staff' => 'StaffReport', ); $is_first = 0; foreach ($context['report_types'] as $k => $temp) $context['report_types'][$k] = array( 'id' => $k, 'title' => isset($txt['gr_type_' . $k]) ? $txt['gr_type_' . $k] : $type['id'], 'description' => isset($txt['gr_type_desc_' . $k]) ? $txt['gr_type_desc_' . $k] : null, 'function' => $temp, 'is_first' => $is_first++ == 0, ); // If they haven't choosen a report type which is valid, send them off to the report type chooser! if (empty($_REQUEST['rt']) || !isset($context['report_types'][$_REQUEST['rt']])) { $context['sub_template'] = 'report_type'; return; } $context['report_type'] = $_REQUEST['rt']; // What are valid templates for showing reports? $reportTemplates = array( 'main' => array( 'layers' => null, ), 'print' => array( 'layers' => array('print'), ), ); // Specific template? Use that instead of main! if (isset($_REQUEST['st']) && isset($reportTemplates[$_REQUEST['st']])) { $context['sub_template'] = $_REQUEST['st']; // Are we disabling the other layers - print friendly for example? if ($reportTemplates[$_REQUEST['st']]['layers'] !== null) $context['template_layers'] = $reportTemplates[$_REQUEST['st']]['layers']; } // Make the page title more descriptive. $context['page_title'] .= ' - ' . (isset($txt['gr_type_' . $context['report_type']]) ? $txt['gr_type_' . $context['report_type']] : $context['report_type']); // Now generate the data. $context['report_types'][$context['report_type']]['function'](); // Finish the tables before exiting - this is to help the templates a little more. finishTables(); } // Standard report about what settings the boards have. function BoardReport() { global $context, $db_prefix, $txt; // Get every moderator. $request = db_query(" SELECT mods.ID_BOARD, mods.ID_MEMBER, mem.realName FROM ({$db_prefix}moderators AS mods, {$db_prefix}members AS mem) WHERE mem.ID_MEMBER = mods.ID_MEMBER", __FILE__, __LINE__); $moderators = array(); while ($row = mysql_fetch_assoc($request)) $moderators[$row['ID_BOARD']][] = $row['realName']; mysql_free_result($request); // Get all the possible membergroups! $request = db_query(" SELECT ID_GROUP, groupName, onlineColor FROM {$db_prefix}membergroups", __FILE__, __LINE__); $groups = array(-1 => $txt[28], 0 => $txt['full_member']); while ($row = mysql_fetch_assoc($request)) $groups[$row['ID_GROUP']] = empty($row['onlineColor']) ? $row['groupName'] : '' . $row['groupName'] . ''; mysql_free_result($request); // All the fields we'll show. $boardSettings = array( 'category' => $txt['board_category'], 'parent' => $txt['board_parent'], 'num_topics' => $txt['board_num_topics'], 'num_posts' => $txt['board_num_posts'], 'count_posts' => $txt['board_count_posts'], 'theme' => $txt['board_theme'], 'override_theme' => $txt['board_override_theme'], 'moderators' => $txt['board_moderators'], 'groups' => $txt['board_groups'], ); // Do it in columns, it's just easier. setKeys('cols'); // Go through each board! $request = db_query(" SELECT b.ID_BOARD, b.name, b.numPosts, b.numTopics, b.countPosts, b.memberGroups, b.override_theme, b.permission_mode, c.name AS catName, IFNULL(par.name, '$txt[none]') AS parentName, IFNULL(th.value, '$txt[none]') AS themeName FROM {$db_prefix}boards AS b LEFT JOIN {$db_prefix}categories AS c ON (c.ID_CAT = b.ID_CAT) LEFT JOIN {$db_prefix}boards AS par ON (par.ID_BOARD = b.ID_PARENT) LEFT JOIN {$db_prefix}themes AS th ON (th.ID_THEME = b.ID_THEME AND variable = 'name')", __FILE__, __LINE__); $boards = array(0 => array('name' => $txt['global_boards'], 'local_perms' => 1)); while ($row = mysql_fetch_assoc($request)) { // Each board has it's own table. newTable($row['name'], '', 'left', 'auto', 'left', 200, 'left'); // First off, add in the side key. addData($boardSettings); // Create the main data array. $boardData = array( 'category' => $row['catName'], 'parent' => $row['parentName'], 'num_posts' => $row['numPosts'], 'num_topics' => $row['numTopics'], 'count_posts' => empty($row['countPosts']) ? $txt['yes'] : $txt['no'], 'theme' => $row['themeName'], 'override_theme' => $row['override_theme'] ? $txt['yes'] : $txt['no'], 'moderators' => empty($moderators[$row['ID_BOARD']]) ? $txt['none'] : implode(', ', $moderators[$row['ID_BOARD']]), ); // Work out the membergroups who can access it. $allowedGroups = explode(',', $row['memberGroups']); foreach ($allowedGroups as $key => $group) { if (isset($groups[$group])) $allowedGroups[$key] = $groups[$group]; else unset($allowedGroups[$key]); } $boardData['groups'] = implode(', ', $allowedGroups); // Next add the main data. addData($boardData); } mysql_free_result($request); } // Generate a report on the current permissions by board and membergroup. function BoardPermissionsReport() { global $context, $db_prefix, $txt, $modSettings; if (isset($_REQUEST['boards'])) { if (!is_array($_REQUEST['boards'])) $_REQUEST['boards'] = explode(',', $_REQUEST['boards']); foreach ($_REQUEST['boards'] as $k => $dummy) $_REQUEST['boards'][$k] = (int) $dummy; $board_clause = 'ID_BOARD IN (' . implode(', ', $_REQUEST['boards']) . ')'; } else $board_clause = '1'; if (isset($_REQUEST['groups'])) { if (!is_array($_REQUEST['groups'])) $_REQUEST['groups'] = explode(',', $_REQUEST['groups']); foreach ($_REQUEST['groups'] as $k => $dummy) $_REQUEST['groups'][$k] = (int) $dummy; $group_clause = 'ID_GROUP IN (' . implode(', ', $_REQUEST['groups']) . ')'; } else $group_clause = '1'; // Fetch all the board names. $request = db_query(" SELECT ID_BOARD, name, permission_mode FROM {$db_prefix}boards WHERE $board_clause", __FILE__, __LINE__); $boards = array(0 => array('name' => $txt['global_boards'], 'local_perms' => 1)); while ($row = mysql_fetch_assoc($request)) $boards[$row['ID_BOARD']] = array( 'name' => $row['name'], 'local_perms' => !empty($modSettings['permission_enable_by_board']) && $row['permission_mode'] == 1, 'permission_mode' => empty($modSettings['permission_enable_by_board']) ? (empty($row['permission_mode']) ? 'normal' : ($row['permission_mode'] == 2 ? 'no_polls' : ($row['permission_mode'] == 3 ? 'reply_only' : 'read_only'))) : 'normal', ); mysql_free_result($request); // Get all the possible membergroups, except for admin! $request = db_query(" SELECT ID_GROUP, groupName FROM {$db_prefix}membergroups WHERE $group_clause AND ID_GROUP != 1" . (empty($modSettings['permission_enable_postgroups']) ? " AND minPosts = -1" : '') . " ORDER BY minPosts, IF(ID_GROUP < 4, ID_GROUP, 4), groupName", __FILE__, __LINE__); if (!isset($_REQUEST['groups']) || in_array(-1, $_REQUEST['groups']) || in_array(0, $_REQUEST['groups'])) $memberGroups = array('col' => '', -1 => $txt['membergroups_guests'], 0 => $txt['membergroups_members']); else $memberGroups = array('col' => ''); while ($row = mysql_fetch_assoc($request)) $memberGroups[$row['ID_GROUP']] = $row['groupName']; mysql_free_result($request); // Make sure that every group is represented - plus in rows! setKeys('rows', $memberGroups); // Cache every permission setting, to make sure we don't miss any allows. $permissions = array(); $board_permissions = array(); $request = db_query(" SELECT ID_BOARD, ID_GROUP, addDeny, permission FROM {$db_prefix}board_permissions WHERE $board_clause AND $group_clause" . (empty($modSettings['permission_enable_deny']) ? " AND addDeny = 1" : '') . " ORDER BY ID_BOARD, permission", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { $board_permissions[$row['ID_BOARD']][$row['ID_GROUP']][$row['permission']] = $row['addDeny']; // Make sure we get every permission. if (!isset($permissions[$row['permission']])) { // This will be reused on other boards. $permissions[$row['permission']] = array( 'title' => isset($txt['board_perms_name_' . $row['permission']]) ? $txt['board_perms_name_' . $row['permission']] : $row['permission'], ); } } mysql_free_result($request); // Now cycle through the board permissions array... lots to do ;) foreach ($board_permissions as $board => $groups) { // If it's not using local permissions don't show any! if ($board != 0 && !$boards[$board]['local_perms']) continue; // Create the table for this board first. newTable($boards[$board]['name'], 'x', 'all', 100, 'center', 200, 'left'); // Add the header row - shows all the membergroups. addData($memberGroups); // Add the seperator. addSeperator($txt['board_perms_permission']); // Here cycle through all the detected permissions. foreach ($permissions as $ID_PERM => $perm_info) { // Is this identical to the global? $identicalGlobal = $board == 0 ? false : true; // Default data for this row. $curData = array('col' => $perm_info['title']); // Now cycle each membergroup in this set of permissions. foreach ($memberGroups as $ID_GROUP => $name) { // Don't overwrite the key column! if ($ID_GROUP === 'col') continue; $group_permissions = isset($groups[$ID_GROUP]) ? $groups[$ID_GROUP] : array(); // Do we have any data for this group? if (isset($group_permissions[$ID_PERM])) { // Set the data for this group to be the local permission. $curData[$ID_GROUP] = $group_permissions[$ID_PERM]; // If it's different than the global - then this permission needs to be shown in diff view. if (!isset($board_permissions[0][$ID_GROUP][$ID_PERM]) || $board_permissions[0][$ID_GROUP][$ID_PERM] != $group_permissions[$ID_PERM]) $identicalGlobal = false; } // Otherwise means it's set to disallow.. else { $curData[$ID_GROUP] = 'x'; if (isset($board_permissions[0][$ID_GROUP][$ID_PERM]) && $board_permissions[0][$ID_GROUP][$ID_PERM] != 'x') $identicalGlobal = false; } // Now actually make the data for the group look right. if (empty($curData[$ID_GROUP])) $curData[$ID_GROUP] = '' . $txt['board_perms_deny'] . ''; elseif ($curData[$ID_GROUP] == 1) $curData[$ID_GROUP] = '' . $txt['board_perms_allow'] . ''; else $curData[$ID_GROUP] = 'x'; // Embolden those permissions different from global (makes it a lot easier!) if (@$board_permissions[0][$ID_GROUP][$ID_PERM] != @$group_permissions[$ID_PERM]) $curData[$ID_GROUP] = '' . $curData[$ID_GROUP] . ''; } // Now add the data for this permission. //!!! Make an option for changing the view here! if (!$identicalGlobal || !isset($_REQUEST['show_differences'])) addData($curData); } } // We'll do a little bit of seperate stuff for boards using "simple" local permissions. setKeys('rows'); foreach ($boards as $id => $board) { if ($id != 0 && !empty($board['permission_mode']) && $board['permission_mode'] != 'normal') { newTable($board['name'], 'x', 'top'); // Just add a description of the permission type. addData(array('' . $txt['board_perms_group_' . $board['permission_mode']] . '')); } } } // Show what the membergroups are made of. function MemberGroupsReport() { global $context, $db_prefix, $txt, $settings, $modSettings; // Fetch all the board names. $request = db_query(" SELECT ID_BOARD, name, memberGroups, permission_mode FROM {$db_prefix}boards", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) $boards[$row['ID_BOARD']] = array( 'id' => $row['ID_BOARD'], 'name' => $row['name'], 'local_perms' => !empty($modSettings['permission_enable_by_board']) && $row['permission_mode'] == 1, 'permission_mode' => empty($modSettings['permission_enable_by_board']) ? (empty($row['permission_mode']) ? $txt['permission_mode_normal'] : ($row['permission_mode'] == 2 ? $txt['permission_mode_no_polls'] : ($row['permission_mode'] == 3 ? $txt['permission_mode_reply_only'] : $txt['permission_mode_read_only']))) : $txt['permission_mode_normal'], 'groups' => array_merge(array(1,3), explode(',', $row['memberGroups'])), ); mysql_free_result($request); // Standard settings. $mgSettings = array( 'name' => '', '#sep#1' => $txt['member_group_settings'], 'color' => $txt['member_group_color'], 'minPosts' => $txt['member_group_minPosts'], 'maxMessages' => $txt['member_group_maxMessages'], 'stars' => $txt['member_group_stars'], '#sep#2' => $txt['member_group_access'], ); // Add on the boards! foreach ($boards as $board) $mgSettings['board_' . $board['id']] = $board['name']; // Add all the membergroup settings, plus we'll be adding in columns! setKeys('cols', $mgSettings); // Only one table this time! newTable($txt['gr_type_member_groups'], '-', 'all', 100, 'center', 200, 'left'); // Get the shaded column in. addData($mgSettings); // Now start cycling the membergroups! $request = db_query(" SELECT mg.ID_GROUP, mg.groupName, mg.onlineColor, mg.minPosts, mg.maxMessages, mg.stars" . (empty($modSettings['permission_enable_by_board']) ? ", IF(bp.permission IS NOT NULL OR mg.ID_GROUP = 1, 1, 0) AS can_moderate" : '') . " FROM {$db_prefix}membergroups AS mg" . (empty($modSettings['permission_enable_by_board']) ? " LEFT JOIN {$db_prefix}board_permissions AS bp ON (bp.ID_GROUP = mg.ID_GROUP AND bp.ID_BOARD = 0 AND bp.permission = 'moderate_board')" : '') . " ORDER BY mg.minPosts, IF(mg.ID_GROUP < 4, mg.ID_GROUP, 4), mg.groupName", __FILE__, __LINE__); // Cache them so we get regular members too. $rows = array( array( 'ID_GROUP' => -1, 'groupName' => $txt['membergroups_guests'], 'onlineColor' => '-', 'minPosts' => -1, 'maxMessages' => null, 'stars' => '' ), array( 'ID_GROUP' => 0, 'groupName' => $txt['membergroups_members'], 'onlineColor' => '-', 'minPosts' => -1, 'maxMessages' => null, 'stars' => '' ), ); while ($row = mysql_fetch_assoc($request)) $rows[] = $row; mysql_free_result($request); foreach ($rows as $row) { $row['stars'] = explode('#', $row['stars']); $group = array( 'name' => $row['groupName'], 'color' => empty($row['onlineColor']) ? '-' : '' . $row['onlineColor'] . '', 'minPosts' => $row['minPosts'] == -1 ? 'N/A' : $row['minPosts'], 'maxMessages' => $row['maxMessages'], 'stars' => !empty($row['stars'][0]) && !empty($row['stars'][1]) ? str_repeat('*', $row['stars'][0]) : '', ); // Board permissions. foreach ($boards as $board) $group['board_' . $board['id']] = in_array($row['ID_GROUP'], $board['groups']) ? '' . (empty($modSettings['permission_enable_by_board']) ? (empty($row['can_moderate']) ? $board['permission_mode'] : $txt['permission_mode_normal']) : $txt['board_perms_allow']) . '' : 'x'; addData($group); } } // Show the large variety of group permissions assigned to each membergroup. function GroupPermissionsReport() { global $context, $db_prefix, $txt, $modSettings; if (isset($_REQUEST['groups'])) { if (!is_array($_REQUEST['groups'])) $_REQUEST['groups'] = explode(',', $_REQUEST['groups']); foreach ($_REQUEST['groups'] as $k => $dummy) $_REQUEST['groups'][$k] = (int) $dummy; $_REQUEST['groups'] = array_diff($_REQUEST['groups'], array(3)); $clause = 'ID_GROUP IN (' . implode(', ', $_REQUEST['groups']) . ')'; } else $clause = 'ID_GROUP != 3'; // Get all the possible membergroups, except for admin! $request = db_query(" SELECT ID_GROUP, groupName FROM {$db_prefix}membergroups WHERE $clause AND ID_GROUP != 1" . (empty($modSettings['permission_enable_postgroups']) ? " AND minPosts = -1" : '') . " ORDER BY minPosts, IF(ID_GROUP < 4, ID_GROUP, 4), groupName", __FILE__, __LINE__); if (!isset($_REQUEST['groups']) || in_array(-1, $_REQUEST['groups']) || in_array(0, $_REQUEST['groups'])) $groups = array('col' => '', -1 => $txt['membergroups_guests'], 0 => $txt['membergroups_members']); else $groups = array('col' => ''); while ($row = mysql_fetch_assoc($request)) $groups[$row['ID_GROUP']] = $row['groupName']; mysql_free_result($request); // Make sure that every group is represented! setKeys('rows', $groups); // Create the table first. newTable($txt['gr_type_group_perms'], '-', 'all', 100, 'center', 200, 'left'); // Show all the groups addData($groups); // Add a seperator addSeperator($txt['board_perms_permission']); // Now the big permission fetch! $request = db_query(" SELECT ID_GROUP, addDeny, permission FROM {$db_prefix}permissions WHERE $clause" . (empty($modSettings['permission_enable_deny']) ? " AND addDeny = 1" : '') . " ORDER BY permission", __FILE__, __LINE__); $lastPermission = null; while ($row = mysql_fetch_assoc($request)) { // If this is a new permission flush the last row. if ($row['permission'] != $lastPermission) { // Send the data! if ($lastPermission !== null) addData($curData); // Add the permission name in the left column. $curData = array('col' => isset($txt['group_perms_name_' . $row['permission']]) ? $txt['group_perms_name_' . $row['permission']] : $row['permission']); $lastPermission = $row['permission']; } // Good stuff - add the permission to the list! if ($row['addDeny']) $curData[$row['ID_GROUP']] = '' . $txt['board_perms_allow'] . ''; else $curData[$row['ID_GROUP']] = '' . $txt['board_perms_deny'] . ''; } mysql_free_result($request); // Flush the last data! addData($curData); } // Report for showing all the forum staff members - quite a feat! function StaffReport() { global $sourcedir, $context, $db_prefix, $txt; require_once($sourcedir . '/Subs-Members.php'); // Fetch all the board names. $request = db_query(" SELECT ID_BOARD, name FROM {$db_prefix}boards", __FILE__, __LINE__); $boards = array(); while ($row = mysql_fetch_assoc($request)) $boards[$row['ID_BOARD']] = $row['name']; mysql_free_result($request); // Get every moderator. $request = db_query(" SELECT mods.ID_BOARD, mods.ID_MEMBER FROM {$db_prefix}moderators AS mods", __FILE__, __LINE__); $moderators = array(); $local_mods = array(); while ($row = mysql_fetch_assoc($request)) { $moderators[$row['ID_MEMBER']][] = $row['ID_BOARD']; $local_mods[$row['ID_MEMBER']] = $row['ID_MEMBER']; } mysql_free_result($request); // Get a list of global moderators (i.e. members with moderation powers). $global_mods = array_intersect(membersAllowedTo('moderate_board', 0), membersAllowedTo('post_new', 0), membersAllowedTo('remove_any', 0), membersAllowedTo('modify_any', 0)); // How about anyone else who is special? $allStaff = array_merge(membersAllowedTo('admin_forum'), membersAllowedTo('manage_membergroups'), membersAllowedTo('manage_permissions'), $local_mods, $global_mods); // Make sure everyone is there once - no admin less important than any other! $allStaff = array_unique($allStaff); // This is a bit of a cop out - but we're protecting their forum, really! if (count($allStaff) > 300) fatal_lang_error('report_error_too_many_staff'); // Get all the possible membergroups! $request = db_query(" SELECT ID_GROUP, groupName, onlineColor FROM {$db_prefix}membergroups", __FILE__, __LINE__); $groups = array(0 => $txt['full_member']); while ($row = mysql_fetch_assoc($request)) $groups[$row['ID_GROUP']] = empty($row['onlineColor']) ? $row['groupName'] : '' . $row['groupName'] . ''; mysql_free_result($request); // All the fields we'll show. $staffSettings = array( 'position' => $txt['report_staff_position'], 'moderates' => $txt['report_staff_moderates'], 'posts' => $txt['report_staff_posts'], 'last_login' => $txt['report_staff_last_login'], ); // Do it in columns, it's just easier. setKeys('cols'); // Get each member! $request = db_query(" SELECT ID_MEMBER, realName, ID_GROUP, posts, lastLogin FROM {$db_prefix}members WHERE ID_MEMBER IN (" . implode(',', $allStaff) . ") ORDER BY realName", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { // Each member gets their own table!. newTable($row['realName'], '', 'left', 'auto', 'left', 200, 'center'); // First off, add in the side key. addData($staffSettings); // Create the main data array. $staffData = array( 'position' => isset($groups[$row['ID_GROUP']]) ? $groups[$row['ID_GROUP']] : $groups[0], 'posts' => $row['posts'], 'last_login' => timeformat($row['lastLogin']), 'moderates' => array(), ); // What do they moderate? if (in_array($row['ID_MEMBER'], $global_mods)) $staffData['moderates'] = '' . $txt['report_staff_all_boards'] . ''; elseif (isset($moderators[$row['ID_MEMBER']])) { // Get the names foreach ($moderators[$row['ID_MEMBER']] as $board) if (isset($boards[$board])) $staffData['moderates'][] = $boards[$board]; $staffData['moderates'] = implode(', ', $staffData['moderates']); } else $staffData['moderates'] = '' . $txt['report_staff_no_boards'] . ''; // Next add the main data. addData($staffData); } mysql_free_result($request); } // This function creates a new table of data, most functions will only use it once. function newTable($title = '', $defaultValue = '', $shading = 'all', $width_normal = 'auto', $align_normal = 'center', $width_shaded = 'auto', $align_shaded = 'auto') { global $context; // Set the table count if needed. if (empty($context['table_count'])) $context['table_count'] = 0; // Create the table! $context['tables'][$context['table_count']] = array( 'title' => $title, 'default_value' => $defaultValue, 'shading' => array( 'left' => $shading == 'all' || $shading == 'left', 'top' => $shading == 'all' || $shading == 'top', ), 'width' => array( 'normal' => $width_normal, 'shaded' => $width_shaded, ), 'align' => array( 'normal' => $align_normal, 'shaded' => $align_shaded, ), 'data' => array(), ); $context['current_table'] = $context['table_count']; // Increment the count... $context['table_count']++; } // Add an extra slice of data to the table function addData($inc_data, $custom_table = null) { global $context; // No tables? Create one even though we are probably already in a bad state! if (empty($context['table_count'])) newTable(); // Specific table? if ($custom_table !== null && !isset($context['tables'][$custom_table])) return false; elseif ($custom_table !== null) $table = $custom_table; else $table = $context['current_table']; // If we have keys, sanitise the data... if (!empty($context['keys'])) { // Basically, check every key exists! foreach ($context['keys'] as $key => $dummy) $data[$key] = array( 'value' => empty($inc_data[$key]) ? $context['tables'][$table]['default_value'] : $inc_data[$key], // Special "hack" the adding seperators when doing data by column. 'seperator' => substr($key, 0, 5) == '#sep#' ? true : false, ); } else { $data = $inc_data; foreach ($data as $key => $value) $data[$key] = array( 'value' => $value, 'seperator' => substr($key, 0, 5) == '#sep#' ? true : false, ); } // Is it by row? if (empty($context['key_method']) || $context['key_method'] == 'rows') { // Add the data! $context['tables'][$table]['data'][] = $data; } // Otherwise, tricky! else { foreach ($data as $key => $item) $context['tables'][$table]['data'][$key][] = $item; } } // Add a seperator row, only really used when adding data by rows. function addSeperator($title = '', $custom_table = null) { global $context; // No tables - return? if (empty($context['table_count'])) return; // Specific table? if ($custom_table !== null && !isset($context['tables'][$table])) return false; elseif ($custom_table !== null) $table = $custom_table; else $table = $context['current_table']; // Plumb in the seperator $context['tables'][$table]['data'][] = array(0 => array( 'seperator' => true, 'value' => $title )); } // This does the necessary count of table data before displaying them. function finishTables() { global $context; if (empty($context['tables'])) return; // Loop through each table counting up some basic values, to help with the templating. foreach ($context['tables'] as $id => $table) { $context['tables'][$id]['id'] = $id; $context['tables'][$id]['row_count'] = count($table['data']); $curElement = current($table['data']); $context['tables'][$id]['column_count'] = count($curElement); // Work out the rough width - for templates like the print template. Without this we might get funny tables. if ($table['shading']['left'] && $table['width']['shaded'] != 'auto' && $table['width']['normal'] != 'auto') $context['tables'][$id]['max_width'] = $table['width']['shaded'] + ($context['tables'][$id]['column_count'] - 1) * $table['width']['normal']; elseif ($table['width']['normal'] != 'auto') $context['tables'][$id]['max_width'] = $context['tables'][$id]['column_count'] * $table['width']['normal']; else $context['tables'][$id]['max_width'] = 'auto'; } } // Set the keys in use by the tables - these ensure entries MUST exist if the data isn't sent. function setKeys($method = 'rows', $keys = array(), $reverse = false) { global $context; // Do we want to use the keys of the keys as the keys? :P if ($reverse) $context['keys'] = array_flip($keys); else $context['keys'] = $keys; // Rows or columns? $context['key_method'] = $method == 'rows' ? 'rows' : 'cols'; } ?>