- sklearn.metrics.root_mean_squared_log_error(y_true, y_pred, *, sample_weight=None, multioutput=‘uniform_average’)[source]#
-
Root mean squared logarithmic error regression loss.
Read more in the User Guide.
Added in version 1.4.
- Parameters:
-
- y_truearray-like of shape (n_samples,) or (n_samples, n_outputs)
-
Ground truth (correct) target values.
- y_predarray-like of shape (n_samples,) or (n_samples, n_outputs)
-
Estimated target values.
- sample_weightarray-like of shape (n_samples,), default=None
-
Sample weights.
- multioutput{‘raw_values’, ‘uniform_average’} or array-like of shape (n_outputs,), default=’uniform_average’
-
Defines aggregating of multiple output values.
Array-like value defines weights used to average errors.- ‘raw_values’ :
-
Returns a full set of errors when the input is of multioutput
format. - ‘uniform_average’ :
-
Errors of all outputs are averaged with uniform weight.
- Returns:
-
- lossfloat or ndarray of floats
-
A non-negative floating point value (the best value is 0.0), or an
array of floating point values, one for each individual target.
Examples
>>> from sklearn.metrics import root_mean_squared_log_error >>> y_true = [3, 5, 2.5, 7] >>> y_pred = [2.5, 5, 4, 8] >>> root_mean_squared_log_error(y_true, y_pred) 0.199...
Describe the bug
For the sklearn.metrics.root_mean_squared_log_error(y_true, y_pred) & sklearn.metrics.mean_squared_log_error(y_true, y_pred) evaluation metrics, if any of the values in y_true or y_pred are below 0, the following ValueError exception is raised:
if (y_true < 0).any() or (y_pred < 0).any(): raise ValueError( "Root Mean Squared Logarithmic Error cannot be used when " "targets contain negative values." )
However, the actual calculations behind these errors are valid for values of y_true & y_pred larger than -1, so any values in y_true or y_pred that are in the range [0, -1[ should be valid when calculating these errors. The equations are shown below, note that the log() of any value larger than 0 is valid:
$$RMSLE=\sqrt{\frac{1}{n} \sum_{i=1}^n (\log{(y_{pred}+1)}-\log{(y_{true}+1)})^2}$$
$$MSLE=\frac{1}{n} \sum_{i=1}^n (\log{(y_{pred}+1)}-\log{(y_{true}+1)})^2$$
The thresholds that trigger the ValueError exception should be adjusted as shown below:
if (y_true <= -1).any() or (y_pred <= -1).any(): raise ValueError( "Root Mean Squared Logarithmic Error cannot be used when " "targets contain values below or equal to -1." )
Steps/Code to Reproduce
import numpy as np from sklearn.metrics import root_mean_squared_log_error, mean_squared_log_error y_true = [0, -0.25, -0.1] y_pred = [1, -0.5, -0.9] # Hand calculation of RMSLE is valid RMSLE = (1 / len(y_pred) * sum([(np.log(y_pred[i] + 1) - np.log(y_true[i] + 1)) ** 2 for i in range(len(y_pred))])) ** 0.5 # Hand calculation of MSLE is valid MSLE = 1 / len(y_pred) * sum([(np.log(y_pred[i] + 1) - np.log(y_true[i] + 1)) ** 2 for i in range(len(y_pred))]) # Error is raised with sklearn print(root_mean_squared_log_error(y_true, y_pred)) # Error is raised with sklearn print(mean_squared_log_error(y_true, y_pred))
Expected Results
No error is thrown. Errors should only be thrown if y_true or y_pred contain values below or equal to -1.
Actual Results
Traceback (most recent call last):
File «scratch.py», line 10, in
print(root_mean_squared_log_error(y_true, y_pred)) # Error is raised
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File «[…]/lib/python3.11/site-packages/sklearn/utils/_param_validation.py», line 213, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File «[…]/lib/python3.11/site-packages/sklearn/metrics/_regression.py», line 759, in root_mean_squared_log_error
raise ValueError(
ValueError: Root Mean Squared Logarithmic Error cannot be used when targets contain negative values.
Versions
System:
python: 3.11.8 (main, Feb 26 2024, 21:39:34) [GCC 11.2.0]
executable: /home/simon/anaconda3/envs/arcflashml/bin/python
machine: Linux-5.15.153.1-microsoft-standard-WSL2-x86_64-with-glibc2.35
Python dependencies:
sklearn: 1.4.2
pip: 23.3.1
setuptools: 68.2.2
numpy: 1.26.4
scipy: 1.13.0
Cython: None
pandas: 2.2.1
matplotlib: 3.8.4
joblib: 1.4.0
threadpoolctl: 3.4.0
Built with OpenMP: True
threadpoolctl info:
user_api: blas
internal_api: mkl
num_threads: 8
prefix: libmkl_rt
filepath: /home/simon/anaconda3/envs/arcflashml/lib/libmkl_rt.so.2
version: 2023.1-Product
threading_layer: intel
user_api: openmp
internal_api: openmp
num_threads: 16
prefix: libiomp
filepath: /home/simon/anaconda3/envs/arcflashml/lib/libiomp5.so
version: None
user_api: openmp
internal_api: openmp
num_threads: 16
prefix: libgomp
filepath: /home/simon/anaconda3/envs/arcflashml/lib/python3.11/site-packages/scikit_learn.libs/libgomp-a34b3233.so.1.0.0
version: None
user_api: blas
internal_api: openblas
num_threads: 16
prefix: libopenblas
filepath: /home/simon/anaconda3/envs/arcflashml/lib/python3.11/site-packages/scipy.libs/libopenblasp-r0-24bff013.3.26.dev.so
version: 0.3.26.dev
threading_layer: pthreads
architecture: Zen
Intro
Вот уже третий год подряд компания SIBUR организовывает собственные соревнования в областях Data Science, AI, и ML, предлагая для решения реальные кейсы основанные на реальных данных компании. В 2021 году соревнование Sibur Challenge 2021 собрало 161 участника. Задачей поставленной перед участниками являлось создание предикативной модели для помесячного прогнозирования объемов закупок определенного типа товаров.
Решение задач прогнозирования
Для решения задачи прогнозирования (задача регрессии) была выбрана библиотека CatBoost разработанная компанией «Яндекс», использующая градиентный бустинг на деревьях решений. В связи с наличием большого количества категориальных признаков в предоставленных исходных данных модель CatBoostRegressor показалась наиболее удобной в работе.
https://yandex.com/company/blog/yandex-catboost/
RMSLE и работа с CatBoostRegressor
Если Вы работаете в Google Collab для работы с библиотекой CatBoost необходимо установить данный пакет при помощи команды
!pip install catboost
Подключаем CatBoost
from catboost import CatBoostRegressor
Для объявления модели CatBoostRegressor необходимо вызвать ее конструктор.
model = CatBoostRegressor(iterations=3000,
early_stopping_rounds=100,
grow_policy = 'Depthwise',
depth=8,
loss_function=RMSLE(),
cat_features= CAT_COLS,
random_state=RS,
l2_leaf_reg = 1,
learning_rate=0.03,
verbose=10,
eval_metric=RMSLE_val())
loss_function — параметр отвечающий за метрику ошибки при обучении модели.
eval_metric — параметр отвечающий за метрику обнаружения переобучения.
Библиотека CatBoost имеет также встроенные функции потерь. О их наличии можно ознакомиться в официальной документации :
https://catboost.ai/en/docs/concepts/loss-functions-regression
https://catboost.ai/en/docs/concepts/python-reference_catboostregressor_eval-metrics
Как можно было заметить функция RMSLE — не является встроенной в библиотеку CatBoost. Выходом из данной ситуации служат кастомные метрики, которые пользователь сам может создать для дальнейшего использования при обучении и валидации моделей. Но сначала разберемся что же такое RMSLE:
RMSLE (Root Mean Squared Log Error) — среднеквадратичная логарифмическая ошибка. Вычисляется по следующей формуле:
Вычисляя производную от данной функции получим, сложное с вычислительной точки зрения выражение
Для создания собственной «кастомной метрики», необходимо представить функцию вычисляющую метрику в виде объекта. Ниже представлен код на языке Python вычисляющий loss_function и evaluation_metric для CatBoostRegressor. Заметим, что вычисление производной было заменено на более упрощенное выражение.
import math
class RMSLE(object):
def calc_ders_range(self, approxes, targets, weights):
assert len(approxes) == len(targets)
if weights is not None:
assert len(weights) == len(approxes)
result = []
for index in range(len(targets)):
val = max(approxes[index], 0)
der1 = math.log1p(targets[index]) - math.log1p(max(0, approxes[index]))
der2 = -1 / (max(0, approxes[index]) + 1)
if weights is not None:
der1 *= weights[index]
der2 *= weights[index]
result.append((der1, der2))
return result
class RMSLE_val(object):
def get_final_error(self, error, weight):
return np.sqrt(error / (weight + 1e-38))
def is_max_optimal(self):
return False
def evaluate(self, approxes, target, weight):
assert len(approxes) == 1
assert len(target) == len(approxes[0])
approx = approxes[0]
error_sum = 0.0
weight_sum = 0.0
for i in range(len(approx)):
w = 1.0 if weight is None else weight[i]
weight_sum += w
error_sum += w * ((math.log1p(max(0, approx[i])) - math.log1p(max(0, target[i])))**2)
return error_sum, weight_sum
Теперь при работе с CatBoostRegressor model можно указывать как loss_function и eval_metric наш объект RMSLE() и RMSLE_VAL() соответственно:
model = CatBoostRegressor(iterations=3000,
early_stopping_rounds=100,
grow_policy = 'Depthwise',
depth=8,
loss_function=RMSLE(),
cat_features= CAT_COLS,
random_state=RS,
l2_leaf_reg = 1,
learning_rate=0.03,
verbose=10,
eval_metric=RMSLE_val())
params = {'l2_leaf_reg':[1,4,8],
'learning_rate': [0.03,0.5,0.1]
'depth':[6,8,10]
}
grid_search_res = model.grid_search(params, full_features['items'][FTS_COLS], full_features['items'].target, train_size=0.8)
Новости Joomla
👩💻 Вместе мы развиваем Joomla: станьте Joomfluencer!
Вы уверенно чувствуете себя перед камерой, динамичны, обаятельны и всегда улыбаетесь? Чувствуете себя искателем приключений, готовым поделиться своими исследованиями CMS Joomla!, взять интервью у видных деятелей сообщества, пообщаться лично или по видеосвязи с волонтерами Joomla или отправиться на поиски новых идей?
Joomla ищет одного или нескольких волонтеров, готовых вдохнуть новую жизнь в обсуждение Joomla, ее CMS, пользователей, сообщества и многого другого.
Возможны самые разные форматы и темы: шортсы, интервью, аналитика и разборы в режиме реального времени, быстрые советы и рекомендации, знакомство с миром Joomla, изучение открытого исходного кода… Нет никаких ограничений!
Joomla! уже активно представлена во многих социальных сетях:
— 155K подписчиков на Facebook,
— 55K подписчиков на X (ранее Twitter),
— 16K подписчиков на YouTube,
— 14K подписчиков на LinkedIn,
— 5,7K подписчиков в Instagram
а так же другие площадки ждут вас. Аккаунты Threads и Bluesky относительно новые, но их популярность только растёт!
А если хватит энергии, можно рассмотреть и TikTok!
❓ Итак, вы готовы?
👉 Свяжитесь с отделом маркетинга по адресу: marketing@community.joomla.org
Подробности в статье в Joomla Community Magazine.
@joomlafeed
0 Пользователей и 1 Гость просматривают эту тему.
- 10 Ответов
- 2036 Просмотров
Всем привет!
Неоднократно использовала фреймворк Helix3 и базовые бесплатные версии шаблонов от WarpTheme…
и вот, неожиданно (для себя) нашла такую ошибку.
В стандартных бесплатных шаблонах есть своя страница ошибки error.php, чаще всего она содержала логотип и кнопку «на главную».
Я создавала в материалах страницу 404, наполняла ее необходимым содержимым и заменяла error.php
на свою вот такую конструкцию:
вариант изменений №1
<?php
defined ('_JEXEC') or die ('resticted aceess');
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<?php
if ($this->_error->get('code') == '404') {
header("HTTP/1.0 404 Not Found");
echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id=ТУТнеобходимыйID');
exit;} ?>
когда я писала http://мойДомен/тутКакиеУгодноБуквы/, то получала содержимое своей 404 страницы и, казалось, все хорошо.
Но вот, когда я написала: http://мойДомен/index.php?option=content&view=article&id=5
то получила на белом экране:
«Error: Call to undefined method Joomla\CMS\Component\Exception\MissingComponentException::get(): Компонент не найден.«
если вернуть старую страницу ошибки, то соотвественно выдает ее.
Посоветуйте, пожалуйста, в чем, по Вашему мнению может быть проблема?
Есть даже подозрение, что дело то и не в Helix3
на всякий случай содержимое «родного» error прилагаю.
<?php
/**
* @package Helix3 Framework
* Template Name - Shaper Helix - iii
* @author JoomShaper http://www.joomshaper.com
* [member=126442]copyright[/member] Copyright (c) 2010 - 2015 JoomShaper
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
*/
//no direct accees
defined ('_JEXEC') or die ('resticted aceess');$doc = JFactory::getDocument();
$params = JFactory::getApplication()->getTemplate('true')->params;
//Error Logo
if ($logo_image = $params->get('error_logo')) {
$logo = JURI::root(). '/' . $logo_image;
$path = JPATH_ROOT . '/' . $logo_image;
} else {
$logo = $this->baseurl . '/templates/' . $this->template . '/images/presets/preset1/logo.png';
$path = JPATH_ROOT . '/templates/' . $this->template . '/images/presets/preset1/logo.png';
$ratlogo = $this->baseurl . '/templates/' . $this->template . '/images/presets/preset1/logo@2x.png';
}
//Favicon
if($favicon = $params->get('favicon')) {
$doc->addFavicon( JURI::base(true). '/' . $favicon);
} else {
$doc->addFavicon( $this->baseurl . '/templates/' . $this->template . '/images/favicon.ico' );
}
//Stylesheets
$custom_css_path = JPATH_ROOT . '/templates/' . $this->template . '/css/custom.css';
if (file_exists($custom_css_path)) {
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/custom.css' );
}
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/bootstrap.min.css' );
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/font-awesome.min.css' );
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/template.css' );
$doc->setTitle($this->error->getCode(). ' - '.$this->title);
$header_contents = '';
if(!class_exists('JDocumentRendererHead')) {
$head = JPATH_LIBRARIES . '/joomla/document/html/renderer/head.php';
if(file_exists($head)) {
require_once($head);
}
}
$header_renderer = new JDocumentRendererHead($doc);
$header_contents = $header_renderer->render(null);
//background image
$error_bg = '';
$hascs_bg = '';
if ($err_bg = $params->get('error_bg')) {
$error_bg = JURI::root(). $err_bg;
$hascs_bg = 'has-background';
}
?>
<!DOCTYPE html>
<html class="error-page" xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php echo $header_contents; ?>
</head>
<body>
<div class="error-page-inner <?php echo $hascs_bg; ?>" style="background-image: url(<?php echo $error_bg; ?>);">
<div>
<div class="container">
<?php if(isset($logo) && $logo ) { ?>
<div class="error-logo-wrap">
<img class="error-logo" alt="logo" src="<?php echo $logo; ?>" />
</div>
<?php } else { ?>
<p><i class="fa fa-exclamation-triangle"></i></p>
<?php } ?>
<h1 class="error-code"><?php echo $this->error->getCode(); ?></h1>
<p class="error-message"><?php echo $this->error->getMessage(); ?></p>
<a class="thm-btn bg-cl-1" href="<?php echo $this->baseurl; ?>/" title="<?php echo JText::_('HOME'); ?>"><i class="fa fa-chevron-left"></i> <?php echo JText::_('HELIX_GO_BACK'); ?></a>
<?php echo $doc->getBuffer('modules', '404', array('style' => 'sp_xhtml')); ?>
</div>
</div>
</div>
</body>
</html>
p.s.: да в шаблонах не с Helix3 такая же ситуация
вариант изменений №2
И если пойти по другому пути — скопировать error.php из /templates/system и заменить
if (!isset($this->error))
{
$this->error = JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
$this->debug = false;
}
на
if (($this->error->getCode()) == '404')
{
header('Location: index.php?option=com_content&view=article&id=ТУТнеобходимыйID');
exit;
}
то проблемы нет, но, как я понимаю это не лучшая страница ошибки и в этом случае он просто отправляет пользователя на страницу 404, а не отображает ее содержимое по любому адресу, чего, я собственно пытаюсь добиться…
« Последнее редактирование: 13.07.2020, 19:46:20 от tigra-uki »
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
Продолжу свой монолог немного в новом ключе.
Использовала вот такой код для страницы ошибки
<?php
defined ('_JEXEC') or die ('resticted aceess');?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
if($this->error->getCode() == '404'){
header("HTTP/1.1 404 Not Found");
echo file_get_contents(JURI::root().'error-404');
exit;
}
?>
поскольку, сайт у меня на двух языках, то я создала две страницы 404, обе с алиасом error-404,
создала пункты меню для них, но, все равно получаю все данные (модули и содержимое самой страницы 404) соответствующие первому установленному языку (без языкового префикса) какой бы язык я не выбрала…
делала так:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
if (($this->_error->getCode()) == '404') {
header("HTTP/1.0 404 Not Found");
header('Location: /index.php?option=com_content&view=article&id=42’);
exit;}$pos = strpos($url, $lang);
if($pos){
$id = 46;
$lang = JFactory::getLanguage();
$lng=$lang->getTag();
if($lng=="ru-RU") $id=42;
}
if (($this->_error->getCode()) == '404') {
header("HTTP/1.0 404 Not Found");
header("Location: /index.php?option=com_content&view=article&id=$id");
exit;}
?>
не сработало
может у кого-то будут идеи?
« Последнее редактирование: 22.07.2020, 20:44:48 от tigra-uki »
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
Но вот, когда я написала: http://мойДомен/index.php?option=content&view=article&id=5
Имя компонента всегда начинается с префикса com_, а у вас его нет
может у кого-то будут идеи?
Я не буду вас отговаривать что это так не делается, но все же делайте хотя бы правильно.
Получайте содержимое материалов через класс таблицы или напрямую SQL запросом.
Переменная $this->language содержит префикс текущего языка, вот и используйте его что бы получить материал нужного языка….
Записан
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Имя компонента всегда начинается с префикса com_, а у вас его нет
Я пребывала в уверенности (и даже все еще немного так думаю), что раз по этому адресу ничего нет, то оно должно было:
или кинуть на страницу ошибки 404 или перенаправить на ссылку ЧПУ. Иначе какой смысл, как мне кажется?
Я не буду вас отговаривать что это так не делается, но все же делайте хотя бы правильно
Ни в коем случае не спорю с Вами. Но я этот способ подсмотрела на одном очень известном сайте, где типа джумловодству учат, поэтому и подумать не могла, что это не правильно
Благодарю за ответ.
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
что это неправильно
Это с моей точки зрения неправильно, но вы делаете так как вы считаете нужный (PHP все стерпит).
Я пребывала в уверенности (и даже все еще немного так думаю), что раз по этому адресу ничего нет, то оно должно было:
или кинуть на страницу ошибки 404 или перенаправить на ссылку ЧПУ. Иначе какой смысл, как мне кажется?
Сейчас если перейти по адресу будет ошибка (и какое содержимое будет выводиться)?
Записан
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Это с моей точки зрения неправильно, но вы делаете так как вы считаете нужный (PHP все стерпит).
Да моя точка зрения, на самом деле, ничем не подкреплена, так что Ваша в данном случае я уверена — лучше.
Сейчас если перейти по адресу будет ошибка (и какое содержимое будет выводиться)?
Когда я начинала эту тему и писала что
то получила на белом экране:
«Error: Call to undefined method Joomla\CMS\Component\Exception\MissingComponentException::get(): Компонент не найден.»
если вернуть старую страницу ошибки, то соотвественно выдает ее.
то я использовала указанный мной вариант изменений №1, теперь же я использовала конструкцию с ‘error-404’
но проблема приобрела другой характер. Да, ссылка типа index.php?option=content&view=article&id=5 отдает мою страницу 404.
Но, как уже писала страница ошибки отображает весь сайт в русскоязычной версии, хотя ты используешь другой язык…
Извините, NewUsers, мне кажется, я создала дебри в своей же теме…
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
Теперь с вообще смутно представляю что вы вообще хотите сделать!
Записан
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Теперь с вообще смутно представляю что вы вообще хотите сделать!
я так и подозревала. Извините…
Итак, на данный момент я все еще использовала конструкцию:
<?php
defined ('_JEXEC') or die ('resticted aceess');?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
if($this->error->getCode() == '404'){
header("HTTP/1.1 404 Not Found");
echo file_get_contents(JURI::root().'error-404');
exit;
}
?>
и она хоть как-то работала…
И теперь основные моменты такие:
1) если на сайте два языка, как получить две разные страницы ошибки на двух языках соотвественно?
p.s: смотрела тему здесь тема как раз — 2 разных страницы 404 для мультиязычного сайта, что-то сочинила по аналогии,
создала две страницы на двух языках, ссылки на них в служебном меню…
но не сработало…
2) скорее этот вопрос второстепенный уже и да я понимаю что это уже не про 404, но этот аспект проявился одновременно…
почему теперь при включенном ЧПУ и рабочей ссылке на материал, например, o-nas.html
он все равно доступен по ссылке, например index.php?option=com_content&view=article&id=2
разве он не должен перенаправляться на o-nas.html?
« Последнее редактирование: 23.07.2020, 13:03:45 от tigra-uki »
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
если на сайте два языка, как получить две разные страницы ошибки на двух языках соотвественно?
/**
* @package Joomla.Site
* @subpackage Templates.protostar
*
* [member=126442]copyright[/member] Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/defined('_JEXEC') or die();
use \Joomla\CMS\Factory;
$sef = substr($this->language, 0, 2);
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select('introtext')->from('#__content as c')
->where('c.language = l.lang_code');
$query->innerJoin('#__languages as l ON l.sef = ' . $db->q($sef));
$db->setQuery($query);
echo $db->loadResult();
Это полный код файла error.php. Скопируйте код с 12 строки и до конца и вставьте в нужное место своего файла.
Да и еще, пункты меню для страниц 404 создавать не надо
Записан
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
если на сайте два языка, как получить две разные страницы ошибки на двух языках соотвественно?
Код: php
/**
* @package Joomla.Site
* @subpackage Templates.protostar
*
* @copyright Copyright (C) 2005 — 2020 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/defined(‘_JEXEC’) or die();
use \Joomla\CMS\Factory;
$sef = substr($this->language, 0, 2);
$db = Factory::getDbo();$query = $db->getQuery(true)
->select(‘introtext’)->from(‘#__content as c’)
->where(‘c.language = l.lang_code’);$query->innerJoin(‘#__languages as l ON l.sef = ‘ . $db->q($sef));
$db->setQuery($query);
echo $db->loadResult();
Спасибо, NewUsers! Буду пробывать
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
К сожалению, предложеный код у меня не сработал. И скорее, что дело не в коде, а в каких-то моих ошибках.
Но, как говорится, есть и хорошие новости — в итоге я сделала страницу ошибки, отдающую код 404 и работающую на двух языках.
1) Пункты меню для страниц ошибки я по совету NewUsers отключила.
(может этот момент не важен, но мне попадались решения, где публикацию как раз советовали..)
2) Создала одну страницу 404 для обоих языков.
3) Разместила в ней вместо текста через loadposition модуль в позиции и создала два таких модуля с тектами на двух языках и публикацией для языка соотвественно.
4) Использовала родную конструкцию страницы ошибки из шаблона Helix3, добавила свои стили и все заработало.
Еще раз благодарю NewUsers за поддержку и время для решения моей проблемы.
Надеюсь, этот опыт со слегка запутанными объяснениями кому-то да пригодится
код своей рабочей страницы ошибки прилагаю
<?php
/**
* @package Helix3 Framework
* Template Name - Shaper Helix - iii
* @author JoomShaper http://www.joomshaper.com
* Copyright (c) 2010 - 2015 JoomShaper
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
*/
//no direct accees
defined ('_JEXEC') or die ('resticted aceess');$doc = JFactory::getDocument();
$params = JFactory::getApplication()->getTemplate('true')->params;
//Error Logo
if ($logo_image = $params->get('error_logo')) {
$logo = JURI::root() . '/' . $logo_image;
$path = JPATH_ROOT . '/' . $logo_image;
} else {
$logo = $this->baseurl . '/templates/' . $this->template . '/images/presets/preset1/logo.svg';
$path = JPATH_ROOT . '/templates/' . $this->template . '/images/presets/preset1/logo.svg';
$ratlogo = $this->baseurl . '/templates/' . $this->template . '/images/presets/preset1/logo@2x.svg';
}
//Favicon
if($favicon = $params->get('favicon')) {
$doc->addFavicon( JURI::base(true) . '/' . $favicon);
} else {
$doc->addFavicon( $this->baseurl . '/templates/' . $this->template . '/images/favicon.ico' );
}
//Stylesheets
$custom_css_path = JPATH_ROOT . '/templates/' . $this->template . '/css/custom.css';
if (file_exists($custom_css_path)) {
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/custom.css' );
}
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/bootstrap.min.css' );
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/font-awesome.min.css' );
$doc->addStylesheet( $this->baseurl . '/templates/' . $this->template . '/css/template.css' );
$doc->setTitle($this->error->getCode() . ' - '.$this->title);
$header_contents = '';
if(!class_exists('JDocumentRendererHead')) {
$head = JPATH_LIBRARIES . '/joomla/document/html/renderer/head.php';
if(file_exists($head)) {
require_once($head);
}
}
$header_renderer = new JDocumentRendererHead($doc);
$header_contents = $header_renderer->render(null);
//background image
$error_bg = '';
$hascs_bg = '';
if ($err_bg = $params->get('error_bg')) {
$error_bg = JURI::root() . $err_bg;
$hascs_bg = 'has-background';
}
?>
<!DOCTYPE html>
<html class="error-page" xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php echo $header_contents; ?>
</head>
<body>
<div class="error-page-inner <?php echo $hascs_bg; ?>" style="background-image: url(<?php echo $error_bg; ?>);">
<div>
<div class="container">
<?php if(isset($logo) && $logo ) { ?>
<div class="error-logo-wrap">
<a href="<?php echo $this->baseurl; ?>/">
<img class="error-logo" alt="logo" src="<?php echo $logo; ?>" />
</a>
</div>
<?php } else { ?>
<p><i class="fa fa-exclamation-triangle"></i></p>
<?php } ?>
<h1 class="error-code"><?php echo $this->error->getCode(); ?></h1>
<p class="error-message"><?php echo $this->error->getMessage(); ?></p>
<?php echo $doc->getBuffer('modules', '404', array('style' => 'sp_xhtml')); ?>
</div>
</div>
</div>
</body>
</html>
« Последнее редактирование: 23.07.2020, 13:11:57 от tigra-uki »
Записан
Слишком сконцентрированное внимание необходимо разбавлять действием.
В этом руководстве мы расскажем о различных способах того, как в PHP включить вывод ошибок. Мы также обсудим, как записывать ошибки в журнал (лог).
Как быстро показать все ошибки PHP
Самый быстрый способ отобразить все ошибки и предупреждения php — добавить эти строки в файл PHP:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Что именно делают эти строки?
Функция ini_set попытается переопределить конфигурацию, найденную в вашем ini-файле PHP.
Display_errors и display_startup_errors — это только две из доступных директив. Директива display_errors определяет, будут ли ошибки отображаться для пользователя. Обычно директива dispay_errors не должна использоваться для “боевого” режима работы сайта, а должна использоваться только для разработки.
display_startup_errors — это отдельная директива, потому что display_errors не обрабатывает ошибки, которые будут встречаться во время запуска PHP. Список директив, которые могут быть переопределены функцией ini_set, находится в официальной документации .
К сожалению, эти две директивы не смогут отображать синтаксические ошибки, такие как пропущенные точки с запятой или отсутствующие фигурные скобки.
Отображение ошибок PHP через настройки в php.ini
Если ошибки в браузере по-прежнему не отображаются, то добавьте директиву:
display_errors = on
Директиву display_errors следует добавить в ini-файл PHP. Она отобразит все ошибки, включая синтаксические ошибки, которые невозможно отобразить, просто вызвав функцию ini_set в коде PHP.
Актуальный INI-файл можно найти в выводе функции phpinfo (). Он помечен как “загруженный файл конфигурации” (“loaded configuration file”).
Отображать ошибки PHP через настройки в .htaccess
Включить или выключить отображение ошибок можно и с помощью файла .htaccess, расположенного в каталоге сайта.
php_flag display_startup_errors on
php_flag display_errors on
.htaccess также имеет директивы для display_startup_errors и display_errors.
Вы можете настроить display_errors в .htaccess или в вашем файле PHP.ini. Однако многие хостинг-провайдеры не разрешают вам изменять ваш файл PHP.ini для включения display_errors.
В файле .htaccess также можно включить настраиваемый журнал ошибок, если папка журнала или файл журнала доступны для записи. Файл журнала может быть относительным путем к месту расположения .htaccess или абсолютным путем, например /var/www/html/website/public/logs.
php_value error_log logs/all_errors.log
Включить подробные предупреждения и уведомления
Иногда предупреждения приводят к некоторым фатальным ошибкам в определенных условиях. Скрыть ошибки, но отображать только предупреждающие (warning) сообщения можно вот так:
error_reporting(E_WARNING);
Для отображения предупреждений и уведомлений укажите «E_WARNING | E_NOTICE».
Также можно указать E_ERROR, E_WARNING, E_PARSE и E_NOTICE в качестве аргументов. Чтобы сообщить обо всех ошибках, кроме уведомлений, укажите «E_ALL & ~ E_NOTICE», где E_ALL обозначает все возможные параметры функции error_reporting.
Более подробно о функции error_reporting ()
Функция сообщения об ошибках — это встроенная функция PHP, которая позволяет разработчикам контролировать, какие ошибки будут отображаться. Помните, что в PHP ini есть директива error_reporting, которая будет задана этой функцией во время выполнения.
error_reporting(0);
Для удаления всех ошибок, предупреждений, сообщений и уведомлений передайте в функцию error_reporting ноль. Можно сразу отключить сообщения отчетов в ini-файле PHP или в .htaccess:
error_reporting(E_NOTICE);
PHP позволяет использовать переменные, даже если они не объявлены. Это не стандартная практика, поскольку необъявленные переменные будут вызывать проблемы для приложения, если они используются в циклах и условиях.
Иногда это также происходит потому, что объявленная переменная имеет другое написание, чем переменная, используемая для условий или циклов. Когда E_NOTICE передается в функцию error_reporting, эти необъявленные переменные будут отображаться.
error_reporting(E_ALL & ~E_NOTICE);
Функция сообщения об ошибках позволяет вам фильтровать, какие ошибки могут отображаться. Символ «~» означает «нет», поэтому параметр ~ E_NOTICE означает не показывать уведомления. Обратите внимание на символы «&» и «|» между возможными параметрами. Символ «&» означает «верно для всех», в то время как символ «|» представляет любой из них, если он истинен. Эти два символа имеют одинаковое значение в условиях PHP OR и AND.
error_reporting(E_ALL);
error_reporting(-1);
ini_set('error_reporting', E_ALL);
Эти три строки кода делают одно и то же, они будут отображать все ошибки PHP. Error_reporting(E_ALL) наиболее широко используется разработчиками для отображения ошибок, потому что он более читабелен и понятен.
Включить ошибки php в файл с помощью функции error_log ()
У сайта на хостинге сообщения об ошибках не должны показываться конечным пользователям, но эта информация все равно должна быть записана в журнал (лог).
Простой способ использовать файлы журналов — использовать функцию error_log, которая принимает четыре параметра. Единственный обязательный параметр — это первый параметр, который содержит подробную информацию об ошибке или о том, что нужно регистрировать. Тип, назначение и заголовок являются необязательными параметрами.
error_log("There is something wrong!", 0);
Параметр type, если он не определен, будет по умолчанию равен 0, что означает, что эта информация журнала будет добавлена к любому файлу журнала, определенному на веб-сервере.
error_log("Email this error to someone!", 1, "someone@mydomain.com");
Параметр 1 отправит журнал ошибок на почтовый ящик, указанный в третьем параметре. Чтобы эта функция работала, PHP ini должен иметь правильную конфигурацию SMTP, чтобы иметь возможность отправлять электронные письма. Эти SMTP-директивы ini включают хост, тип шифрования, имя пользователя, пароль и порт. Этот вид отчетов рекомендуется использовать для самых критичных ошибок.
error_log("Write this error down to a file!", 3, "logs/my-errors.log");
Для записи сообщений в отдельный файл необходимо использовать тип 3. Третий параметр будет служить местоположением файла журнала и должен быть доступен для записи веб-сервером. Расположение файла журнала может быть относительным путем к тому, где этот код вызывается, или абсолютным путем.
Журнал ошибок PHP через конфигурацию веб-сервера
Лучший способ регистрировать ошибки — это определить их в файле конфигурации веб-сервера.
Однако в этом случае вам нужно попросить администратора сервера добавить следующие строки в конфигурацию.
Пример для Apache:
ErrorLog "/var/log/apache2/my-website-error.log"
В nginx директива называется error_log.
error_log /var/log/nginx/my-website-error.log;
Теперь вы знаете, как в PHP включить отображение ошибок. Надеемся, что эта информация была вам полезна.
