Back to top

Autore Topic: Accesso all'oggetto current user  (Letto 7396 volte)

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Accesso all'oggetto current user
« il: 23 Set 2012, 21:43:34 »
Buona sera.
Ho la necessità di accedere ai dati dell'user corrente per consentire l'accesso differenziato ad alcune parti del sito.
Dalle pagine docs.joomla.org ho individuato il metodo array statico & JFactory::getUser(), ma
Codice: [Seleziona]
$user =& JFactory::getUser();non solo non mi restituisce nessun valore, ma addirittura mi blocca la pagina php nella quale è inserito.
Qualche suggerimento?
Grazie
Fabrizio
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #1 il: 23 Set 2012, 22:21:22 »
Ciao Fabrizio,
dove stai inserendo quel codice?


Se è una pagina esterna a joomla il problema è che non trova JFactory. Se è interna a joomla non ne trovo il problema, non mi è mai successo.


In ogni caso la variabile $user è un Object, non puoi semplicemente chiederne il valore ma devi usare i metodi appositi che restituiscono i valori. Cosa ti serve in particolare?


Qua la documentazione: [size=78%]http://docs.joomla.org/JFactory/getUser[/size]
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #2 il: 23 Set 2012, 23:39:09 »
Ovvio che è un oggetto, con i suoi metodi: a me serverebbe soltanto $user->name.
Spiego rapidamente la procedura:
un menu Joomla visibile e riservato ad una sola categoria di utenti immette ad una pagina php, dove mi occorre conoscere il nome dell'utente per definire l'ulteriore percorso da fargli seguire.
Attualmente utilizzo una seconda gate con user e password, ma la ritengo inutile ed onerosa, per cui vorrei bypassarla utilizzando le credenziali di accesso a Joomla!.
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #3 il: 23 Set 2012, 23:46:00 »
Codice: [Seleziona]
$user =& JFactory::getUser();
$name = $user->name;


Prova qualche echo o print sulla variabile $name, non vedo perchè non dovrebbe darti il nome.

Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #4 il: 23 Set 2012, 23:54:15 »
provato tutto, l'oggetto risulta vuoto, e la procedura mi blocca la pagina
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #5 il: 24 Set 2012, 00:01:52 »
Se l'oggetto risulta vuoto può essere che l'utente non sia loggato, ma chiaramente non dovrebbe bloccare la pagina. Ti segnala qualche errore particolare? Controlla anche dagli strumenti per sviluppatori. Dove lo stai usando, cioè, su che pagina? Non mi ha mai dato problemi in questo modo. Prova anche a passargli direttamente un id utente e vedere se ti restituisce il nome.
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #6 il: 24 Set 2012, 17:59:22 »
La funzione che mi blocca è proprio JFactory::getUser(). Mi viene restituita una pagina bianca, il cui sorgente è costituito solo da un numero 1.
Se la commento tutto fila via fino all'ultima istruzione, anche se poi mi manca ovviamente il riscontro nella pagina successiva, perché non è stato individuato l'utente.
Posto la pagina, che è abbastanza breve, per verifica.
Codice: [Seleziona]
<?php
error_reporting
(E_ALL);  // Eliminare alla fine del debug
  
$reg_user = & JFactory::getUser();
  
$codice $reg_user->name;
/* Connessione al database */
  
require_once('dbconnect.inc'); // contiene i valori per la connessione al database
  
$conn = @new mysqli($db_server$db_user_name$db_password$db_name);
  if (
mysqli_connect_errno() != 0)
    {
      
$errno mysqli_connect_errno();
      
$errmsg mysqli_connect_error();
      echo 
'Errore connessione al database: , ('$errno') '$errmsgGO_BACK;
      exit();
    }
  
$conn->query("SET NAMES 'utf8'");
/* Ricerca sul database del codice utente. Non necessaria verifica di codice vuoto. */
  
$query_str "SELECT * FROM accesso WHERE codice='$codice'";
  
$result $conn->query($query_str);
  if (
$result === FALSE)
      {
      
$errno $conn->errno;
      
$errmsg $conn->error;
      echo 
'Errore individuazione tabella: , ('$errno') '$errmsgGO_BACK;
      
$conn->close();
      exit();
    }
/* Disponibili tutti i dati per creare lo USER. */
  
require_once('userinfo.inc'); // contiene la classe UserInfo per gli utenti di questa procedura
  
$password ""// Per compatibilità con la versione provvisoria
  
$tipo $row_data['tipo'];
  
$sezione $row_data['sezione'];
  
$delegazione $row_data['delegazione'];
  
$user = new UserInfo($codice$password$tipo$sezione$delegazione);    
/* La sessione viene iniziata solo ora, per evitare apertura di sessioni inutili. */
  
ini_set('session.save_path''../iscrizione/tmp/');
  
