Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przechowywanie obiektu w sesji
Forum PHP.pl > Forum > PHP
yacoos
Witam.
Na początku wypada się przyznać, że pierwszy raz próbuję przechować obiekt w sesji - jest to konkretnie obiekt QuickForm.
Na początku dostawałem worning o session_start. Więc teraz mam już najpierw :

  1. <?php
  2. include "HTML/QuickForm.php";
  3. include 'HTML/QuickForm/Renderer/ArraySmarty.php';
  4. include '../smarty/Smarty.class.php';
  5. ?>


a dopiero później:
  1. <?php
  2. session_name("xxx");
  3. ?>

Próbowałem już rozmaitych kombinacji i aktualnie sprawa wygląda tak - mam formularz tworzony quickformem i smarty. Nie wiem czy to potrzebne, ale obiekt tworzony jest od razu w sesji:
  1. <?php
  2. $_SESSION['formularz'] = new HTML_QuickForm('form_add_0', 'POST', 'test2.php?action=dodaj&krok=1');
  3. ?>


Pod tym formularzem wyświetlam sesję i jej zawartość jest poprawna. Dla uproszczenia plik test 2 zawiera już tylko:
  1. <?php
  2. include "HTML/QuickForm.php";
  3. include 'HTML/QuickForm/Renderer/ArraySmarty.php';
  4. include '../smarty/Smarty.class.php';
  5. session_name("skylan2");
  6. echo "<pre>";
  7. print_r($_SESSION);
  8. print_r(unserialize($_SESSION['serial']));
  9. echo "</pre>";
  10. ?>

I tutaj niestety zarówno bezpośrednio jak po zdeserializowaniu widzę zawsze: [__PHP_Incomplete_Class_Name] => html_quickform_text
[0] => __PHP_Incomplete_Class Object
itd..
Bardzo proszę o jeszcze jakieś sugestie bo już zupełnie zabrakło mi pomysłów.

Pozdrawiam,
yacoos
Sedziwoj
Najpierw cytacik z manuala:
Cytat
Thus, you need to call session_name() for every request (and before session_start() or session_register() are called).


A co do problemu to obiekt zapisywany do sesji jest automatycznie serializowany, przez wywołanie metod __sleep() tegoż obiektu, jeśli nie ma zdefiniowanej to wywoływana jest domyślna metoda.
Jeśli autorzy klasy HTML_QuickForm nie przewidzieli możliwości serializacji (a też nie zablokowali, co się często zapomnieć zdarza) to rezultat może być różny.

A do tego nie:
  1. <?php
  2. print_r(unserialize($_SESSION['serial']));
  3. ?>

a
  1. <?php
  2. print_r($_SESSION['serial'])
  3. ?>
yacoos
Witam i dziękuję za odpowiedź.
Co do cytaciku z manuala - zaminiłem..
Ale niestety dalej mam:
  1. <?php
  2. html_quickform Object
  3. (
  4. [_elements] => Array
  5. (
  6. [0] => __PHP_Incomplete_Class Object
  7. (
  8. [__PHP_Incomplete_Class_Name] => html_quickform_text
  9. [_attributes] => Array
  10. (
  11. [class] => formularz
  12. [onclick] => showKal(this)
  13. [name] => data
  14. [type] => text
  15. [value] => 19-05-2007
  16. )
  17.  
  18. [_tabOffset] => 0
  19. [_tab] =>  
  20. [_lineEnd] => 
  21.  
  22. [_comment] => 
  23. [_label] => 
  24. [_type] => text
  25. [_flagFrozen] => 
  26. [_persistantFreeze] => 1
  27. )
  28.  
  29. [1] => __PHP_Incomplete_Class Object
  30. ......
  31. ?>

Zatem co jeżeli QuickForm nie przewidzial sleep i wakeup ?
Są jeszcze jakieś inne opcje?

Pozdrawiam.
Sokal
Nie za bardzo rozumiem co Ty chcesz zrobić.

W tytule jest jak przechowywać obiekt w sesji. No to na mój rozum to serializujesz i przypisujesz do zmiennej O.o

Czyli, np. tak:
Kod
$_SESSION['obiekt'] = serialize($obiekt);


Może Ci się nie serializuje przy przypisaniu do sesji, też miałem kiedyś z tym problem... Spróbuj serializować winksmiley.jpg
yacoos
Witam,
Czy srializuje, czy nie serializuje.. przy odczycie mam już __PHP_Incomplete_Class Object zamiast poprawnego obiektu.
Chcę zapisać obiekt klasy QuickForm w jednym miejscu i odczytać go w innym..

Pozdrawiam,
mike
Przed unserialize() PHP musi wiedzieć o tym obiekcie wszystko, to znaczy, że musi mieć definicję jego klasy.

Zanim odserializujesz tego stringa zaincluduj plik z klasą tego obiektu.
Sedziwoj
@mike jeśli dobrze patrzę to include'uje odpowiednie pliki.
Kłopot może być taki jak wspomniałem, nie uwzględnienie serializacji.
np. właściwości prywatne nie ulegają serializacji automatycznej, zasoby pewnie parę innych rzeczy, więc jeśli coś się znajdzie w tych nie zapisanych w sesji danych to mamy niepełny obiekt. Ale właśnie czytam dokumentacje i chyba jednak może też być problem z brakiem dostępności definicji klasy.
Polecam do lekturki:
unserialize" title="Zobacz w manualu PHP" target="_manual
yacoos
Witam ponownie..
Sam problem rozwiązałem już inaczej.. Niemniej jednak dalej męczą mnie te obiekty w sesji..
Doszedłem wczoraj do tego że jeżeli tylko stworzyłem obiekt QuickForm - to po zapisaniu do sesji i odtworzeniu wszystko było OK.
Jeżeli jednak skorzystałem z jakiejś metody np. addElement - wtedy odtwarzany obiekt był niekompletny.
Może to na coś Was naprowadzi smile.gif

Pozdrawiam.
Ace
Hm, to może w obiekcie QuickForm istnieją inne obiekty np: Jakieś obiekty określające typy pól (Nie wiem, nie znam quickform, strzelam) I może one też muszą być wcześniej zaincludowane?
Sedziwoj
Ace raczej zakładam że include'ują tak samo więc jak normalnie starcza do utworzenia obiekru to przy odserializowaniu też.
Kłopot jest raczej ten co mówię, i co potwierdza wypowiedź yacoos'na. Mianowicie autorzy klasy ( a ma zapewne dane prywatne/chronione) nie zapewnili obsługi serializacji, a standardowa sobie nie radzi (a jak to chyba często bywa nie jest blokowana serializacja, a powinna jak się jej nie przewiduje).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.