'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';
}
?>