session_name('ACCESSODIREZIONALE');
  
session_start();
  
$_SESSION['current_user'] = $user;
/* Eliminazione dei dati non più necessari */
  
if (isset($result)): $result->close(); endif;
  if (isset(
$conn)): $conn->close(); endif;
/* Rinvio alla pagina dei menu direzionali */
  
header('Location: http://' $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/accesso_direzionale.php'); 
  exit();
?>

Non credo di dover fare il require della pagina Joomla che contiene l'oggetto JFactory (a parte il fatto che non la riesco a trovare), visto che dovrebbe trattarsi di un oggetto STATIC e altre pagine che lo utilizzano non lo richiedono.
Qualche lume?

Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #7 il: 24 Set 2012, 18:27:28 »
Ma quella è una pagina al di fuori di joomla? Un tuo script? In tal caso io ho sempre richiamato le classi opportune (come JFactory, o il database, senza fare tutta la procedura che hai fatto), anche se in un post mau_develop aveva suggerito diversamente per richiamare le classi opportune (non c'è nessun problema di sicurezza).


Altra cosa, nel caso vuoi usare JFactory devi chiaramente sempre richiamarla come classe per utilizzare i suoi metodi, non è un oggetto nè una variabile statica. Nel caso di script esterno a joomla va chiaramente richiamata.
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #8 il: 24 Set 2012, 18:43:55 »
Ma quella è una pagina al di fuori di joomla? Un tuo script? In tal caso io ho sempre richiamato le classi opportune (come JFactory, o il database, senza fare tutta la procedura che hai fatto), anche se in un post mau_develop aveva suggerito diversamente per richiamare le classi opportune (non c'è nessun problema di sicurezza).


Altra cosa, nel caso vuoi usare JFactory devi chiaramente sempre richiamarla come classe per utilizzare i suoi metodi, non è un oggetto nè una variabile statica. Nel caso di script esterno a joomla va chiaramente richiamata.

Che cosa si intende per "esterno a Joomla"?
Immagino una pagina creata al di fuori delle procedure di creazione articoli.
Che intendi per "senza fare tutta la procedura"? Tutto quello che viene dopo le prime tre righe mi è indispensabile per attribuire le corrette autorizzazioni all'utente, indipendentemente dalle autorizzazioni delle pagine Joomla.

Più che richiamata direi che va inclusa: ma dove si trova?


(P.S. JFactory è una classe ma quando la richiamo è un oggetto)
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #9 il: 24 Set 2012, 18:54:08 »
Tralasciamo la lezione di programmazione Fabrizio  ;)  Si, intendevo una pagina creata al di fuori della creazione articoli o comunque del sistema joomla.


Intendo, se devi accedere allo stesso DB che utilizza joomla non serve fare tutto quello ma ti basterà richiamare il metodo opportuno della classe (getDBO, getApplication, getUser o quello che ti serve).


Si trovano nella root, alcune nelle cartelle includes e la classe factory in libraries/joomla.
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #10 il: 24 Set 2012, 20:32:44 »
Il database che richiamo nella procedura non è il database di joomla ma un database a parte che contiene i dati degli iscritti alla Società e le richieste telematiche di nuova iscrizione, per cui la procedura che faccio è necessaria.
Grazie per l'informazione relativa alla class che mi serve, adesso la cerco e la includo, poi vediamo se funziona.
FF
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #11 il: 24 Set 2012, 20:40:21 »
Ok, allora è chiaramente necessaria.  Ad esempio questa è una parte di un mio codice per uno script esterno:


Codice: [Seleziona]

define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define( 'JPATH_BASE', realpath(dirname(__FILE__).'/..' ));
require_once( JPATH_BASE . DS . 'includes' . DS . 'defines.php' );
require_once( JPATH_BASE . DS . 'includes' . DS . 'framework.php' );
require_once( JPATH_BASE . DS . 'libraries' . DS . 'joomla' . DS . 'factory.php' );
$mainframe =& JFactory::getApplication('site');
$user =& JFactory::getUser();
$session =& JFactory::getSession();
$db =& JFactory::getDBO()



In questo caso lo script era all'interno di una cartella sulla root, quindi bisogna prima tornare indietro.


Fammi sapere come va a finire  ;)  ciao..
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #12 il: 24 Set 2012, 21:27:24 »
Ho trovato utilissimo il tuo codice, che ho adottato nella parte di mia utilità.
Adesso mi viene riconosciuta la class JFactory, ma purtroppo l'oggetto che mi viene restituito è desolatamente vuoto...
Ecco una print_r:
Codice: [Seleziona]
JUser Object ( [isRoot:protected] => [id] => 0 [name] => [username] => [email] => [password] => [password_clear] => [usertype] => [block] => [sendEmail] => 0 [registerDate] => [lastvisitDate] => [activation] => [params] => [groups] => Array ( ) [guest] => 1 [lastResetTime] => [resetCount] => [_params:protected] => JRegistry Object ( [data:protected] => stdClass Object ( ) ) [_authGroups:protected] => [_authLevels:protected] => [_authActions:protected] => [_errorMsg:protected] => [_errors:protected] => Array ( ) [aid] => 0 ) nome utente
Preciso che esiste certamente un user loggato - io - altrimenti la pagina non sarebbe raggiungibile.

Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #13 il: 25 Set 2012, 01:11:57 »
Molto strano, prova a dargli un id (il tuo per esempio) al metodo getUser e vedere se restituisce i tuoi dati almeno, mi sembra comunque molto strano che non venga restituito in automatico.


Da quel che si vede non viene preso il valore, un suggerimento...così per curiosità...sarebbe di togliere l'ampersand dalla dichiarazione della variabile $user, così da slegarlo dal suo valore nel resto del sistema. Ma è solo per curiosità, non ha mai dato problemi.


Quindi diventa:
Codice: [Seleziona]
$user = JFactory::getUser();
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #14 il: 25 Set 2012, 11:36:40 »
Ho provato con e senza & ma non cambia nulla, l'oggetto è sempre vuoto.

Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #15 il: 25 Set 2012, 17:00:15 »
E hai provato dando l'id a getUser?
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #16 il: 25 Set 2012, 17:27:22 »
allora:
ho cambiato la sequenza delle varie get e ha funzionato.
Codice: [Seleziona]
  $mainframe = & JFactory::getApplication('site');
  $db =& JFactory::getDBO();
  $session =& JFactory::getSession();
  $reg_user = & JFactory::getUser();
  $codice = $reg_user->name;
Adesso però mi crea un altro problema: la SESSIONE viene regolarmente inizializzata, ma il file sess non viene registrato, e quindi nelle pagine successive non arrivano i dati...
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #17 il: 25 Set 2012, 17:40:29 »
Scusa la domanda, ma mi sa che la logica del tuo script non è il massimo.


Stai utilizzando una pagina php per avere il nome (o comunque informazioni utente), avviare una sessione e poi mandare con un header a un altra pagina php?


Non era sufficiente, nella pagina accessidirezionali, creare una funzione che restituiva il nome (o le informazioni che ti servono) e farne un return. Quindi chiamare la funzione su una variabile e fare un if del dato restituito? In questo modo non c'era tutta sta forzatura. Anche perchè, non vedo nessuna sicurezza in quello script che hai inserito (se è tutto il codice) e quindi, chiunque accede al file php lo fa partire.
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

Offline Fabrizio Fiorita

  • Abituale
  • ****
  • Post: 1315
  • Sesso: Maschio
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #18 il: 25 Set 2012, 18:32:07 »
Non cambierebbe molto, visto che comunque nella funzione devo pur sempre creare un'istanza della classe JFactory per ottenere i dati da assegnare alle variabili, e temo che sia questa l'azione che impedisce la creazione del file sess.
La pagina php parte, ma se il nome utente non corrisponde a quello contenuto nel database, non restituisce la pagina di arrivo ma una segnalazione di errore.
Avevo anche pensato di utilizzare la categorizzazione degli utenti di Joomla, ma dovrei creare una quarantina di categorie, con tutti i problemi del caso, e poi non mi sarebbe facile rapportare la categoria al menu corrispondente, dovrei creare quaranta pagine menu diverse, per associare l'utente alle sue funzioni autorizzate.

Comunque sto provando altre varianti al codice, se riesco nell'impresa ti terrò al corrente, non si sa mai...
Fabrizio
Per programmare servono i tasti e la testa. Peccato che molti usino solo i primi...
Vai a vedere il mio sito: http://www.fabriziofiorita.joomlafree.it/index.php?option=com_content&view=featured&Itemid=101

Offline Murphz

  • Global Moderator
  • Abituale
  • *****
  • Post: 1335
  • Sesso: Maschio
  • Trust No1
    • Mostra profilo
Re:Accesso all'oggetto current user
« Risposta #19 il: 25 Set 2012, 18:40:08 »
Non so se ho ben capito cosa vuoi fare, un idea di sviluppo è questa (all'interno del file accessidirezionali):

Codice: [Seleziona]
// chiamo JFactory e tutti gli altri dati che mi servono

function getUser(){
// prendo l'utente utilizzando una variabile globale

return $user;
}

$user = getUser(); // ora su user avrò un JUser..o quello che ti serve..

// RESTO DEL CODICE ACCESSI DIREZIONALI

Tutto questo per evitarti la creazione della sessione, che non la ritengo opportuna. In ogni caso, buon lavoro  ;D  fammi sapere si...
Freelance Web & Graphic Design // Twitter

"...Nothing Important Happened Today..."

 



Web Design Bolzano Kreatif