Файл: apwa/stk/tools/main/srt_generator.php
Строк: 531
<?php
/**
*
* @package Support Toolkit - Support Request Generator
* @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 srt_generator
{
/**
* @var Integer The current step
* @access public
*/
var $step = 0;
/**
* The data array contains all data required to build the SRT questions,
* for each question the following keys can be used
* <code>
* 'name' => Required, the identifier that is used for everything
* (field names/langauge entries/etc)
* 'type' => Required, the type of the input field. (dropdown ||
* text || texteara || boolean)
* 'options' => Only used when 'type' = dropdown. If set these
* values are used as options for the dropdown box, if
* not set the options will be red from the language files.
* 'p_callback' => php callback. This function/method is called before
* the question is added to the template. If the function
* returns everything else than the boolean `false`
* that value will be used as answer. If it returns
* false (strict check) the question shall be displayed.
* 'hide' => This question is only asked but will not be used
* when compiling the SRT.
* 'depends' => This question is only asked/handled if the given question
* was answered with "true", this currently only supports
* a boolean check.
* </code>
*
* @var Array The data that is used to generate the questions in the template
* The array is prefilled with the main data which is filtered later
* @access private
*/
var $_data = array();
/**
* This method is always called, so we "abuse"
* it for this tool to setup some stuff we need
* later on.
*/
function tool_active()
{
global $config;
// This tool relies on the cache, if the user has the `NULL`
// cache enabled he can't use this!
global $acm_type;
if ($acm_type == 'null')
{
return 'SRT_NO_CACHE';
}
// Set the step
$this->step = request_var('step', 0);
if ($this->step < 0 || $this->step > 4 || !empty($_POST['reset']))
{
$this->step = 0;
}
// Step one is something different, don't need any more
if ($this->step == 0)
{
return true;
}
// Fill the data array
$this->_data = array(
'step2' => array(
array(
'name' => 'phpbb_version',
'type' => 'dropdown',
'options' => array(
'phpBB ' . $config['version'],
'phpBB ' . PHPBB_VERSION,
),
'p_callback' => array($this, '_prefill_phpbb_version'),
),
array(
'name' => 'board_url',
'type' => 'text',
'p_callback' => 'generate_board_url',
),
array(
'name' => 'dbms',
'type' => 'text',
'p_callback' => array($this, '_prefill_dbms'),
),
array(
'name' => 'php',
'type' => 'text',
'p_callback' => PHP_VERSION,
),
array(
'name' => 'host_name',
'type' => 'text',
),
array(
'name' => 'install_type',
'type' => 'dropdown',
),
array(
'name' => 'inst_converse',
'type' => 'dropdown',
),
array(
'name' => 'mods_installed',
'type' => 'boolean',
'p_callback' => array($this, '_prefill_has_mods_installed'),
'hide' => true,
),
array(
'name' => 'registration_req',
'type' => 'boolean',
'hide' => true,
),
),
'step3' => array(
array(
'name' => 'installed_mods',
'type' => 'textarea',
'depends' => 'mods_installed',
'p_callback' => array($this, '_prefill_installed_mods'),
),
array(
'name' => 'installed_styles',
'type' => 'textarea',
'p_callback' => array($this, '_prefill_installed_styles'),
),
array(
'name' => 'installed_languages',
'type' => 'textarea',
'p_callback' => array($this, '_prefill_installed_languages'),
),
array(
'name' => 'xp_level',
'type' => 'dropdown',
),
array(
'name' => 'test_username',
'type' => 'text',
'depends' => 'registration_req',
),
array(
'name' => 'test_password',
'type' => 'text',
'depends' => 'registration_req',
),
array(
'name' => 'problem_started',
'type' => 'textarea',
),
array(
'name' => 'problem_description',
'type' => 'textarea',
),
),
);
// Have to return here otherwise shit breaks
return true;
}
/**
* Generate all the Q/A pages
*/
function display_options()
{
global $cache, $template, $user;
// Step 0 is easy
if ($this->step == 0)
{
return 'SRT_GENERATOR_LANDING';
}
// Step 1 only needs a single template var set
if ($this->step == 1)
{
$template->assign_var('S_STEP1', true);
}
// Step 4 builds the result
elseif ($this->step == 4)
{
$this->_build_srt();
}
// Got to do a bit more
else
{
// Fetch the cached results, might need it here
$_previous_data = $cache->get('_stk_srt_generator');
// Run through the questions
$_prefilled = array();
foreach ($this->_data["step{$this->step}"] as $question)
{
// Some questions are only asked when certain answers are given earlier
if (isset($question['depends']))
{
// Only support booleans atm
if (empty($_previous_data[$question['depends']]))
{
continue;
}
}
// First call the prefill if there is one
$_p_callback_result = false;
if (isset($question['p_callback']) && is_callable($question['p_callback']))
{
$_p_callback_result = call_user_func($question['p_callback']);
}
elseif (!empty($question['p_callback']))
{
$_p_callback_result = $question['p_callback'];
}
// If there is a prefill result use that as answer
// Handle MODs a bit different (ugly :/)
if ($_p_callback_result !== false && $question['name'] != 'installed_mods')
{
$_prefilled[$question['name']] = $_p_callback_result;
}
// Show the question in the template
else
{
// If this is a dropdown generate the options.
if ($question['type'] == 'dropdown')
{
// Options can be passed ether by an array in the data list or are generated from the language file
$options = (!empty($question['options'])) ? $question['options'] : array();
$this->_format_options($options, $question['name']);
}
$template->assign_block_vars('questionrow', array(
'EXPLAIN' => (!empty($user->lang['SRT_QUESTIONS_EXPLAIN']["step{$this->step}"][$question['name']])) ? $user->lang['SRT_QUESTIONS_EXPLAIN']["step{$this->step}"][$question['name']] : '',
'NAME' => $question['name'],
'OPTIONS' => ($question['type'] == 'dropdown') ? $options : '',
'PREFILL' => $_p_callback_result,
'QUESTION' => $user->lang['SRT_QUESTIONS']["step{$this->step}"][$question['name']],
'TYPE' => $question['type'],
));
}
}
}
$template->assign_vars(array(
'S_PREFILL' => (!empty($_prefilled)) ? htmlspecialchars(serialize($_prefilled)) : '',
'U_ACTION' => append_sid(STK_INDEX, array('c' => 'main', 't' => 'srt_generator', 'step' => $this->step)),
));
// Spit out teh page
page_header(user_lang('SRT_GENERATOR'));
$template->set_filenames(array(
'body' => 'tools/srt_generator.html',
));
page_footer();
}
/**
* Handle a submit
*/
function run_tool()
{
global $cache, $user;
// Step 0 is a special place to be, only available for special people
// this user isn't special so kick him to the user spot
if ($this->step == 0)
{
// Distory the previous data
$cache->destroy('_stk_srt_generator');
}
// In the first step only have to trigger errors
else if ($this->step == 1)
{
global $template;
// Disable the back link
$template->assign_var('U_BACK_TOOL', false);
if (!empty($_POST['srt']['mod_related']) && $_POST['srt']['mod_related'] == '1')
{
trigger_error('STEP1_MOD_ERROR');
}
if (!empty($_POST['srt']['hacked']) && $_POST['srt']['hacked'] == '1')
{
trigger_error('STEP1_HACKED_ERROR');
}
}
// Handle the submitted stuf
else
{
$_cached_data = $cache->get('_stk_srt_generator');
$_prefilled = unserialize(htmlspecialchars_decode(request_var('prefill', '', true)));
// $_cached_data can be "false"
if ($_cached_data === false)
{
$_cached_data = array();
}
// Run through the questions and fetch the answers
$_answers = array();
foreach ($this->_data["step{$this->step}"] as $question)
{
// From the prefill?
if (isset($_prefilled[$question['name']]))
{
$_answers[$question['name']] = $_prefilled[$question['name']];
}
else
{
$_answers[$question['name']] = request_var($question['name'], '', true);
}
// For some types some aditional stuff is needed here
switch ($question['type'])
{
case 'boolean' :
// When fetched from the form these are "yes" or "no",
// convert to booleans
if (in_array($_answers[$question['name']], array('yes', 'no')))
{
$_answers[$question['name']] = ($_answers[$question['name']] == 'yes') ? true : false;
}
break;
case 'dropdown' :
// The correct one
if (!empty($question['options']))
{
$_answers[$question['name']] = $question['options'][$_answers[$question['name']]];
}
else
{
$_answers[$question['name']] = $user->lang['SRT_DROPDOWN_OPTIONS']["step{$this->step}"][$question['name']][$_answers[$question['name']]];
}
break;
}
}
// Place back in the cache
$_cached_data = array_merge($_cached_data, $_answers);
$cache->put('_stk_srt_generator', $_cached_data);
}
// Next one pleaze
redirect(append_sid(STK_INDEX, array('c' => 'main', 't' => 'srt_generator', 'step' => ++$this->step)));
}
/**
* Build the SRT and output the result
*
* @return void
* @access private
*/
function _build_srt()
{
global $cache, $template, $user;
$_template = array();
// Get the submitted data
$_answers = $cache->get('_stk_srt_generator');
if ($_answers === false)
{
// Shouldn't happening in normal operation
trigger_error('COULDNT_LOAD_SRT_ANSWERS');
}
// Header
$_template[] = '[size=115][color=#368AD2][b]Support Request Template[/b][/color][/size]<br />';
// Walk through the data
foreach ($this->_data as $step => $questions)
{
// Do teh questions
foreach ($questions as $question)
{
// Hidden?
if (!empty($question['hide']))
{
continue;
}
$question_string = $user->lang['SRT_QUESTIONS'][$step][$question['name']];
// No answer, easy :)
if (empty($_answers[$question['name']]))
{
$_template[] = "[color=#cc6600][b]{$question_string}[/b][/color]: [i]No answer given[/i]";
continue;
}
$_template[] = "[color=#cc6600][b]{$question_string}[/b][/color]: {$_answers[$question['name']]}";
}
}
// Footer
$_template[] = '<br />[size=60]Generated by Support Toolkit SRT Generator.[/size]';
// Output
$user->add_lang('viewtopic');
$template->assign_var('COMPILED_TEMPLATE', nl2br(implode('<br />', $_template)));
}
/**
* This method build the options for dropdown boxes, if the $options paramater
* contains a non-empty array the data within this array will be used for the
* options. If the array is empty the options will be fetched from the language
* files.
*
* @param Array $options The array that will be used/filled with the
* options for the dropdown box
* @param String $name The name of the question, this is used to
* lookup the correct strings in the language
* files.
* @return void
* @access private
*/
function _format_options(&$options, $name = '')
{
global $user;
$_option_list = array();
if (!empty($options))
{
foreach ($options as $_key => $_value)
{
$_option_list[] = "<option value='{$_key}'>{$_value}</option>";
}
}
else
{
// If there is no language entry for this list return an empty array
if (!empty($user->lang['SRT_DROPDOWN_OPTIONS']["step{$this->step}"][$name]))
{
foreach ($user->lang['SRT_DROPDOWN_OPTIONS']["step{$this->step}"][$name] as $_key => $_value)
{
$_option_list[] = "<option value='{$_key}'>{$_value}</option>";
}
}
}
// Set the return
$options = implode('', $_option_list);
}
/**
* Some prefill methods
* @Note, due to strict checking if a prefill should return "false" you'll
* have to return the *string*, not the boolean!
*/
/**
* Just a wrapper to get the DBAL layer
*/
function _prefill_dbms()
{
global $db;
return $db->sql_server_info();
}
/**
* Try to determine whether the user has MODs installed. This can be prefilled
* if the user has AutoMOD installed *AND* he has installed at least one MOD
* with it
*
* @return Boolean True _only_ when the user has installed at least one
* MOD through AutoMOD, otherwise false.
*/
function _prefill_has_mods_installed()
{
if ((@include PHPBB_ROOT_PATH . 'includes/functions_mods.' . PHP_EXT) !== false)
{
// See whether there is something installed
global $db;
$sql = 'SELECT mod_name
FROM ' . MODS_TABLE;
$result = $db->sql_query_limit($sql, 1);
$mod = $db->sql_fetchfield('mod_name', false, $result);
$db->sql_freeresult($result);
if ($mod !== false)
{
return true;
}
}
return false;
}
/**
* Fetch all the installed languages from the database
*
* @return String All the languages installed on this board
* @access private
*/
function _prefill_installed_languages()
{
global $db;
$_languages = array();
$sql = 'SELECT lang_english_name
FROM ' . LANG_TABLE . '
ORDER BY lang_english_name';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$_languages[] = $row['lang_english_name'];
}
$db->sql_freeresult($result);
return implode("n", $_languages);
}
/**
* If the user has AutoMOD installed prefill the "Mods installed" field
* with all MODs know by AutoMOD.
*
* @return BooleanString False if no AutoMOD was found or when no
* MODs where installed with it. Otherwise all the
* MODs that where found in the db
* @access private
*/
function _prefill_installed_mods()
{
global $db;
if ((@include PHPBB_ROOT_PATH . 'includes/functions_mods.' . PHP_EXT) !== false)
{
$_mods = array();
$sql = 'SELECT mod_name, mod_version
FROM ' . MODS_TABLE;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$_mods[] = "{$row['mod_name']} ({$row['mod_version']})";
}
$db->sql_freeresult($result);
if (!empty($_mods))
{
return implode("n", $_mods);
}
}
return false;
}
/**
* Fetch all the installed styles from the database
*
* @return Boolean|String False if for some reason no styles could be
* red from the database. Otherwise the data
* @access private
*/
function _prefill_installed_styles()
{
global $db;
$_styles = array();
$sql = 'SELECT style_name, style_active
FROM ' . STYLES_TABLE;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$_styles[] = $row['style_name'] . (($row['style_active'] == 0) ? ' [i](not active)[/i]' : '');
}
$db->sql_freeresult($result);
return implode("n", $_styles);
}
/**
* Test whether we can rely on the board to give us the version number
* This test fails if $config['version'] and PHPBB_VERSION differ.
*
* @return Boolean|String False if the version isn't relyable, otherwise
* the version number.
* @access private
*/
function _prefill_phpbb_version()
{
global $config;
if (version_compare(strtolower($config['version']), strtolower(PHPBB_VERSION), 'eq')) // use strtolower as my local php installation seems to think that x.y.z-PL1 != x.y.z-pl1
{
// Always point to the first option!
return 0;
}
return false;
}
}