197 lines
4.3 KiB
PHP
197 lines
4.3 KiB
PHP
<?php
|
|
/**
|
|
* @package Joomla.Platform
|
|
* @subpackage Document
|
|
*
|
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE
|
|
*/
|
|
|
|
defined('JPATH_PLATFORM') or die;
|
|
|
|
/**
|
|
* DocumentError class, provides an easy interface to parse and display an error page
|
|
*
|
|
* @package Joomla.Platform
|
|
* @subpackage Document
|
|
* @since 11.1
|
|
*/
|
|
class JDocumentError extends JDocument
|
|
{
|
|
/**
|
|
* Error Object
|
|
*
|
|
* @var object
|
|
* @since 11.1
|
|
*/
|
|
protected $_error;
|
|
|
|
/**
|
|
* Class constructor
|
|
*
|
|
* @param array $options Associative array of attributes
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public function __construct($options = array())
|
|
{
|
|
parent::__construct($options);
|
|
|
|
// Set mime type
|
|
$this->_mime = 'text/html';
|
|
|
|
// Set document type
|
|
$this->_type = 'error';
|
|
}
|
|
|
|
/**
|
|
* Set error object
|
|
*
|
|
* @param object $error Error object to set
|
|
*
|
|
* @return boolean True on success
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public function setError($error)
|
|
{
|
|
if ($error instanceof Exception)
|
|
{
|
|
$this->_error = & $error;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render the document
|
|
*
|
|
* @param boolean $cache If true, cache the output
|
|
* @param array $params Associative array of attributes
|
|
*
|
|
* @return string The rendered data
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public function render($cache = false, $params = array())
|
|
{
|
|
// If no error object is set return null
|
|
if (!isset($this->_error))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Set the status header
|
|
JResponse::setHeader('status', $this->_error->getCode() . ' ' . str_replace("\n", ' ', $this->_error->getMessage()));
|
|
$file = 'error.php';
|
|
|
|
// Check template
|
|
$directory = isset($params['directory']) ? $params['directory'] : 'templates';
|
|
$template = isset($params['template']) ? JFilterInput::getInstance()->clean($params['template'], 'cmd') : 'system';
|
|
|
|
if (!file_exists($directory . '/' . $template . '/' . $file))
|
|
{
|
|
$template = 'system';
|
|
}
|
|
|
|
// Set variables
|
|
$this->baseurl = JUri::base(true);
|
|
$this->template = $template;
|
|
$this->debug = isset($params['debug']) ? $params['debug'] : false;
|
|
$this->error = $this->_error;
|
|
|
|
// Load
|
|
$data = $this->_loadTemplate($directory . '/' . $template, $file);
|
|
|
|
parent::render();
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Load a template file
|
|
*
|
|
* @param string $directory The name of the template
|
|
* @param string $filename The actual filename
|
|
*
|
|
* @return string The contents of the template
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public function _loadTemplate($directory, $filename)
|
|
{
|
|
$contents = '';
|
|
|
|
// Check to see if we have a valid template file
|
|
if (file_exists($directory . '/' . $filename))
|
|
{
|
|
// Store the file path
|
|
$this->_file = $directory . '/' . $filename;
|
|
|
|
// Get the file content
|
|
ob_start();
|
|
require_once $directory . '/' . $filename;
|
|
$contents = ob_get_contents();
|
|
ob_end_clean();
|
|
}
|
|
|
|
return $contents;
|
|
}
|
|
|
|
/**
|
|
* Render the backtrace
|
|
*
|
|
* @return string The contents of the backtrace
|
|
*
|
|
* @since 11.1
|
|
*/
|
|
public function renderBacktrace()
|
|
{
|
|
$contents = null;
|
|
$backtrace = $this->_error->getTrace();
|
|
if (is_array($backtrace))
|
|
{
|
|
ob_start();
|
|
$j = 1;
|
|
echo '<table cellpadding="0" cellspacing="0" class="Table">';
|
|
echo ' <tr>';
|
|
echo ' <td colspan="3" class="TD"><strong>Call stack</strong></td>';
|
|
echo ' </tr>';
|
|
echo ' <tr>';
|
|
echo ' <td class="TD"><strong>#</strong></td>';
|
|
echo ' <td class="TD"><strong>Function</strong></td>';
|
|
echo ' <td class="TD"><strong>Location</strong></td>';
|
|
echo ' </tr>';
|
|
for ($i = count($backtrace) - 1; $i >= 0; $i--)
|
|
{
|
|
echo ' <tr>';
|
|
echo ' <td class="TD">' . $j . '</td>';
|
|
if (isset($backtrace[$i]['class']))
|
|
{
|
|
echo ' <td class="TD">' . $backtrace[$i]['class'] . $backtrace[$i]['type'] . $backtrace[$i]['function'] . '()</td>';
|
|
}
|
|
else
|
|
{
|
|
echo ' <td class="TD">' . $backtrace[$i]['function'] . '()</td>';
|
|
}
|
|
if (isset($backtrace[$i]['file']))
|
|
{
|
|
echo ' <td class="TD">' . $backtrace[$i]['file'] . ':' . $backtrace[$i]['line'] . '</td>';
|
|
}
|
|
else
|
|
{
|
|
echo ' <td class="TD"> </td>';
|
|
}
|
|
echo ' </tr>';
|
|
$j++;
|
|
}
|
|
echo '</table>';
|
|
$contents = ob_get_contents();
|
|
ob_end_clean();
|
|
}
|
|
return $contents;
|
|
}
|
|
}
|