Новости Joomla

Загадочный параметр $live_site в configuration.php Joomla

Загадочный параметр $live_site в configuration.php Joomla

Давным-давно, когда Joomla ещё была маленькой, в неё внедрили параметр $live_site. В ней хранился домен текущего сайта на случай, если Joomla не могла его определить из-за неверной настройки сервера. Нужно это было для разных SEO-компонентов, для использования редиректов и т.д.

Со временем для работы собственно сайта этот параметр перестал быть нужным. Уже в начале 2010-х стали встречаться рекомендации оставлять этот параметр пустым, дабы оный не привёл к лишним проблемам и путанице. Тем более, в web-админке нет места, где его можно указать или посмотреть его значение. Только в configuration.php, а туда смотрят не часто.

Однако, параметр всё же остался в ядре Joomla. Зачем он нужен? А нужен он в 2-х случаях:

  • для работы класса Joomla\CMS\Uri\Uri, который часто используется в коде Joomla для работы методов
    Uri::root() и
    Uri::base(), а значит может влиять и на работу в том числе ajax-скриптов.
  • для работы Joomla в CLI - командной строке сервера. В случае если вы используете в вашем CLI-плагине методы опять-таки класса Uri, то CLI ничего не знает о текущем домене, так как запускается вне web-сервера.

Поэтому домен нужно указывать принудительно. Либо с помощью параметра командной строки

--live-site, например,
—live-site=https://site.ru/. Со слешем на конце, иначе в CLI адрес сайта станет
https://site.rujoomla.php.Либо в параметре
$live_site в файле configuration.php, так как
CliApplication берёт настройку оттуда, если параметр команды не указан или пуст.

⚠️ Иначе в качестве хоста и url класса Uri будет установлено https://joomla.invalid/set/by/console/application. В самом же коде команды получить параметр

$live_site можно из объекта приложения

<?php protected function doExecute(InputInterface $input, OutputInterface $output): int { //... $live_site = $this->getApplication()->get('live_site'); //... }

и исходя из этого строить дальнейшую логику.

0 Пользователей и 1 Гость просматривают эту тему.
  • 2 Ответов
  • 2281 Просмотров
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Подскажите пожалуйста как можно программно авторизоваться на сайте так, чтобы в таблице #__users не обновилось значение последнего визита.
Авторизация собственно происходит таким образом.
Код
$instance = JUser::getInstance();
$instance->load($robotId);

// If _getUser returned an error, then pass it back.
if ($instance instanceof Exception) {
throw new Exception($instance->getMessage(), $instance->getCode());
return false;
}

// If the user is blocked, redirect with an error
if ($instance->get('block') == 1) {
throw new Exception(JText::_('JERROR_NOLOGIN_BLOCKED'), 500);
return false;
}

// Chek the user can login.
if (!$result = $instance->authorise('core.login.admin')){
throw new Exception(JText::_('JERROR_LOGIN_DENIED'), 500);
return false;
}

// Mark the user as logged in
$instance->set('guest', 0);

// Check to see the the session already exists.
JFactory::getApplication()->checkSession();

// Register the needed session variables
$session = JFactory::getSession();
$session->set('user', $instance);

// Create a Database object
$db = JFactory::getDBO();

// Update the user related fields for the Joomla sessions table.
$db->setQuery(
'UPDATE '.$db->quoteName('#__session').
'   SET '.$db->quoteName('guest') .'='.$db->quote($instance->get('guest')).',' .
'     '.$db->quoteName('username') .'='.$db->quote($instance->get('username')).',' .
'     '.$db->quoteName('userid') .'='.$db->quote((int) $instance->get('id')).
' WHERE '.$db->quoteName('session_id') .'='.$db->quote($session->getId())
);
$db->query();
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
Скорее всего никак, лично я предлагаю перед авторизацией, запомнить время последнего визита, после сделать запрос что бы поставить это время обратно...
*

Aeliot

  • Захожу иногда
  • 107
  • 2 / 0
Гы-гы-гы... ;D
Все таки победил.
Правда нужно сделать лирическое отступление. Этот скрипт используется только для программной обработки данных кроном, иначе нужно делать то, что предложил Instaan*DRINK*

Так вот, что сделано. Для начала, выкидываем из приведенного кода обновление таблицы сессии (#__session). Зачем нам светить нашего робота в списке последних авторизованных пользователей? Нам это не надо.
Затем, после проведения необходимых операций вместо стандартной схемы выхода пользователя из системы аля...
Код: php
JFactory::getApplication()->logout($robotId);
делаем следующее:
Код: php-brief
// kill user
$session->set('user', null);
// kill session
$session->destroy();

И конечно, если скрипт отдает какие-то данные, то в начале скрипта нужно добавить буфферизацию вывода,
Код: php
ob_start();
чтобы при убивании сессии не иметь проблем с заголовками.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться