Salvataggio parametri dopo autenticazione.

Ciao a tutti,

non riesco a risolvere questo problema.

Sto tentando di creare un form login, dove l'utente deve inserire il gruppo di appartenenza ed inseguito, recuperare i dati del gruppo e salvarli.

I database utilizzati sono: Utenti e Gruppo

Allora,

ho il mio controller AuthController.php ed utilizzo il metodo loginAction() per autenticarmi, recuperando dal form i valori dei campi: username, password,gruppo.

questo è il controllo che faccio sul database:

$adapter = new Zend_Auth_Adapter_DbTable($db, 'utenti', 'username', 'password', 'MD5(?)');
            $select = $adapter->getDbSelect();
            $select->where('stato = 1');
            $select->where('gruppo =  ?', $gruppo);
                
                $adapter->setIdentity($credentials['username']);
                $adapter->setCredential($credentials['password']);
                
                $result = Zend_Auth::getInstance()->authenticate($adapter);

e fin qui, tutto bene; se username esiste ed appartiene al gruppo indicato, si accede all'area riservata.

Ora vorrei, utilizzando il valore del campo "gruppo", accedere sul database "gruppi" ed estrare tutti i campi della tabella.

Avevo pensato a due soluzioni:

1. salvare il campo "gruppo" e collegarmi al database  "gruppi" dall'indexController.

2. collegarmi sul database "gruppi" direttamente da AuthController e salvarmi i campi che mi interessano per poi propagarli per ttt il sistema.

E' chiaro fin qui ??

Ho provato ad utilizzare Zend_Registry, subito dopo questo controllo:

if ($result->isValid()) {                                  Zend_Auth::getInstance()->getStorage()->write($adapter->getResultRowObject(array('id_utente', 'username', 'gruppo')));
               $prova_reg = 'prova_gruppo';
               Zend_Registry::set('prova_reg',$prova_reg); 
               $this->_redirect('index');
                }

Ma non funziona.

Ho provato anche Zend_Session, ma nel primo caso:ricevo l'errore:key "prova_reg" non esiste,

nel secondo caso: il namespace non esiste.

Dove sbaglio ??

L'analisi che ho fatto è corretta ???

Grazie

inviato 7 anni fa
C4rLoS
X 0 X

Ho trovato qualcosa (mi scuso per non aver controllato meglio prima), su Zend_Registry.

Gianni sul seguente argomento: http://www.phpnews.it/forum/zend-framework/usi-di-zend_session-e-zend_registry/, scrive:

Zend_Registry perde tutto il suo alla fine dell'esecuzione dello script.

Bene. Quindi, se ho capito bene, perdo tutto, una volta che rigenero un nuovo Controller. è giusto??

Allora, meglio che lavori su Zend_Session per mantenere vivi i parametri.

Ora la domanda è:

Recupero i dati (collegandomi al db "gruppi") direttamente su AuthController o su ogni Controller ??

Ho provato a collegarmi al db dopo il controllo if($result->IsValid()), in questo modo:

               $nome_gruppo = "jazz";
               $gruppi = new Default_Model_Gruppi();
               $results = $gruppii->getGruppo($nome_gruppo);
               $this->view->gruppo = $results;

Ma non effettua correttamente il rendering. mi si blocca sulla pagina di login.

Come mai ??

Grazie e scusatemi ancora.

risposto 7 anni fa
C4rLoS
X 0 X

Perchè non usi lo storage di zend_auth?

Dall'articolo qui in phpnews di gianni per zend_auth:

Zend_Auth::getInstance()->getStorage()->write($my_auth_adapter->getResultRowObject(array('user_id', 'nome')));

Nel tuo caso "$my_auth_adapter" è "$adapter" e poi devi variare gli "user_id" e "nome"

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Si, infatti.

Ho fatto cosi:

$data = $adapter->getResultRowObject(array('alias', 'username', 'gruppo'));

Ora, una volta autenticato, devo recuperare i dati della tabella 'gruppi'.

dove mi collego al model, su authController o dove ho bisogno di reperire i dati ??

per esempio: newsController ?

risposto 7 anni fa
C4rLoS
X 0 X

Cambio di programma.

