a:8:{s:4:"name";s:19:"sgb_error_documents";s:6:"author";s:3:"sgb";s:10:"author_uri";s:23:"http://mighthitgold.net";s:7:"version";s:5:"0.1.1";s:11:"description";s:34:"adds error document support to TxP";s:4:"help";s:2404:"

	<h3>sgb_error_documents</h3>
	<p>This plugin adds error document handling to TxP, it is designed to support a number of different error codes, and provides three different ways for handling each error code. Currently the plugin supports two error codes, 403 Forbidden and 404 Not Found, more can easily be add.</p>

	<p>This plugin is designed as a companion to sgb_url_handler but it is open-ended enough to be used by any where.</p>

	<p>The plugin can respond to each error code in one of four possible ways, by displaying an article on your site, redirecting to an error page, including an error document or by simply outputting error text. The plugin responds to an error in the order specified above (ID, URL, File and Text). If the ID is not set or is not found, the plugin will try the URL. If the URL is not set the plugin will try the File. If the file is not found, the plugin try the Text. If the Text is not set the plugin will simply output a default error message.</p>

	<p>If an error code is passed to the plugin that is not under stood, the plugin will not do anything.</p>

	<h3>Configuration</h3>
	<p>Right now configuration is handled by the array in sgb_error_documents_config. Each error code has four elements: id, url, file and text.</p>
	<dl>
		<dt>id</dt>
		<dd>The ID element should be an id of an article in your TxP database that explains a particular error code. You could, for example, prepare an Errors section and then populate it with articles for common errors.</dd>
		<dt>url</dt>
		<dd>The URL element should be a complete URL to a page explaining a particular error code. If this error is triggered users will be redirected to this page.</dd>
		<dt>file</dt>
		<dd>The file element should be a relative (to index.php) path to a file explaining a particular error code. If the file is found it will be included and then the function will exit (terminating the TxP request).</dd>
		<dt>text</dt>
		<dd>The text element will be echoed to the browser if this error is triggered. The text will only be formatted by what HTML is included in the text itself. After the text is sent to the browser exit is called, terminating the TxP request.</dd>
	</dl>

	<p>In all instances (except for URL redirections) the plugin will issue the appropriate error header.</p>

	<h3>Changelog</h3>

	<h4>0.1.1</h4>
	<ul>
		<li>Released.</li>
	</ul>
	
";s:4:"code";s:2290:"
/*
** Configuration
*/

function sgb_error_documents_config() // array
{
	// 404 File Not Found
	$sgb_config['error_documents']['404']['id']   = null;
	$sgb_config['error_documents']['404']['url']  = null;
	$sgb_config['error_documents']['404']['file'] = null;
	$sgb_config['error_documents']['404']['text'] = null;

	// 403 Forbidden
	$sgb_config['error_documents']['403']['id']   = null;
	$sgb_config['error_documents']['403']['url']  = null;
	$sgb_config['error_documents']['403']['file'] = null;
	$sgb_config['error_documents']['403']['text'] = null;

	return $sgb_config;
}

function sgb_error_document($code = '', $id = null) // void
{
	$sgb_config = sgb_error_documents_config();

	$headers = array (
		'403' => 'HTTP/1.0 403 Forbidden', 
		'404' => 'HTTP/1.0 404 Not Found', 
	);

	$default_text = array (
		'403' => '<h1>403 Forbidden</h1>', 
		'404' => '<h1>404 Not Found</h1>',
	);

	if (@isset($headers[$code])) {
		// Try the article ID
		if (isset($sgb_config['error_documents'][$code]['id'])) {
			$rs = lookupByID($sgb_config['error_documents'][$code]['id']);

			if (!empty($rs['ID'])) {
				// If possible set the article ID so TxP can handle it normally
				if (function_exists('sgb_url_set')) {
					header($headers[$code]);
					sgb_url_set('id', $sgb_config['error_documents'][$code]['id']);
					return;
				}
				
				// Otherwise redirect using basic, messy URLs to the article
				else {
					header('Location: '.hu.'?id='.$sgb_config['error_documents'][$code]['id']);
					exit();
				}
			}
		}
		
		// Try redirecting to the error page
		if (isset($sgb_config['error_documents'][$code]['url'])) {
			header('Location: '.$sgb_config['error_documents'][$code]['url']);
			exit();
		}

		// Try including the error file
		if (isset($sgb_config['error_documents'][$code]['file']) && @is_file($sgb_config['error_documents'][$code]['file'])) {
			header($headers[$code]);
			@include_once($sgb_config['error_documents'][$code]['file']);
			exit();
		}
		
		// Output the error text
		$text = (isset($sgb_config['error_documents'][$code]['text'])) ? $sgb_config['error_documents'][$code]['text'] : $default_text[$code];

		header($headers[$code]);
		exit($text);
	} else {
		return;
	}
}
";s:3:"md5";s:32:"00cb2088fd01d859cc2cd22dc9dc983e";}