Utilizzare i valori acquisiti nel form di registrazione utente
Salve,
ho modificato il form della registrazione utente di drupal 7 aggiungendo un campo per acquisire un valore che mi serve come id numerico dell'utente.
In un'altra pagina devo inserire un codice php che utilizza questo id per fare delle operazioni.
Come si fa a "leggere" il valore corrispondente all'utente loggato?
E già che ci siamo, come si fa a leggere, in generale, tutti i valori dell'utente loggato?
Grazie.
Risposte
Se installi devel
Se installi devel (https://www.drupal.org/project/devel) hai a disposizione funzioni molto utili per avere la stampa a schermo di variabili (utilizza la libreria krumo). Puoi attivare il modulo, impostare i permessi e poi navigare sul profilo utente. Noterai un tab devel. Cliccandolo avrai a disposizione le variabili che contiene l'oggetto utente (su vari contesti).
In generale per stampare da codice il contenuto dell'oggetto utente (nb devel deve essere attivo):
<?php
global $user;
dpm($user); // o kpr($user)
?>
la differenza tra dpm e kpr è che il primo usa drupal_set_message per la stampa a schermo (utile per ajax e per far "sopravvivere" il messaggio attraverso la stessa sessione). kpr() stampa direttamente all'output (e ad esempio nel caso di redirect, il messaggio non risulterebbe visibile).
Salve, ho installato e
Salve,
ho installato e attivato il modulo suggerito, è uscito il tab devel... e adesso che ci faccio?
Scusate l'ignoranza ma, se ho capito bene, funziona quasi come Token e quindi mi da le variabili che entrano in gioco sulla visualizzazione corrente... ma come si usa?
Provo a specificare meglio il mio obbiettivo: avete presente quando si vuole scrivere un batch su windows che, per esempio, faccia una copia di un file sul desktop dell'utente corrente? In quel caso si potrebbe usare la variabile di ambiente %userprofile%...
Nel mio caso specifico, in questo progetto di drupal, dovrò caricare un database di dati dove è presente una colonna che contiene un id univoco relativo all'utente.
Quando l'utente si registra deve fornire detto id assieme alle altre canoniche informazioni.
Una volta loggato, l'utente può aprire una pagina che fa una select DATI_VARI from DATABASE where id="id_dell_utente_loggato_acquisito_nel_form".
In questo modo intendo filtrare e presentare all'utente i dati che lo riguardano.
Dunque, adesso che ho devel attivo, come individuo la variabile da utilizzare nella mia select?
Grazie.
L'id dell'utente univoco
L'id dell'utente univoco assegnato alla creazione dello stesso è la variabile uid dell'oggetto user.
<?php
global $user;
print $user->uid;
?>
nel tuo caso la query sarà qualcosa del genere:
<?php
global $user;
$q = db_query("select * from {NOME_TABELLA} where id=:uid", array(':uid' => $user->uid));
...
?>
Salve blackice78, il tuo
Salve blackice78,
il tuo codice funziona perfettamente.
Il valore che intendo "pescare" io però non è uno dei valori standard (uid, name, mail...) ma uno aggiuntivo che ho inserito io nel form di registrazione.
Con devel ho potuto vedere che il campo che mi interessa si chiama:
Ho provato allora a stamparlo modificando il tuo codice:
ma ottengo:
test2
test2@test2.test
e un errore:
Notice: Undefined property: stdClass::$field_pincode in eval() (linea 16 di /web/htdocs/www.miosito.it/home/modules/php/php.module(80) : eval()'d code).
Ho provato anche con
ricavato sempre dal tab devel ma l'errore non cambia.
Ecco quello che leggo sul tab devel della pagina "persone---->test2":
L'errore forse sta nel fatto che name e mail sono di tipo string mentre il mio field_pincode è di tipo array e le mie scarse conoscenze non mi permettono di sapere come ci si riferisce al valore 11111111 in esso contenuto.
Grazie.
Tenendo conto che il campo
Tenendo conto che il campo che definisci "non standard" è stato inserito con un field sul profilo utente e quindi non è necessaria una query specifica per estrarlo (viene caricato direttamente dal sistema nell'oggetto utente) e che mi dici che hai scarse conoscenze php, la cosa migliore è usare Views.
Ti basta creare una vista di tipo utente e filtrare per utente corrente.
In questo modo non scrivi codice e non incappi in problematiche di sicurezza stampando variabili definite dagli utenti senza un corretto escaping.
Salve blackice78. Sì, le mie
Salve blackice78.
Sì, le mie conoscenze sono scarse ma sono in lieve crescita.
La comunità drupal.it mi aiuta tanto e aiuta tutti quelli che come me sono agli inizi e hanno poco tempo da dedicare a questi studi.
La comunità aiuta soprattutto grazie a gente come te che ti interessi sempre a tutte le richieste di supporto, il tuo aiuto è molto gradito.
Detto ciò, ho trovato la soluzione studiando in https://api.drupal.org/api/drupal/developer!globals.php/global/user/7 che mi ha portato a scoprire la funzione user_load https://api.drupal.org/api/drupal/modules!user!user.module/function/user_load/7 dove tra i commenti c'era proprio il mio caso: Getting values of user define (custom) fields. (nella pagina sono presenti diverse varianti, alcune dette recommend way ma approfondirò in seguito)
Il codice precedente va dunque modificato in questo modo:
Il risultato sarà:
test2
test2@test2.test
11111111
ovviamente il risultato non serve a nulla ma adesso siamo in grado di scrivere una cosa del genere:
Errori eventuali di sintassi a parte ma dovrebbe funzionare.
Citazione: Ti basta creare una vista di tipo utente e filtrare per utente corrente.
Avevo pensato alla vista ma il problema è che il database di cui ti parlavo all'inizio non sta nel database di drupal ma attualmente è un foglio di excel. Nella mia idea iniziale volevo trovare un modo per "iniettarlo" magari in uno degli altri 4 database che ti da Aruba o nello stesso di drupal e poi leggerlo con l'espediente di cui sopra.
ACCETTO PROPOSTE PER SOLUZIONI ALTERNATIVE.
Citazione: In questo modo non scrivi codice e non incappi in problematiche di sicurezza stampando variabili definite dagli utenti senza un corretto escaping.
Mi parli di problematiche di sicurezza, in che senso?
Illuminami perchè vorrei sapere quali sono le debolezze di questo ragionamento...
Grazie
Ovviamente non volevo
Ovviamente non volevo offenderti nè sminuire il tuo lavoro e sapere, mi sono limitato a (ri)utilizzare una tua constatazione.
Dipende dalla struttura dati, in generale potresti anche usare il modulo "feeds" per importare i dati Excel in campi del profilo e poi usare Views per visualizzarli.
Se vuoi importare direttamente i dati in tabelle del db Drupal, potresti usare il modulo "data" per adottare le tabelle e renderle leggibili, ancora una volta in Views.
Potresti scriverti un modulo ad hoc, strada più tortousa, ma che ti dà il controllo completo dei dati e della visualizzazione.
Insomma, tante strade da provare.
Per quanto riguarda la sicurezza, ti dò due esempi direttamente dal tuo codice:
print $user_fields->field_pincode['und']['0']['value'];
se il campo contenesse codice js malevolo visitando la pagina lo eseguiresti (Cross Site Scripting). Vedi funzoni come filter_xss/check_plain per maggiori informazioni o in giro sul web (è una problematica comunque nella programmazione web, non legata solo Drupal).
$q = db_query("select * from {NOME_TABELLA} where id=$pincodeutente");
così potresti subire una Sql injection (ad esempio se il campo contenesse un valore tipo "1 OR 1=1", la query restituirebbe tutti le righe della tabella).
Tutte queste problematiche possono essere ridotte o annullate validando opportunamente i dati immessi e facendo attenzione all'output. Moduli come Views si occupano di gestire anche questo aspetto in maniera trasparente all'utente.
Spero ti sia utile!
Salve, ovviamente non ho mai
Salve,
ovviamente non ho mai pensato cha volessi offendere. Ci tenevo a dire che le mie conoscenze sono in (lieve) crescita... :-)
Per quanto riguarda il caricamento del foglio excel sul database di drupal voglio provare una delle strade da te indicate perchè ovviamente usare views è molto più semplice che scrivere un codice di sana pianta.
Ti farò sapere.
Usando il modulo "feeds" o "data" sicuramente si creeranno nuove tabelle o valori nel db di drupal ma se il metodo non è efficace o non soddisfa si può poi "ripulire" quello che si è sporcato? Mi consigli di fare la prova su un sito cavia?
-Sicurezza.
Avevo sentito parlare di sql injection e Cross Site Scripting ed effettivamente, già con gli esempi che hai fatto tu, si può correre qualche rischio se non fosse che il pincode che io richiedo alla registrazione è fornito precedentemente da me agli utenti.
Spiego: il sito è aperto alla registrazione per un numero conosciuto di utenti, immaginate gli impiegati di un comune.
L'amministratore del sito invita gli impiegati a registrarsi fornendo tramite email il pincode.
L'amministratore stesso poi verifica se c'è corrispondenza pincode-nome-cognome-email e se il pincode esiste quindi attiva l'utente. Diversamente elimina tutto o, se la mail è conosciuta, rimanda una mail di warning.
Questo meccanismo è stato scelto solo per filtrare le registrazioni al sito ma adesso credo serva, anche se inconsapevolmente, a scongiurare sql injection (fortunatamente a nessuno è stato assegnato un pincode malevolo come "1 OR 1=1").
Mi sei stato molto utile.
Grazie.
La scelta migliore quando si
La scelta migliore quando si installano nuovi moduli e/o si fanno prove è evitare di utilizzare l'ambiente di produzione. Di solito opto per almeno due (sviluppo/produzione) se non tre ambienti (sviluppo/test/produzione).
Per tenere pulita la struttura forse l'opzione migliore è fare due punti di ripristino con veri e propri dump dell'intero db. Backup & Migrate può aiutarti a tenere un archivio di backup con annotazioni, facilmente ripristinabili direttamente da interfaccia.