non è più "gruppi" la tabella, ma "domini". scusate.

Questo è quello che vorrei fare:

Una volta autenticato, io possiedo il valore del dominio a cui appartiene l'utente ($dominio = miosito).

Avendo questo dato, voglio che alla richiesta di visualizzare le news pubblicate io mi colleghi ad un altro database che contiene la tabella 'articoli'.

questo è il codice che ho scritto:

    function getAllArticoli()
    {
       $params = array('host'=>'localhost', 'username'=>'root', 'password'=>'root', 'dbname'=>'mio_db');           
       $db = Zend_Db::factory('PDO_MYSQL', $params);       
      $result = $db->query('SELECT * FROM articoli ORDER BY art_id DESC');
      $rows = $result->fetchAll();
      return $rows;       
         //$sql = 'SELECT * FROM articoli ORDER BY art_id DESC';
    }

in questo modo funziona, ma questi valori io li ho scritti manualmente. vorrei invece, recuperarli dalla tabella "domini" (id, nome_dominio, user_dominio, pass_dominio, db_dominio), avendo come chiave primaria e univoca il campo "nome_dominio. in modo da creare un codice dinamico.

Bene. ho inserito nel metodo init() questo codice:

      $dominio  = 'miosito.it';
      $dominio_dati = new Default_Model_Domini();
      $results = $dominio_dati->getDatiDominio($dominio);
      $this->view->dominio_db = $results;

ora dovrei passare i campi della tabella domini, alla tabella 'articoli', settando i parametri di connessione.

la prima cosa che mi passa per la testa per passare i dati è quella di creare un costruttore nel model Articoli() ??

è corretto ??

risposto 7 anni fa
C4rLoS
X 0 X

Mi spiegate perchè se scrivo questo

         $registry = Zend_Registry::getInstance();

         $registry['dominio'] = $dominio;

e poi vado a leggere il contenuto

                        echo "$registry['dominio']"; FUNZIONA

se faccio

                         $dominio = $registry['dominio']; NON FUNZIONA $dominio = NULL.

ma cosi

                         $dominio = 'prova'; FUNZIONA ?

risposto 7 anni fa
C4rLoS
X 0 X

Mi sembra più che palese che stai confondendo un po' di cose...Ho fatto cosi:

$data = $adapter->getResultRowObject(array('alias', 'username', 'gruppo'));

Li hai scritti poi nello storage? In questa riga non l'hai fatto.

Ora, una volta autenticato, devo recuperare i dati della tabella 'gruppi'.

dove mi collego al model, su authController o dove ho bisogno di reperire i dati ??

per esempio: newsController ?

Sempre nell'articolo di Gianni è spiegato come fare questo. Il fatto che siano "gruppi" o "domini" è indifferente...Mi spiegate perchè se scrivo questo

         $registry = Zend_Registry::getInstance();

         $registry['dominio'] = $dominio;

e poi vado a leggere il contenuto

                        echo "$registry['dominio']"; FUNZIONA

se faccio

                         $dominio = $registry['dominio']; NON FUNZIONA $dominio = NULL.

ma cosi

                         $dominio = 'prova'; FUNZIONA ?

Perchè "$registry['dominio']" ha valore NULL...sono definizioni di variabili....

risposto 7 anni fa
Mario Santagiuliana
X 0 X

ehm...controllo!

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

si ho questa riga:

$auth->getStorage()->write($data);

di quale articolo ti riferisci? grazie.

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Letti questo articolo:

http://www.phpnews.it/articoli/autenticare-gli-utenti-con-zend-auth-1/

e questo:

http://www.phpnews.it/articoli/autenticare-gli-utenti-con-zend-auth-2/

Credo li tu possa trovare tutte le informazioni utile per capire come fare l'autenticazione, poi per scendere più nello specifico ti appoggi alla documentazione ufficiale.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Grazie per gli articoli, ma il problema non è l'autenticazione. che mi funziona benissimo.

Ma sulla difficoltà, di recuperare altre informazioni dell'utente, utilizzando il campo "id_utente" e "dominio" salvati precedentemente nell'autenticazione con questa riga:

               $data = $adapter->getResultRowObject(array('id_utente', 'username', 'dominio'));
               $auth->getStorage()->write($data);

