757 lines
20 KiB
PHP
Executable File
757 lines
20 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Framework\Error;
|
|
|
|
use Magento\Config\Model\Config\Reader\Source\Deployed\DocumentRoot;
|
|
use Magento\Framework\Serialize\Serializer\Json;
|
|
use Magento\Framework\Escaper;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\App\Response\Http;
|
|
|
|
/**
|
|
* Error processor
|
|
*
|
|
* @SuppressWarnings(PHPMD.TooManyFields)
|
|
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
|
|
* phpcs:ignoreFile
|
|
*/
|
|
#[\AllowDynamicProperties]
|
|
class Processor
|
|
{
|
|
const MAGE_ERRORS_LOCAL_XML = 'local.xml';
|
|
const MAGE_ERRORS_DESIGN_XML = 'design.xml';
|
|
const DEFAULT_SKIN = 'default';
|
|
const ERROR_DIR = 'pub/errors';
|
|
const NUMBER_SYMBOLS_IN_SUBDIR_NAME = 2;
|
|
|
|
/**
|
|
* Page title
|
|
*
|
|
* @var string
|
|
*/
|
|
public $pageTitle;
|
|
|
|
/**
|
|
* Skin URL
|
|
*
|
|
* @var string
|
|
*/
|
|
public $skinUrl;
|
|
|
|
/**
|
|
* Base URL
|
|
*
|
|
* @var string
|
|
*/
|
|
public $baseUrl;
|
|
|
|
/**
|
|
* Post data
|
|
*
|
|
* @var array
|
|
*/
|
|
public $postData;
|
|
|
|
/**
|
|
* Report data
|
|
*
|
|
* @var array
|
|
*/
|
|
public $reportData;
|
|
|
|
/**
|
|
* Report action
|
|
*
|
|
* @var string
|
|
*/
|
|
public $reportAction;
|
|
|
|
/**
|
|
* Report ID
|
|
*
|
|
* @var string
|
|
*/
|
|
public $reportId;
|
|
|
|
/**
|
|
* Report file
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_reportFile;
|
|
|
|
/**
|
|
* Show error message
|
|
*
|
|
* @var bool
|
|
*/
|
|
public $showErrorMsg;
|
|
|
|
/**
|
|
* Show message after sending email
|
|
*
|
|
* @var bool
|
|
*/
|
|
public $showSentMsg;
|
|
|
|
/**
|
|
* Show form for sending
|
|
*
|
|
* @var bool
|
|
*/
|
|
public $showSendForm;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
public $reportUrl;
|
|
|
|
/**
|
|
* Server script name
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_scriptName;
|
|
|
|
/**
|
|
* Is root
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $_root;
|
|
|
|
/**
|
|
* Internal config object
|
|
*
|
|
* @var \stdClass
|
|
*/
|
|
protected $_config;
|
|
|
|
/**
|
|
* Http response
|
|
*
|
|
* @var Http
|
|
*/
|
|
protected $_response;
|
|
|
|
/**
|
|
* JSON serializer
|
|
*
|
|
* @var Json
|
|
*/
|
|
private $serializer;
|
|
|
|
/**
|
|
* @var Escaper
|
|
*/
|
|
private $escaper;
|
|
|
|
/**
|
|
* @var DocumentRoot
|
|
*/
|
|
private $documentRoot;
|
|
|
|
/**
|
|
* @param Http $response
|
|
* @param Json $serializer
|
|
* @param Escaper $escaper
|
|
* @param DocumentRoot|null $documentRoot
|
|
*/
|
|
public function __construct(
|
|
Http $response,
|
|
Json $serializer = null,
|
|
Escaper $escaper = null,
|
|
DocumentRoot $documentRoot = null
|
|
) {
|
|
$this->_response = $response;
|
|
$this->_errorDir = __DIR__ . '/';
|
|
$this->_reportDir = dirname(dirname($this->_errorDir)) . '/var/report/';
|
|
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
|
|
$this->escaper = $escaper ?: ObjectManager::getInstance()->get(Escaper::class);
|
|
$this->documentRoot = $documentRoot ?? ObjectManager::getInstance()->get(DocumentRoot::class);
|
|
|
|
if (!empty($_SERVER['SCRIPT_NAME'])) {
|
|
if (in_array(basename($_SERVER['SCRIPT_NAME'], '.php'), ['404', '503', 'report'])) {
|
|
$this->_scriptName = dirname($_SERVER['SCRIPT_NAME']);
|
|
} else {
|
|
$this->_scriptName = $_SERVER['SCRIPT_NAME'];
|
|
}
|
|
}
|
|
|
|
$this->_indexDir = $this->_getIndexDir();
|
|
$this->_root = is_dir($this->_indexDir . 'app');
|
|
|
|
$this->_prepareConfig();
|
|
if (isset($_GET['skin'])) {
|
|
$this->_setSkin($_GET['skin']);
|
|
}
|
|
if (isset($_GET['id'])) {
|
|
$this->loadReport($_GET['id']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Process no cache error
|
|
*
|
|
* @return \Magento\Framework\App\Response\Http
|
|
*/
|
|
public function processNoCache()
|
|
{
|
|
$this->pageTitle = 'Error : cached config data is unavailable';
|
|
$this->_response->setBody($this->_renderPage('nocache.phtml'));
|
|
return $this->_response;
|
|
}
|
|
|
|
/**
|
|
* Process 404 error
|
|
*
|
|
* @return \Magento\Framework\App\Response\Http
|
|
*/
|
|
public function process404()
|
|
{
|
|
$this->pageTitle = 'Error 404: Not Found';
|
|
$this->_response->setHttpResponseCode(404);
|
|
$this->_response->setBody($this->_renderPage('404.phtml'));
|
|
return $this->_response;
|
|
}
|
|
|
|
/**
|
|
* Process 503 error
|
|
*
|
|
* @return \Magento\Framework\App\Response\Http
|
|
*/
|
|
public function process503()
|
|
{
|
|
$this->pageTitle = 'Error 503: Service Unavailable';
|
|
$this->_response->setHttpResponseCode(503);
|
|
$this->_response->setBody($this->_renderPage('503.phtml'));
|
|
return $this->_response;
|
|
}
|
|
|
|
/**
|
|
* Process report
|
|
*
|
|
* @return \Magento\Framework\App\Response\Http
|
|
*/
|
|
public function processReport()
|
|
{
|
|
$this->pageTitle = 'There has been an error processing your request';
|
|
$this->_response->setHttpResponseCode(500);
|
|
|
|
$this->showErrorMsg = false;
|
|
$this->showSentMsg = false;
|
|
$this->showSendForm = false;
|
|
$this->reportAction = $this->_config->action;
|
|
$this->_setReportUrl();
|
|
|
|
if ($this->reportAction == 'email') {
|
|
$this->showSendForm = true;
|
|
$this->sendReport();
|
|
}
|
|
$this->_response->setBody($this->_renderPage('report.phtml'));
|
|
return $this->_response;
|
|
}
|
|
|
|
/**
|
|
* Retrieve skin URL
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getViewFileUrl()
|
|
{
|
|
//The url needs to be updated base on Document root path.
|
|
$indexDir = str_replace('\\', '/', $this->_indexDir);
|
|
$errorDir = str_replace('\\', '/', $this->_errorDir);
|
|
$errorPathSuffix = $this->documentRoot->isPub() ? 'errors/' : 'pub/errors/';
|
|
$errorPath = strpos($errorDir, $indexDir) === 0 ?
|
|
str_replace($indexDir, '', $errorDir) : $errorPathSuffix;
|
|
|
|
return $this->getBaseUrl() . $errorPath . $this->_config->skin . '/';
|
|
}
|
|
|
|
/**
|
|
* Retrieve base host URL without path
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getHostUrl()
|
|
{
|
|
/**
|
|
* Define server http host
|
|
*/
|
|
$host = $this->resolveHostName();
|
|
|
|
$isSecure = (!empty($_SERVER['HTTPS'])) && ($_SERVER['HTTPS'] !== 'off')
|
|
|| isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
|
|
$url = ($isSecure ? 'https://' : 'http://') . $host;
|
|
|
|
$port = explode(':', $host);
|
|
if (isset($port[1]) && !in_array($port[1], [80, 443])
|
|
&& !preg_match('/.*?\:[0-9]+$/', $url)
|
|
) {
|
|
$url .= ':' . $port[1];
|
|
}
|
|
return $url;
|
|
}
|
|
|
|
/**
|
|
* Resolve hostname
|
|
*
|
|
* @return string
|
|
*/
|
|
private function resolveHostName() : string
|
|
{
|
|
if (!empty($_SERVER['HTTP_HOST'])) {
|
|
$host = $_SERVER['HTTP_HOST'];
|
|
} elseif (!empty($_SERVER['SERVER_NAME'])) {
|
|
$host = $_SERVER['SERVER_NAME'];
|
|
} else {
|
|
$host = 'localhost';
|
|
}
|
|
return $host;
|
|
}
|
|
|
|
/**
|
|
* Retrieve base URL
|
|
*
|
|
* @param bool $param
|
|
* @return string
|
|
*/
|
|
public function getBaseUrl($param = false)
|
|
{
|
|
$path = $this->_scriptName;
|
|
|
|
if ($param && !$this->_root) {
|
|
$path = dirname($path);
|
|
}
|
|
|
|
$basePath = str_replace('\\', '/', dirname($path));
|
|
return $this->getHostUrl() . ('/' == $basePath ? '' : $basePath) . '/';
|
|
}
|
|
|
|
/**
|
|
* Retrieve client IP address
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function _getClientIp()
|
|
{
|
|
return (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : 'undefined';
|
|
}
|
|
|
|
/**
|
|
* Get index dir
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function _getIndexDir()
|
|
{
|
|
$documentRoot = '';
|
|
if (!empty($_SERVER['DOCUMENT_ROOT'])) {
|
|
$documentRoot = rtrim(realpath($_SERVER['DOCUMENT_ROOT']), '/');
|
|
}
|
|
return dirname($documentRoot . $this->_scriptName) . '/';
|
|
}
|
|
|
|
/**
|
|
* Prepare config data
|
|
*
|
|
* @return void
|
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
|
* @SuppressWarnings(PHPMD.NPathComplexity)
|
|
*/
|
|
protected function _prepareConfig()
|
|
{
|
|
$local = $this->_loadXml(self::MAGE_ERRORS_LOCAL_XML);
|
|
$design = $this->_loadXml(self::MAGE_ERRORS_DESIGN_XML);
|
|
|
|
//initial settings
|
|
$config = new \stdClass();
|
|
$config->action = '';
|
|
$config->subject = 'Store Debug Information';
|
|
$config->email_address = '';
|
|
$config->trash = 'leave';
|
|
$config->skin = self::DEFAULT_SKIN;
|
|
|
|
//combine xml data to one object
|
|
if ($design !== null && (string)$design->skin) {
|
|
$this->_setSkin((string)$design->skin, $config);
|
|
}
|
|
if ($local !== null) {
|
|
if ((string)$local->report->action) {
|
|
$config->action = $local->report->action;
|
|
}
|
|
if ((string)$local->report->subject) {
|
|
$config->subject = $local->report->subject;
|
|
}
|
|
if ((string)$local->report->email_address) {
|
|
$config->email_address = $local->report->email_address;
|
|
}
|
|
if ((string)$local->report->trash) {
|
|
$config->trash = $local->report->trash;
|
|
}
|
|
if ($local->report->dir_nesting_level) {
|
|
$config->dir_nesting_level = (int)$local->report->dir_nesting_level;
|
|
}
|
|
if ((string)$local->skin) {
|
|
$this->_setSkin((string)$local->skin, $config);
|
|
}
|
|
}
|
|
if ((string)$config->email_address == '' && (string)$config->action == 'email') {
|
|
$config->action = '';
|
|
}
|
|
|
|
$this->_config = $config;
|
|
}
|
|
|
|
/**
|
|
* Load xml file
|
|
*
|
|
* @param string $xmlFile
|
|
* @return \SimpleXMLElement
|
|
*/
|
|
protected function _loadXml($xmlFile)
|
|
{
|
|
$configPath = $this->_getFilePath($xmlFile);
|
|
return ($configPath) ? simplexml_load_file($configPath) : null;
|
|
}
|
|
|
|
/**
|
|
* Render page
|
|
*
|
|
* @param string $template
|
|
* @return string
|
|
*/
|
|
protected function _renderPage($template)
|
|
{
|
|
$baseTemplate = $this->_getTemplatePath('page.phtml');
|
|
$contentTemplate = $this->_getTemplatePath($template);
|
|
|
|
$html = '';
|
|
if ($baseTemplate && $contentTemplate) {
|
|
ob_start();
|
|
require_once $baseTemplate;
|
|
$html = ob_get_clean();
|
|
}
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Find file path
|
|
*
|
|
* @param string $file
|
|
* @param array $directories
|
|
* @return string
|
|
*/
|
|
protected function _getFilePath($file, $directories = null)
|
|
{
|
|
if ($directories === null) {
|
|
$directories[] = $this->_errorDir;
|
|
}
|
|
|
|
foreach ($directories as $directory) {
|
|
if (file_exists($directory . $file)) {
|
|
return $directory . $file;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Find template path
|
|
*
|
|
* @param string $template
|
|
* @return string
|
|
*/
|
|
protected function _getTemplatePath($template)
|
|
{
|
|
$directories[] = $this->_errorDir . $this->_config->skin . '/';
|
|
|
|
if ($this->_config->skin != self::DEFAULT_SKIN) {
|
|
$directories[] = $this->_errorDir . self::DEFAULT_SKIN . '/';
|
|
}
|
|
|
|
return $this->_getFilePath($template, $directories);
|
|
}
|
|
|
|
/**
|
|
* Set report data
|
|
*
|
|
* @param array $reportData
|
|
* @return void
|
|
*/
|
|
protected function _setReportData($reportData)
|
|
{
|
|
$this->reportData = $reportData;
|
|
|
|
if (!isset($reportData['url'])) {
|
|
$this->reportData['url'] = '';
|
|
} else {
|
|
$this->reportData['url'] = $this->getHostUrl() . $reportData['url'];
|
|
}
|
|
|
|
if (isset($this->reportData['script_name'])) {
|
|
$this->_scriptName = $this->reportData['script_name'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create report
|
|
*
|
|
* @param array $reportData
|
|
* @return string
|
|
*/
|
|
public function saveReport(array $reportData): string
|
|
{
|
|
$this->reportId = $reportData['report_id'];
|
|
$this->_reportFile = $this->getReportPath(
|
|
$this->getReportDirNestingLevel($this->reportId),
|
|
$this->reportId
|
|
);
|
|
$reportDirName = dirname($this->_reportFile);
|
|
if (!file_exists($reportDirName)) {
|
|
@mkdir($reportDirName, 0777, true);
|
|
}
|
|
$this->_setReportData($reportData);
|
|
|
|
@file_put_contents($this->_reportFile, $this->serializer->serialize($reportData). PHP_EOL);
|
|
|
|
if (isset($reportData['skin']) && self::DEFAULT_SKIN != $reportData['skin']) {
|
|
$this->_setSkin($reportData['skin']);
|
|
}
|
|
$this->_setReportUrl();
|
|
|
|
return $this->reportUrl;
|
|
}
|
|
|
|
/**
|
|
* Get report
|
|
*
|
|
* @param string $reportId
|
|
* @return void
|
|
*/
|
|
public function loadReport($reportId)
|
|
{
|
|
try {
|
|
if (!$this->isReportIdValid($reportId)) {
|
|
throw new \RuntimeException("Report Id is invalid");
|
|
}
|
|
$reportFile = $this->findReportFile($reportId);
|
|
if (!is_readable($reportFile)) {
|
|
throw new \RuntimeException("Report file cannot be read");
|
|
}
|
|
$this->reportId = $reportId;
|
|
$this->_reportFile = $reportFile;
|
|
$this->_setReportData($this->serializer->unserialize(file_get_contents($this->_reportFile)));
|
|
} catch (\RuntimeException $e) {
|
|
$this->redirectToBaseUrl();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Searches for the report file and returns the path to it
|
|
*
|
|
* @param string $reportId
|
|
* @return string
|
|
* @throws \RuntimeException
|
|
*/
|
|
private function findReportFile(string $reportId): string
|
|
{
|
|
$reportFile = $this->getReportPath(
|
|
$this->getReportDirNestingLevel($reportId),
|
|
$reportId
|
|
);
|
|
if (file_exists($reportFile)) {
|
|
return $reportFile;
|
|
}
|
|
$maxReportDirNestingLevel = $this->getMaxReportDirNestingLevel($reportId);
|
|
for ($i = 0; $i <= $maxReportDirNestingLevel; $i++) {
|
|
$reportFile = $this->getReportPath($i, $reportId);
|
|
if (file_exists($reportFile)) {
|
|
return $reportFile;
|
|
}
|
|
}
|
|
throw new \RuntimeException("Report file not found");
|
|
}
|
|
|
|
/**
|
|
* Redirect to a base url
|
|
* @return void
|
|
*/
|
|
private function redirectToBaseUrl()
|
|
{
|
|
header("Location: " . $this->getBaseUrl());
|
|
die();
|
|
}
|
|
|
|
/**
|
|
* Checks report id
|
|
*
|
|
* @param string $reportId
|
|
* @return bool
|
|
*/
|
|
private function isReportIdValid(string $reportId): bool
|
|
{
|
|
return (bool)preg_match('/^[a-fA-F0-9]{64}$/', $reportId);
|
|
}
|
|
|
|
/**
|
|
* Get path to reports
|
|
*
|
|
* @param integer $reportDirNestingLevel
|
|
* @param string $reportId
|
|
* @return string
|
|
*/
|
|
private function getReportPath(int $reportDirNestingLevel, string $reportId): string
|
|
{
|
|
$reportDirPath = $this->_reportDir;
|
|
for ($i = 0, $j = 0; $j < $reportDirNestingLevel; $i += 2, $j++) {
|
|
$reportDirPath .= $reportId[$i] . $reportId[$i + 1] . '/';
|
|
}
|
|
return $reportDirPath . $reportId;
|
|
}
|
|
|
|
/**
|
|
* Returns nesting Level for the report files
|
|
*
|
|
* @var $reportId
|
|
* @return int
|
|
*/
|
|
private function getReportDirNestingLevel(string $reportId): int
|
|
{
|
|
$envName = 'MAGE_ERROR_REPORT_DIR_NESTING_LEVEL';
|
|
$value = $_ENV[$envName] ?? getenv($envName);
|
|
if(false === $value && property_exists($this->_config, 'dir_nesting_level')) {
|
|
$value = $this->_config->dir_nesting_level;
|
|
}
|
|
$value = (int)$value;
|
|
$maxValue= $this->getMaxReportDirNestingLevel($reportId);
|
|
return 0 < $value && $maxValue >= $value ? $value : 0;
|
|
}
|
|
|
|
/**
|
|
* Returns maximum nesting level directories of report files
|
|
*
|
|
* @param string $reportId
|
|
* @return integer
|
|
*/
|
|
private function getMaxReportDirNestingLevel(string $reportId): int
|
|
{
|
|
return (int)floor(strlen($reportId) / self::NUMBER_SYMBOLS_IN_SUBDIR_NAME);
|
|
}
|
|
|
|
/**
|
|
* Send report
|
|
*
|
|
* @return void
|
|
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
|
* @SuppressWarnings(PHPMD.NPathComplexity)
|
|
*/
|
|
public function sendReport()
|
|
{
|
|
$this->pageTitle = 'Error Submission Form';
|
|
|
|
$this->postData['firstName'] = (isset($_POST['firstname']))
|
|
? trim($this->escaper->escapeHtml($_POST['firstname'])) : '';
|
|
$this->postData['lastName'] = (isset($_POST['lastname']))
|
|
? trim($this->escaper->escapeHtml($_POST['lastname'])) : '';
|
|
$this->postData['email'] = (isset($_POST['email']))
|
|
? trim($this->escaper->escapeHtml($_POST['email'])) : '';
|
|
$this->postData['telephone'] = (isset($_POST['telephone']))
|
|
? trim($this->escaper->escapeHtml($_POST['telephone'])) : '';
|
|
$this->postData['comment'] = (isset($_POST['comment']))
|
|
? trim($this->escaper->escapeHtml($_POST['comment'])) : '';
|
|
|
|
if (isset($_POST['submit'])) {
|
|
if ($this->_validate()) {
|
|
$msg = "URL: {$this->reportData['url']}\n"
|
|
. "IP Address: {$this->_getClientIp()}\n"
|
|
. "First Name: {$this->postData['firstName']}\n"
|
|
. "Last Name: {$this->postData['lastName']}\n"
|
|
. "Email Address: {$this->postData['email']}\n";
|
|
if ($this->postData['telephone']) {
|
|
$msg .= "Telephone: {$this->postData['telephone']}\n";
|
|
}
|
|
if ($this->postData['comment']) {
|
|
$msg .= "Comment: {$this->postData['comment']}\n";
|
|
}
|
|
|
|
$subject = sprintf('%s [%s]', (string)$this->_config->subject, $this->reportId);
|
|
@mail((string)$this->_config->email_address, $subject, $msg);
|
|
|
|
$this->showSendForm = false;
|
|
$this->showSentMsg = true;
|
|
} else {
|
|
$this->showErrorMsg = true;
|
|
}
|
|
} else {
|
|
$time = gmdate('Y-m-d H:i:s \G\M\T');
|
|
|
|
$msg = "URL: {$this->reportData['url']}\n"
|
|
. "IP Address: {$this->_getClientIp()}\n"
|
|
. "Time: {$time}\n"
|
|
. "Error:\n{$this->reportData[0]}\n\n"
|
|
. "Trace:\n{$this->reportData[1]}";
|
|
|
|
$subject = sprintf('%s [%s]', (string)$this->_config->subject, $this->reportId);
|
|
@mail((string)$this->_config->email_address, $subject, $msg);
|
|
|
|
if ($this->_config->trash == 'delete') {
|
|
@unlink($this->_reportFile);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate submitted post data
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function _validate()
|
|
{
|
|
$email = preg_match(
|
|
'/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/',
|
|
$this->postData['email']
|
|
);
|
|
return ($this->postData['firstName'] && $this->postData['lastName'] && $email);
|
|
}
|
|
|
|
/**
|
|
* Skin setter
|
|
*
|
|
* @param string $value
|
|
* @param \stdClass $config
|
|
* @return void
|
|
*/
|
|
protected function _setSkin($value, \stdClass $config = null)
|
|
{
|
|
if (preg_match('/^[a-z0-9_]+$/i', $value) && is_dir($this->_errorDir . $value)) {
|
|
if (!$config) {
|
|
if ($this->_config) {
|
|
$config = $this->_config;
|
|
}
|
|
}
|
|
if ($config) {
|
|
$config->skin = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set current report URL from current params
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _setReportUrl()
|
|
{
|
|
if ($this->reportId && $this->_config && isset($this->_config->skin)) {
|
|
$this->reportUrl = "{$this->getBaseUrl(true)}pub/errors/report.php?"
|
|
. http_build_query(['id' => $this->reportId, 'skin' => $this->_config->skin]);
|
|
}
|
|
}
|
|
}
|