Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100

    Come passare gli oggetti tra pagine e pagine

    Ciao a tutti,

    sto realizando un cms modulare, molto specifico, il quale mi servirà anche come progetto d'esame. La tecnologia impiegata è PHP e AJAX (attraverso JQuery).

    Sto utilizzando le classi come vincolo del progetto e sono incappato in un problemino particolare ovvero:

    1 fase: la fase di login è fatta tramite ajax, quindi una volta loggato, creo un oggetto di typo user e tramite la variabile $_SESSION['user'] la rendo globale, poi vengo mandato alla pagina index.php?page=main, la quale è generata per mezzo della classe HTMLGenerator


    Codice PHP:
    $fields setURI$uri );
            
    $user $_SESSION['user'];

    switch ( 
    getUriPage($fields) ) {
      case 
    "main"
        
    $metaTag = array("language"=>"it");
        
    $html = new HTMLGenerator("AREA RISERVATA::KICK BOXING TEAM");
        
    $html->setMeta($metaTag);
        
    $html->setContent(getUriPage($fields));
        
    $html->setUser($user);
        
    $html->outputPage();
        break; 
    Come si può notare grazie a:

    Codice PHP:
    $user $_SESSION['user']; 
    ho ricreato l'oggetto $user e fino a qua tutto chiaro, il problema viene adesso.
    Nel metodo

    Codice PHP:
    $html->outputPage(); 
    è presente un require di una pagina per il template

    ora se io volessi stampare per esempio i dati di $user in teoria mi basterebbe fare

    Codice PHP:
    $user->getUsername() 
    il problema è che così facendo non riconosce l'oggetto $user e mi stampa un errore del tipo

    Notice: Undefined variable: user in D:\Programmi\Apache Software Foundation\Apache 2.2\htdocs\KBSalso\admin\html\index.php on line 11

    Fatal error: Call to a member function getUsr() on a non-object in D:\Programmi\Apache Software Foundation\Apache 2.2\htdocs\KBSalso\admin\html\index.php on line 11
    per rimediare a questo problema ho creato 2 metodi per la classe HTMLGenerator, uno che setti la variabile User e l'altro che lo legga

    Ma perché non posso usare semplicemente $user->getUsername ??????????
    E' vero che faccio require ma in teoria il require anche se di un'altra pagina dovrebbe cmq vedere l'oggetto...

    Vi prego datemi delle spiegazioni...
    Non è possibile che si debba sempre usare $_SESSION

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    forse riesci cn serialize.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100
    Nada ho provato ad usare serialize e unserialize ma proprio mi schifa...

  4. #4
    io proverei in questo modo: convertire l'oggetto user in array (serializzato) ogni qualvolta deve essere passato in sessione. Quando volessi recuperare l'oggetto per il richiamo dei metodi, convertirei l'array serializzato in object con un cast sul tipo di classe User

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100
    io proverei in questo modo: convertire l'oggetto user in array (serializzato) ogni qualvolta deve essere passato in sessione. Quando volessi recuperare l'oggetto per il richiamo dei metodi, convertirei l'array serializzato in object con un cast sul tipo di classe User
    Allora vediamo se ho capito:

    Maje grazie per l'imbeccata solo che se io anche senza serializzare i dati faccio per esempio

    Codice PHP:
      $user $_SESSION['user']; 
    Dove in session è stato memorizzato in precedenza l'oggetto $user, tutto funziona infatti se stampo $_SESSION['user'] il risultato è il seguente:

    Array ( [user] => User Object ( [user_idrivate] => 1 [usernamerivate] => matteo.furletti [passwordrivate] => 30eeca1567998f84ab250cd3ec69e03b [authenticationrivate] => 1 [emailrivate] => matteo.furletti@gmail.com [tokenrivate] => 30eec )
    Il mio problema è un altro ovvero, la mia pagina index.php è fissa, cambiando il parametro page=xxx nella query string, dovrei visualizzare la mia pagina infatti se io passo page=main come nell'esempio sottostante

    index.php?page=main
    con il seguente codice:

    Codice PHP:
    $fields setURI$uri );
            
    $user $_SESSION['user'];

    switch ( 
    getUriPage($fields) ) {
      case 
    "main"
        
    $metaTag = array("language"=>"it");
        
    $html = new HTMLGenerator("AREA RISERVATA::KICK BOXING TEAM");
        
    $html->setMeta($metaTag);
        
    $html->setContent(getUriPage($fields));
        
    $html->outputPage();
        break; 
    La pagina mi viene creata correttamente.... tanto il metodo $html->outputPage();

    Codice PHP:
    function outputPage() {
        echo 
    $this->doctype.$this->newLine.
            
    '<html xmlns="http://www.w3.org/1999/xhtml">'.$this->newLine.
            
    '<head>'.$this->newLine.
            
    '<title>'.$this->titlePage.'</title>'.$this->newLine.
            
    '<meta http-equiv="Content-Type" content="text/html; charset='.$this->charset.'" />'.$this->newLine.
            
    $this->getMeta().
            
    $this->getScript().
            
    $this->getCss().
            
    '</head>'.$this->newLine.
            
    '<body>'.$this->newLine;
                                            
        
    $this->getContent(); 
                                            
        echo 
    '</body>'.$this->newLine.
               
    '</html>';                    
    }

    function 
    getContent() {
        
    $_SESSION['page'] = $this->contentPage;
        include(
    'html/index.php');  
      } 
    Come puoi notare con getContent(); vado ad eseguire l'include di una pagina ovvero html/index.php, il quale contiene il template da me realizzato...

    ED E' PROPRIO IN QUESTA PAGINA MALEFICA 'html/index.php' CHE PERDO I RIFERIMENTI AGLI OGGETTI CREATI NELLA PAGINA PRINCIPALE, L'UNICO MODO E' UTILIZZARE $_SESSION

    La domanda che mi pongo è la seguente: Con include io includo una porzione di codice messo da un altra parte, ma non vado in una nuova pagina....

    E non so come fare

  6. #6
    ok, allora proverei una cosa del genere:

    Codice PHP:
    //implemetare questi metodi 
    class User 
    {
    public function 
    __sleep() {
    // actions to perform when serialized (e.g. close database connection)
    }

    public function 
    __wakeup() {
    // actions to perform when unserialized (e.g. reopen database connection)
    }
    }

    //dove crei la sessione e recuperi i dati utente
    $_SESSION['object'] = serialize(new User());

    //in html/index.php
    $object unserialize($_SESSION['object']); 
    Guarda qui per i magic method:


    http://www.php.net/manual/en/language.oop5.magic.php

    Forse potresti provare un casting, ma questo non l'ho ancora verificato :

    Codice PHP:
    <?php
    function cast_class($object$newclass)
    {
        if( !
    is_object($object) )
        {
            
    trigger_error('cast_class expects parameter 1 to be object, ' gettype($object) . ' given'E_USER_WARNING);
            return 
    false;
        }
        if( !
    class_exists($newclass) )
        {
            
    // We'll save unserialize the work of triggering an error if the class does not exist
            
    trigger_error('Class ' $newclass ' not found'E_USER_ERROR);
            return 
    false;
        }
        
    $serialized_parts explode(':'serialize($object));
        
    $serialized_parts[1] = strlen($newclass);
        
    $serialized_parts[2] = '"' $newclass '"';
        return 
    unserialize(implode(':'$serialized_parts));
    }


    ?>

    $newclass = 'la tua classe user';
    $userData = cast_class($object, $newclass);
    occhio perchè serializzare un oggetto in PHP non è molto semplice: controlla anche che il costruttore della classe user, che dovrebbe essere qualcosa tipo:

    Codice PHP:
    private $_dato1;
    private 
    $_dato2;

    public function 
    __construct($d1$d2) {

       
    $this->_dato1 $d1;
       
    $this->_dato2 $d2;



  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100
    Grazie Maje molto interessante...

    Solo una questione, la classe User in effetti ha il costruttore come dici tu, implemento i magici metodi (lol) e poi se non ho capito male li lascio vuoti, giusto?? infatti serviraqnno poi per la funzione serialize()...

    //dove crei la sessione e recuperi i dati utente
    $_SESSION['object'] = serialize(new User());
    Questi li devo mettere nella pagina di login per l'esattezza quando verifico se l'utente è presente oppure no, solo che invece che new User() metto l'oggetto creato... Perfetto...

    Scusa la mia ingoranza ma a cosa potrebbe servire il cast... questa cosa non mi è chiara, in teoria con unserialize dovrei recuperare l'oggetto...

    Adesso analizzo il tutto e poi appena riesco posto... Sperando che sia la soluzione giusta

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100
    Marco forse ho capito a cosa serve il casting, ma in teoria se metto l'oggetto dalla sessione nella variabile utilizzando serialize() e unserialize(), basta in teoria modificare la classemettendo __sleep con return array(campo1,campo2...) e poi quando lo prendo basta k cancello l'oggetto dalla sessione e lo rimetto.... so che è brutto a vedersi ma almeno evito il cast...

    Ho detto una cagata o secondo te ha senso ????

  9. #9
    esatto, se riesci a sistemare con la serializzazione e i metodi magic non c'è bisogno del cast (anche perchè in PHP il cast è "un pò così" :P )

    Ad ogni modo prova con il metodo sleep, dovrebbe andare!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.