Ho provato, nel metodo init() dell'indexController, a collegarmi sulla tabella profilo_utenti, per recuperare altre informazioni, questo è il codice:

                        $user       = $auth->getIdentity();
         $idutente   = $user->id_utente;
         $username   = $user->username;
         $dominio      = $user->dominio;
         
         $profilo = new Default_Model_ProfiloUtenti();
         $results = $profilo->getInfo($idutente);
         $this->view->profilo = $results;

il debug non mi da erorri, pero' non riesco a recuperare le informazioni che mi servono sul mio index.phtml

uso questo codice per reperire le info:

$profilo = $this->profilo;
echo $this->escape($profilo['nome_reale']);

ma nulla, non stampa nulla!!

Ho bisogno di suggerimenti.

Grazie.

risposto 7 anni fa
C4rLoS
X 0 X

Grazie per gli articoli, ma il problema non è l'autenticazione. che mi funziona benissimo.

Ma sulla difficoltà, di recuperare altre informazioni dell'utente, utilizzando il campo "id_utente" e "dominio" salvati precedentemente nell'autenticazione con questa riga:

               $data = $adapter->getResultRowObject(array('id_utente', 'username', 'dominio'));
               $auth->getStorage()->write($data);

Puoi fare semplicemente così (se hai usato lo storage di Zend_Auth) nell'action del tuo controller metti:

$variabile = Zend_Auth::getInstance()->getStorage()->read();
//per stampare dominio per esempio:
echo $variabile['dominio'];
risposto 7 anni fa
Mario Santagiuliana
X 0 X

Posso utilizzare questa variabile, per collegarmi alla tabella "domini" con la query:

$sql = 'SELECT * FROM domini WHERE nome_dominio = $dominio';

?? e recuperare ulteriori dati del dominio ??

secondo te, dove è preferibile lanciare il collegamento al model domini, da init() del customcontroller o nell'indexController di ogni controller  ??

un ultima domanda,  collegandomi alla domanda posta precedentemente..

io nel CustomController ho inserito i metodi init() e preDispatch() che vengono utilizzati da tutti i controller, posso estendere anche le Action ??

grazie

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Ho inserito la connessione alla tabela 'domini' all'interno del metodo preDispatch del CustomController

         $variabile = Zend_Auth::getInstance()->getStorage()->read();
         $dominio_session = $variabile['dominio'];
         
         $dominio_info = new Default_Model_Domini();
         $results = $dominio_info->getInfoDominio($dominio_session);
         $this->view->data = $results;   

sembra tutto ok.

ma ora, come faccio ad utilizzare le colonne della riga che soddisfa il criterio:

    function getInfoDominio($dominio_session)
    {
      $select = $this->select()
                  ->from('domini')
                  ->where('nome_dominio = ?',$dominio_session);
      $row = $this->fetchRow($select);
      return $row;
    }

se faccio: <?php echo $this->escape($data['scadenza_dominio']);?>

non mi stampa nulla, anzi ricevo questo msg di errore:

Notice: Undefined variable: data in .....
risposto 7 anni fa
C4rLoS
X 0 X

Posso utilizzare questa variabile, per collegarmi alla tabella "domini" con la query:

$sql = 'SELECT * FROM domini WHERE nome_dominio = $dominio';
?? e recuperare ulteriori dati del dominio ??

Hai già creato un model, se non sbaiglio, vero?

secondo te, dove è preferibile lanciare il collegamento al model domini, da init() del customcontroller o nell'indexController di ogni controller  ??

Quando istanzi il tuo oggetto, io in genere li istanzio o nelle action o nell'init del controller nel caso il mio oggetto sia usato da tutte le funzioni del controller.

un ultima domanda,  collegandomi alla domanda posta precedentemente..

io nel CustomController ho inserito i metodi init() e preDispatch() che vengono utilizzati da tutti i controller, posso estendere anche le Action ??

???

