Файл: apwa/stk/includes/database_cleaner/database_cleaner_views.php
Строк: 589
<?php
/**
*
* @package Support Toolkit - Database Cleaner
* @version $Id$
* @copyright (c) 2009 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Class that displays all overview pages
*/
class database_cleaner_views
{
/**
* @var Array This step needs a confirmbox, this array contains all the data
*
* $_confirm_box = array(
* 'title' => 'The title',
* 'message => 'The message',
* );
*/
var $_confirm_box = array();
/**
* @var Array Array that is used to build lists of found changes
*/
var $_section_data = array();
/**
* @var database_cleaner_data The database cleaner data object
*/
var $db_cleaner = array();
/**
* @var String Some steps have a specific notice when not ran
*/
var $not_run_message = '';
/**
* @var String The message that is displayed once a step is done successfully
*/
var $success_message = '';
/**
* @var Boolean Has changes.
*/
var $_has_changes = false;
/**
* Constructor
* @param database_cleaner $db_cleaner Object of the current database cleaner class
*/
function database_cleaner_views($db_cleaner)
{
$this->db_cleaner = $db_cleaner;
}
/**
* Output the page
*/
function display()
{
global $error, $template, $user;
// Error?
if (!empty($error))
{
$error_msg = '';
foreach ($error as $e)
{
$error_msg .= user_lang($e) . '<br />';
}
$template->assign_var('ERROR_MESSAGE', $error_msg);
}
// This page has a "confirm box"
if (!empty($this->_confirm_box))
{
$template->assign_vars(array(
'L_CONFIRM_TITLE' => user_lang($this->_confirm_box['title']),
'L_CONFIRM_EXPLAIN' => user_lang($this->_confirm_box['message']),
'S_CONFIRM_BOX' => true,
));
}
// This step found some changes
elseif (!empty($this->_section_data))
{
// Output the sections
foreach($this->_section_data as $section)
{
// Its possible the section exist but there aren't any items
if (empty($section['ITEMS']))
{
continue;
}
// Create the section
$template->assign_block_vars('section', array(
'NAME' => user_lang($section['NAME']),
'TITLE' => user_lang($section['TITLE']),
));
// Output the items
foreach($section['ITEMS'] as $item)
{
$template->assign_block_vars('section.items', array(
'NAME' => user_lang($item['NAME']),
'FIELD_NAME' => user_lang($item['FIELD_NAME']),
'MISSING' => $item['MISSING'],
));
}
}
}
// Assign no changes text
if (empty($this->_section_data) && isset($user->lang['SECTION_NOT_CHANGED_TITLE'][$this->db_cleaner->step_to_action[$this->db_cleaner->step]]))
{
$template->assign_vars(array(
'NO_CHANGES_TEXT' => $user->lang['SECTION_NOT_CHANGED_EXPLAIN'][$this->db_cleaner->step_to_action[$this->db_cleaner->step]],
'NO_CHANGES_TITLE' => $user->lang['SECTION_NOT_CHANGED_TITLE'][$this->db_cleaner->step_to_action[$this->db_cleaner->step]],
));
}
// Determine the link for the next step
if (!isset($this->_u_next_step))
{
if ($this->_has_changes || !empty($this->_confirm_box))
{
$_u_next_step = append_sid(STK_INDEX, array('c' => 'support', 't' => 'database_cleaner', 'step' => $this->db_cleaner->step, 'submit' => true));
}
else
{
$_u_next_step = append_sid(STK_INDEX, array('c' => 'support', 't' => 'database_cleaner', 'step' => ($this->db_cleaner->step + 1)));
}
}
else
{
$_u_next_step = $this->_u_next_step;
}
$msg = $this->success_message;
if (empty($_REQUEST['did_run']) && $this->db_cleaner->step > 0)
{
$msg = (!empty($this->not_run_message)) ? $this->not_run_message : ((isset($user->lang['SECTION_NOT_CHANGED_EXPLAIN'][$this->db_cleaner->step_to_action[$this->db_cleaner->step - 1]])) ? $user->lang['SECTION_NOT_CHANGED_EXPLAIN'][$this->db_cleaner->step_to_action[$this->db_cleaner->step - 1]] : $this->success_message);
}
// Output some stuff we need always
$template->assign_vars(array(
'S_HIDDEN_FIELDS' => (isset($this->_hidden_fields)) ? build_hidden_fields($this->_hidden_fields) : '',
'LAST_STEP' => sizeof($this->db_cleaner->step_to_action),
'STEP' => $this->db_cleaner->step,
'SUCCESS_MESSAGE' => user_lang($msg),
// Create submit link, always set "submit" so we'll continue in the run_tool method
'U_NEXT_STEP' => $_u_next_step,
));
// Do tha page
page_header(user_lang('DATABASE_CLEANER'), false);
$template->set_filenames(array(
'body' => 'tools/database_cleaner.html',
));
page_footer();
}
/**
* Reset bots?
*/
function bots()
{
$this->_confirm_box = array(
'title' => 'RESET_BOTS',
'message' => 'RESET_BOTS_EXPLAIN',
);
// Only success message when the modules have been reset
$this->success_message = 'RESET_MODULE_SUCCESS';
$this->not_run_message = 'RESET_MODULES_SKIP';
}
/**
* Validate all columns in the database
*/
function columns()
{
// Time to start going through the database and listing any extra/missing fields
$last_output_table = '';
foreach ($this->db_cleaner->data->tables as $table_name => $data)
{
// We shouldn't mess with profile fields here. Users probably will not know what this table does or what would happen if they remove fields added to it.
if ($table_name == PROFILE_FIELDS_DATA_TABLE)
{
continue;
}
$existing_columns = get_columns($table_name);
if ($existing_columns === false)
{
// Table doesn't exist, don't handle here.
continue;
}
$columns = array_unique(array_merge(array_keys($data['COLUMNS']), $existing_columns));
sort($columns);
foreach ($columns as $column)
{
if ((!isset($data['COLUMNS'][$column]) && in_array($column, $existing_columns)) || (isset($data['COLUMNS'][$column]) && !in_array($column, $existing_columns)))
{
// Output the table block if it's not been done yet
if ($last_output_table != $table_name)
{
$last_output_table = $table_name;
$this->_section_data[$table_name] = array(
'NAME' => $table_name,
'TITLE' => 'COLUMNS',
);
}
// Add the data
$this->_section_data[$table_name]['ITEMS'][] = array(
'NAME' => $column,
'FIELD_NAME' => $table_name . '_' . $column,
'MISSING' => (!in_array($column, $existing_columns)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
}
}
$this->success_message = 'DATABASE_TABLES_SUCCESS';
}
/**
* Validate all entries in the config table
*/
function config()
{
// display extra config variables and let them check/uncheck the ones they want to add/remove
$this->_section_data['config'] = array(
'NAME' => 'CONFIG_SETTINGS',
'TITLE' => 'ROWS',
);
$config_rows = $existing_config = array();
get_config_rows($this->db_cleaner->data->config, $config_rows, $existing_config);
foreach ($config_rows as $name)
{
// Skip ones that are in the default install and are in the existing config, or if it was removed by a later update
if ((isset($this->db_cleaner->data->config[$name]) && in_array($name, $existing_config)) || in_array($name, $this->db_cleaner->data->removed_config))
{
continue;
}
$this->_section_data['config']['ITEMS'][] = array(
'NAME' => $name,
'FIELD_NAME' => $name,
'MISSING' => (!in_array($name, $existing_config)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
$this->success_message = 'DATABASE_COLUMNS_SUCCESS';
}
/**
* Validate the extension groups
*/
function extension_groups()
{
// display extra config variables and let them check/uncheck the ones they want to add/remove
$this->_section_data['extension_groups'] = array(
'NAME' => 'EXTENSION_GROUPS_SETTINGS',
'TITLE' => 'ROWS',
);
$extension_groups_rows = $existing_extension_groups = array();
get_extension_groups_rows($this->db_cleaner->data->extension_groups, $extension_groups_rows, $existing_extension_groups);
foreach ($extension_groups_rows as $name)
{
// Skip ones that are in the default install and are in the existing config
if (isset($this->db_cleaner->data->extension_groups[$name]) && in_array($name, $existing_extension_groups))
{
continue;
}
$this->_section_data['extension_groups']['ITEMS'][] = array(
'NAME' => $name,
'FIELD_NAME' => $name,
'MISSING' => (!in_array($name, $existing_extension_groups)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
$this->success_message = 'CONFIG_UPDATE_SUCCESS';
}
/**
* Validate the extensions
*/
function extensions()
{
global $user;
$user->add_lang('acp/attachments');
// Build the output
$last_extension_group = '';
foreach ($this->db_cleaner->data->extensions as $group => $data)
{
$group_ids = array();
$existing_extensions = get_extensions($group, $group_ids);
$extensions = array_unique(array_merge($data, $existing_extensions));
sort($extensions);
foreach ($extensions as $extension)
{
if ((!in_array($extension, $data) && in_array($extension, $existing_extensions)) || (in_array($extension, $data) && !in_array($extension, $existing_extensions)))
{
// Output the table block if it's not been done yet
if ($last_extension_group != $group)
{
$last_extension_group = $group;
$this->_section_data[$group] = array(
'NAME' => user_lang($group),
'TITLE' => 'COLUMNS',
);
}
// Add the data
$this->_section_data[$group]['ITEMS'][] = array(
'NAME' => $extension,
'FIELD_NAME' => $group . '_' . $extension,
'MISSING' => (!in_array($extension, $existing_extensions)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
}
}
$this->success_message = 'EXTENSION_GROUPS_SUCCESS';
}
/**
* Display the last step
*/
function final_step()
{
global $template;
// Only success message when the bots have been reset
$this->success_message = 'RESET_REPORT_REASONS_SUCCESS';
$this->not_run_message = 'RESET_REPORT_REASONS_SKIP';
$this->_has_changes = true;
}
/**
* Validate all system groups
*/
function groups()
{
global $template, $user;
// Display the system groups that are missing or aren't from a vanilla installation
$this->_section_data['groups'] = array(
'NAME' => 'ACP_GROUPS_MANAGEMENT',
'TITLE' => 'ROWS',
);
$group_rows = $existing_groups = array();
get_group_rows($this->db_cleaner->data->groups, $group_rows, $existing_groups);
foreach ($group_rows as $name)
{
// Skip ones that are in the default install and are in the existing permissions
if (isset($this->db_cleaner->data->groups[$name]) && in_array($name, $existing_groups))
{
continue;
}
$this->_section_data['config']['ITEMS'][] = array(
'NAME' => $name,
'FIELD_NAME' => $name,
'MISSING' => (!in_array($name, $existing_groups)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
$this->success_message = 'PERMISSION_UPDATE_SUCCESS';
}
/**
* Display a quick intro here and make sure they know what they are doing...
*/
function introduction()
{
global $template, $user;
$template->assign_vars(array(
'SUCCESS_TITLE' => $user->lang['DATABASE_CLEANER'],
'ERROR_TITLE' => ' ',
'ERROR_MESSAGE' => $user->lang['DATABASE_CLEANER_WARNING'],
));
$this->success_message = 'DATABASE_CLEANER_WELCOME';
}
/**
* Reset modules?
*/
function modules()
{
$this->_confirm_box = array(
'title' => 'RESET_MODULES',
'message' => 'RESET_MODULES_EXPLAIN',
);
$this->success_message = 'DATABASE_ROLE_DATA_SUCCESS';
}
/**
* Validate all permissions
*/
function permissions()
{
$this->_section_data['permissions'] = array(
'NAME' => 'PERMISSION_SETTINGS',
'TITLE' => 'ROWS',
);
$permission_rows = $existing_permissions = array();
get_permission_rows($this->db_cleaner->data->acl_options, $permission_rows, $existing_permissions);
foreach ($permission_rows as $name)
{
// Skip ones that are in the default install and are in the existing permissions
if (isset($this->db_cleaner->data->acl_options[$name]) && in_array($name, $existing_permissions))
{
continue;
}
$this->_section_data['permissions']['ITEMS'][] = array(
'NAME' => $name,
'FIELD_NAME' => $name,
'MISSING' => (!in_array($name, $existing_permissions)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
$this->success_message = 'EXTENSIONS_SUCCESS';
}
/**
* Reset report reasons?
*/
function report_reasons()
{
$this->_confirm_box = array(
'title' => 'RESET_REPORT_REASONS',
'message' => 'RESET_REPORT_REASONS_EXPLAIN',
);
// Only success message when the bots have been reset
$this->success_message = 'RESET_BOT_SUCCESS';
$this->not_run_message = 'RESET_BOTS_SKIP';
}
/**
* Reset system roles?
*/
function role_data()
{
$this->_confirm_box = array(
'title' => 'RESET_ROLE_DATA',
'message' => 'RESET_ROLE_DATA_EXPLAIN',
);
$this->success_message = 'DATABASE_ROLES_SUCCESS';
}
/**
* Validate the `acl_roles` table
*/
function roles()
{
// display extra config variables and let them check/uncheck the ones they want to add/remove
$this->_section_data['roles'] = array(
'NAME' => 'ROLE_SETTINGS',
'TITLE' => 'ROWS',
);
$role_rows = $existing_roles = array();
get_role_rows($this->db_cleaner->data->acl_roles, $role_rows, $existing_roles);
foreach ($role_rows as $name)
{
// Skip ones that are in the default install and are in the existing config
if (isset($this->db_cleaner->data->acl_roles[$name]) && in_array($name, $existing_roles))
{
continue;
}
$this->_section_data['roles']['ITEMS'][] = array(
'NAME' => $name,
'FIELD_NAME' => $name,
'MISSING' => (!in_array($name, $existing_roles)) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
$this->success_message = 'SYSTEM_GROUP_UPDATE_SUCCESS';
}
/**
* Validate all tables in the database
*/
function tables()
{
global $table_prefix;
if (!isset($_REQUEST['tables_confirm']))
{
$found_tables = get_phpbb_tables();
$req_tables = $this->db_cleaner->data->tables;
$tables = array_unique(array_merge(array_keys($req_tables), $found_tables));
sort($tables);
$this->_section_data['tables'] = array(
'NAME' => 'DATABASE_TABLES',
'TITLE' => 'DATABASE_TABLES',
);
foreach ($tables as $table)
{
// Table was added or removed
if (!isset($req_tables[$table]) && in_array($table, $found_tables) || isset($req_tables[$table]) && !in_array($table, $found_tables))
{
$this->_section_data['tables']['ITEMS'][] = array(
'NAME' => $table,
'FIELD_NAME' => $table,
'MISSING' => isset($req_tables[$table]) ? true : false,
);
if ($this->_has_changes === false)
{
$this->_has_changes = true;
}
}
}
// A bit nasty but the only real work around at this moment
if (empty($table_prefix) && $this->_has_changes)
{
$this->_u_next_step = append_sid(STK_INDEX, array('c' => 'support', 't' => 'database_cleaner', 'step' => $this->db_cleaner->step, 'submit' => false, 'tables_confirm' => true));
}
$this->success_message = 'BOARD_DISABLE_SUCCESS';
}
else
{
// I'n not sure why request_var doesn't work here so we'll do it a bit different
$tables = array();
foreach ($_REQUEST['items'] as $table => $value)
{
set_var($table, $table, 'string', true);
set_var($value, $value, 'string', true);
$tables["items[{$table}]"] = $value;
}
$this->_hidden_fields = $tables;
$this->_confirm_box = array(
'title' => 'EMPTY_PREFIX',
'message' => 'EMPTY_PREFIX_CONFIRM',
);
}
}
}