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

Лёхха

  • Новичок
  • 7
  • 0 / 0
Уважаемые гуру Joomla!

Как в Joomla 1.5 осуществлять сабж? Я действую так:
Код: php
$myObj = new MyClass;

$session = &JFactory::getSession();
$session->set('obj', $myObj);

Если потом попытаться извлечь объект из сессии вот так:
Код: php
$obj = $session->get('obj');

то получаем, что $obj имеет тип __PHP_Incomplete_Class, и значения полей сохраняются, но вот методы уже вызвать нельзя, вылезает ошибка, что "The script tried to execute a method or access a property of an incomplete object..."

Все эти операции делаются в контроллере, перед запуском метода execute контроллера я вставил оператор
Код: php
JLoader::register('MyClass', 'path_to_MyClass.php');
он, очевидно, работает, но это, очевидно, не помогает, чтобы объект правильно десериализовался из сессии.

Кто-нибудь сталкивался с подобной проблемой? Есть ли какая-нибудь успешная методика ее решения? Спасибо!
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Вот топик с обсуждением причины проблемы на оф. форуме: Storing Objects in the Session generates Fatal Errors. Цитирую:

Цитировать
Unfortunately you CANNOT rectify this error with a call to JLoader::register() because the problem is encountered long before Joomla executes a single line of your code.
What seems to be happening is that during initialization, Joomla executes a session_start which loads the session data... but when it encounters an instance of your application defined object, it throws up its hands and says "i don't know what this is". It passes its complaint on to the Joomla implementation of the __autoload() function but Joomla can't find your class definition either since your code has not executed yet so there's no way you can have primed autoload to find your function.
Obviously the short answer is to not store object variables in the session, but that hardly seems graceful or appropriate. I am wondering if anyone else has figured out a workaround or fix for this that doesn't involve hacking the core.
At the very least, I think Joomla should provide some kind of hook that would allow one to avoid this problem.
*

Лёхха

  • Новичок
  • 7
  • 0 / 0
Вот топик с обсуждением причины проблемы на оф. форуме: Storing Objects in the Session generates Fatal Errors. Цитирую:
Спасибо, я видел этот пост :) И там, к сожалению, не сказано, как решать проблему... Я так понимаю, что ее решение никому не нужно, т.к. ни в англ. ни в российском интернете нет совершенно никакой полезной инфы по этому поводу.

Однако как еще передавать от странице к странице объекты, кроме как не через сессию?
*

beliyadm

  • Легенда
  • 9659
  • 1659 / 66
  • Севастополь == Россия
Однако как еще передавать от странице к странице объекты, кроме как не через сессию?
куки?
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

VETERINAR

  • Давно я тут
  • 855
  • 165 / 14
  • Kiss my shiny metal ass!
куки?

Очень небезопасно. Но действительно можно. userxp писал как это можно сделать.

Ещё вариант (не выход, но вариант) - хранить в базе данных сериализованный объект в таблице типа:

|session_id|object|

И вытягивать по id сессии на каждой страничке.
« Последнее редактирование: 21.05.2009, 16:39:23 от VETERINAR »
*

beliyadm

  • Легенда
  • 9659
  • 1659 / 66
  • Севастополь == Россия
userxp - он же кстати в той теме (которую и вспомнил) писал что умеет работать через сессию, но там была 1.0.. может уже научился и в 1.5
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

VETERINAR

  • Давно я тут
  • 855
  • 165 / 14
  • Kiss my shiny metal ass!
*

Лёхха

  • Новичок
  • 7
  • 0 / 0
Вроде решил... Итак, перед вызовом execute() контроллера вставляем операторы
Код: php
JLoader::register('MyClass', 'path_to_MyClass.php');

Далее, (у меня в контроллере) созданный объект пихаем в сессию вот так:
Код: php
$myObj = new MyClass;

$session = &JFactory::getSession();
$session->set('myObject', serialize($myObj));

Когда нам нужно восстановить объект из сессии, делаем так:
Код: php
$session = &JFactory::getSession();
$myObj = unserialize($session->get('myObject'));

Вроде все нормально восстанавливается...
*

smart

  • Администратор
  • 6485
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Вроде все нормально восстанавливается...
при условии, что описание класса регистрируется до того, как происходит обращение к объекту в сессии... а если вдруг кто-то к нему обратиться до?
*

Лёхха

  • Новичок
  • 7
  • 0 / 0
при условии, что описание класса регистрируется до того, как происходит обращение к объекту в сессии... а если вдруг кто-то к нему обратиться до?
для этого в основном файле моего компонента (до вызова execute() контроллера), в котором собственно все это и происходит, регистрируются все классы моей библиотеки с помощью JLoader::register, поэтому, когда я в контроллере читаю/пишу сессию, все работает как надо... во всяком случае, я проверил, пока работает :) Хотя кто его знает, что там творится в этой Джумле.

Отсутствие доков просто убивает, комментов в коде нет, сейчас просматривал код JBuffer, чтобы понять, как он работает - функция открытия буфера с 4-я обязательными параметрами, 3 из которых вообще не используются! Естественно, все это не документировано. Зато параметры называются $mode, $options и &$opened_path!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

как через AJAX запрос получить только данные из функции, без HTML кода?

Автор lottis

Ответов: 7
Просмотров: 3221
Последний ответ 26.03.2012, 02:40:54
от lottis
JSession, $_SESSION и captcha

Автор Helios

Ответов: 1
Просмотров: 1835
Последний ответ 17.02.2011, 16:24:43
от Stomp
Обновление модуля через AJAX

Автор malus

Ответов: 9
Просмотров: 3426
Последний ответ 26.03.2010, 20:11:26
от enshtein
передача данных в компоненте через GET и POST?

Автор NTFS

Ответов: 1
Просмотров: 2312
Последний ответ 12.03.2010, 10:02:28
от Mitrich
Как заставить компонет через Views - tmpl обрабатывать конструкцию jdoc:include type="modules"

Автор Арчик

Ответов: 4
Просмотров: 1945
Последний ответ 06.11.2009, 20:59:29
от Арчик