Ho inserito la connessione alla tabela 'domini' all'interno del metodo preDispatch del CustomController

         $variabile = Zend_Auth::getInstance()->getStorage()->read();
         $dominio_session = $variabile['dominio'];
         
         $dominio_info = new Default_Model_Domini();
         $results = $dominio_info->getInfoDominio($dominio_session);
         $this->view->data = $results;   

sembra tutto ok.

ma ora, come faccio ad utilizzare le colonne della riga che soddisfa il criterio:

    function getInfoDominio($dominio_session)
    {
      $select = $this->select()
                  ->from('domini')
                  ->where('nome_dominio = ?',$dominio_session);
      $row = $this->fetchRow($select);
      return $row;
    }

se faccio:

<?php echo $this->escape($data['scadenza_dominio']);?>

non mi stampa nulla, anzi ricevo questo msg di errore:

Notice: Undefined variable: data in .....

In primis ti chiedo di riportare sempre l'errore esatto che ti viene restituito.

Inoltre "data" è una variabile della tua view ("$this->view->data = $results;") per cui per vare la stampa nella tua view devi fare così:

<?php echo $this->escape($this->data['scadenza_dominio']);?>
risposto 7 anni fa
Mario Santagiuliana
X 0 X

Grande!!

problema risolto, solo che, ricevo questo messaggio di errore non bloccante:

Warning: htmlspecialchars() expects parameter 1 to be string, object given in C:\xampp\htdocs\lavoro\cms\library\Zend\View\Abstract.php on line 850

nella domanda:

io nel CustomController ho inserito i metodi init() e preDispatch() che vengono utilizzati da tutti i controller, posso estendere anche le Action ??

Intendevo dire questo:

Sto utilizzando un effetto slide con jquery su default.html a scorrimento verso il basso, nel quale, visualizzo alcune informazioni dell'utente, i suoi ultimi post e la possibilità di modificare la sua password(per il momento).

se creo nel mio indexContrller, l'action IndexAction che si occupa di invocare il metodo updatePass(), l'azione viene eseguita correttamente. Ma, visto che sarà un effetto sempre presente anche quando carico altri controller, mi chiedevo se (come i metodi init() e preDispatch()) ci sia la possibilità di estendere anche dei metodi(action), evitando, di creare la stessa porzione di codice per tutti i controller.

Sono stato chiaro adesso ??? :P

Ciao e Grazie

risposto 7 anni fa
C4rLoS
X 0 X

Che stupido, non ci avevo pensato.

Continuo ad usare il metodo init() per gestire anche l'operazione di cambio password.

Cosi viene ereditato da tutti i controller. Problema risolto.

Ma la domanda cmq rimane valida:

supponiamo che la soluzione trovata non funzioni, è possibile far ereditare anche la IndexAction, per poterla scrivere una sola volta ??

Grazie ;)

risposto 7 anni fa
C4rLoS
X 0 X
supponiamo che la soluzione trovata non funzioni, è possibile far ereditare anche la IndexAction, per poterla scrivere una sola volta ??

Crei un tuo oggetto che contiene tutti i metodi che ti servono.

Poi nel tuo codice istanzi l'oggetto con la normale sintassi.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Crei un tuo oggetto che contiene tutti i metodi che ti servono.

Poi nel tuo codice istanzi l'oggetto con la normale sintassi.

Ciao

Quindi mi creo una classe con tutti metodi da utilizzare, ma questa classe come faccio ad includerla in tutti i controller ??

con php faccio un include ed il gioco è fatto, con zend ?? che sintassi dovrei utilizzare ?

grazie

risposto 7 anni fa
C4rLoS
X 0 X

grazie

risposto 7 anni fa
C4rLoS
modificato 7 anni fa
X 0 X

Con Zend crei una tua libreria e la metti sotto la cartella library. Se hai configurato correttamente zend_application ti basterà istanziare il tuo oggetto come se fosse un oggetto di zend framework, ovviamente dovrai rispettare la sintassi di zend_application e di zend framework.

Altrimenti usi zend_loader e fai così per esempio:

Zend_Loader::loadFile('tua_libreria.php');

Meglio non usare include o require.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Tutto chiaro!!

metto in pratica i tuoi suggerimenti.

Grazie

e a presto ;)

Carlo

risposto 7 anni fa
C4rLoS
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda