Как задать сессию внутри компонента/модуля Joomla и работать с ней в постороннем файле

Как задать сессию внутри компонента/модуля Joomla и работать с ней в постороннем файле

Рассмотрим способы задания, чтения сессий внутри 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'); мы их синхронизировали в компоненте и постороннем файле.

| | Как задать сессию внутри компонента/модуля Joomla и работать с ней в постороннем файле | Рассмотрим способы задания, чтения сессий внутри Joomla, а также проблемы связанные с доступом к сессиям из компонента к обычному файлу. При работе | http://blogprogram.ru/wp-content/uploads/2017/07/736-131x131.jpg

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>