Рассмотрим способы задания, чтения сессий внутри Joomla, а также проблемы связанные с доступом к сессиям из компонента к обычному файлу.
При работе с сессиями внутри компонентов можно использовать обычный алгоритм:
$_SESSION['doska'] = 'rub'; //задаем сессию
echo $_SESSION['doska']; //получаем ее значение
Этот способ будет отлично работать внутри всего вашего компонента и файлов, которые инклудятся к нему. Но если вы создадите посторонний файл сайт.ру/1/1.php и попытаетесь там написать такой код (т.е. вывести уже заданную сессию):
<?php header('Content-Type: text/html; charset=utf-8');
session_start();
echo $_SESSION['doska'];
?>
То ее не будет существовать, как будто вы ее и не задавали в компоненте. Хотя обычные сессии выводились бы всех местах сайта. Потратил целый день на поиск решения данной проблемы и выяснил следующее.
Во-первых в компоненте Joomla session_start() стартует автоматически с уникальным идентификатором. Именно поэтому мы и не сможем получить значение нашей переменной из файла сайт.ру/1/1.php - у нас разные идентификаторы.
Во-вторых, теперь нам нужно создавать и использовать сессии в Joomla правильно - с помощью фрэймворка. Делается это так:
$session =& JFactory::getSession(); //получаем объект для работы с сессиями
$session->set('myvar', 'yestrue'); //создаем сессию myvar со значением yestrue
echo $session->get('myvar'); //выводим значение сессии myvar
echo $session->getId(); //получаем идентификатор сессии
А теперь собственно и решение проблем связанных с сессиями в Joomla 3:
1. В компоненте не нужно вызывать функцию session_start(); - она создается автоматически со своим идентификатором.
2. Запускаем обработчик сессий в компоненте и задаем переменной myvar значение yes:
$session =& JFactory::getSession();
$session->set('myvar', 'yes');
echo $session->get('myvar');
echo $session->getId();
3. Теперь создадим посторонний файл, например : сайт.ру/1/1.php с содержимым:
<?php header('Content-Type: text/html; charset=utf-8');
//подключаем фрэймворк Joomla к этому файлу
define( '_JEXEC', 1 );
define('JPATH_BASE', $_SERVER['DOCUMENT_ROOT']);
define( 'DS', DIRECTORY_SEPARATOR );
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$mainframe = JFactory::getApplication('site');
$session =& JFactory::getSession();
//$session->set('myvar', 'новое значение');
echo $session->get('myvar');
echo $session->getId();
?>
Проверки
Теперь если в компоненте зададим какую-нибудь сессию, она выведется и в сайт.ру/1/1.php. Если поменяем ее значение в сайт.ру/1/1.php, то изменения отобразятся и в компоненте. В общем так и должны работать обычные сессии, но фрэймворк Joomla создает собственные session_id, а за счет строки $mainframe = JFactory::getApplication('site'); мы их синхронизировали в компоненте и постороннем файле.
Добавить комментарий