Ciao a tutti.
So che è una cosa un po particolare ma non riesco a trovare una soluzione per questo problema.
Vorrei decrementare una variabile inserita nel profilo di un utente ogni volta che l'utente esegue un certo form.
So come e dove gestire il codice nel form, l'ho già fatto anche per altre esigenze, ma non so proprio come richiamare la variabile del profilo e soprattutto come modificarla.
Grazie a chiunque vorrà aiutarmi.
Come modificare da codice il valore di un campo del profilo
Gio, 10/03/2011 - 09:54
#1
Come modificare da codice il valore di un campo del profilo
Io uso questo codice dopo aver creato Nome e Cognome in profilo utente:
Percaso sapresti come prelevare il ruolo utente? Perchè con:
print 'Livello: '.$user->roles[2].'';
ho l'output: Livello: authenticated user
Io vorrei Livello: Studente
Grazie ciao
Purtroppo non ti so aiutare :(
Grazie per il contributo. Hai idea se sia possibile anche scrivere dentro la variabile Nome o Cognome ed eventualmente con quale formalismo?
ciao
Ma cosa intendi per scrivere "dentro la variabile" ? Io so solo che i campi del profilo vengono salvati nelle tabelle profile_fields e profile_values
Ciao
Mi spiego meglio.
Vorrei decrementare una variabile numerica inserita nel profilo di un utente ogni volta che l'utente esegue un certo form. Ovvero l'utente può eseguire un certo form tante volte quante sono inserite in una variabile del suo profilo, non visibile a lui.
Ho usato con successo la funzione profile_load_profile che mi hai suggerito e cercando qua e la ho visto che esiste anche una funzione profile_save_profile ma non ho trovato esempi di funzionamento e non riesco a farla funzionare.
ciao
Puoi guardare qui http://chirale.wordpress.com/2008/12/03/save-user-profile-on-drupal/
Comunque questo codicè l'ho testato e funziona:
Ciao
Ho provato ad usare la routine che mi hai suggerito ma riscontro i seguenti problemi:
1) Mi aggiorna i dati del profilo del campo impostato ma mi annulla tutti gli altri campi del profilo che io non devo toccare (e sono tanti nel mio profilo).
2) Non aggiorna il contenuto del campo del profilo che mi interessa forse perchè è un campo "Campo nascosto del profilo, accessibile solo dagli amministratori, dai moduli e dai temi".
Continuando la ricerca ho trovato la seguente funzione che in teoria dovrebbe servire al mio scopo o almeno credo, ma non sono riuscito a farla funzionare perchè mi da errori vari o forse non si usa così
// decremento il numero licenze disponibili
$change = array('profile_licenze' => ($params['abilitazioni_rimanenti']-1));
//aggiorna profilo
_profile_update_user_fields($change, $user);
Grazie ancora per l'aiuto
ciao
Ciao antongiove,
La funzione $profile = _profile_update_user_fields($fields, $account); viene utilizzata in drupal in questi file:
profile.pages.inc (63):
profile.pages.inc (96):
profile.module (184):
e viene sempre temizzata dopo la chiamata con:
ad esempio in profile.pages.inc (non riporto tutto tanto lo puoi vedere ne sito):
Come puoi notare $fields e $account sono degli array().
Riguardo la funzione profile_save_profile($change, $member, $category); sai io l'ho testata e a me funzione senza toccare altri campi (sono sicura) del profilo se esistono. Poi non so come tu l'hai adattata al tuo caso, semmai postami il codice.
Ciao :)
// Recupero le abilitazioni rimanenti dal profilo utente
profile_load_profile($user);
$params['abilitazioni_rimanenti'] = ($user->profile_licenze);
if ($params['abilitazioni_rimanenti'] > 0) {
// decremento il numero licenze disponibili
$change = array(
'profile_note' => 'PROVA' , /* aggiunto per vedere come si comporta su un campo normale del profilo */
'profile_licenze' => ($params['abilitazioni_rimanenti']-1)
);
//setta la categoria esistente già creata in precedenza
$category = "Info personali";
//salva il profilo
profile_save_profile($change, $user, $category);
}
il risultato del seguente codice è che il profilo dell'utente che ha eseguito il form risulta azzerato nei campi della categoria "Info personali" e il campo 'profile_note' impostato correttamente a "PROVA". I campi non visibili, tra cui 'profile_licenze' non hanno subito variazioni.
Dove sbaglio?
grazie danzisiweb per il tuo supporto
Mi sembra che devi mettere:
potrebbe bastare. Ciao
Purtroppo nulla da fare. Anche aggiungendo global $user; non cambia nulla !!
rimetto il nuovo codice:
<?php
// Recupero le abilitazioni rimanenti dal profilo utente
global $user;
profile_load_profile($user);
$params['abilitazioni_rimanenti'] = ($user->profile_licenze);
if ($params['abilitazioni_rimanenti'] > 0)
{
$change = array('profile_licenze' => ($params['abilitazioni_rimanenti'] - 1));
//setta la categoria esistente
$category = "Info personali";
//salva il profilo
profile_save_profile($change, $user, $category);
}
Risultato: tutti i campi pubblici del profilo sono vuoti e i campi riservati all'amministratore non sono stati modificati compreso profile_licenze.
ciao
Ci ho litigato parecchio e per adesso ho questa soluzione:
Il trucco consiste nell'impostare la variabile $change con tutte le opzioni, si si dovrebbe fare un ciclo for per tutti i profili esistenti, ma per adesso se è urgente usa questa. Vedrai che se premi F5 la variabile profile_licenze scala correttamente, daltronde anch'io sto lavorando con i profili utente per un mio sito e così ho approfondito la cosa.
Ciao!
AIUTO, non so proprio dove sbaglio ma anche applicando la tua routine con il copia incolla, il risultato non cambia. Nome e Cognome sono corretti ma il profile_licenze non viene decrementato.
Comincio a essere disperato (scherzo). Grazie comunque per il tuo aiuto e supporto.
Ma guarda io l'ho messo in page.tpl.php del tema e funziona correttamente: ad ogni click per sfogliare il sito la variabile decrementa, viene salvata, viene letta. Ora non saprei proprio come mai a te non funziona. Una volta definite le variabili $category e $change (che tra il mio sito e il tuo sono sicuramente diverse) tutto dovrebbe andare!
Mi spiace :( Ciao
Ma il campo del profilo che tu decrementi è : "Campo nascosto del profilo, accessibile solo dagli amministratori, dai moduli e dai temi" ? Stai eseguendo il codice come amministratore?
Secondo me conviene inserirti nella funziona di submit del form e indicare che deve essere decrementato il campo del profilo utente che dici, tramite l'hook_form_alter
http://www.lullabot.com/articles/modifying-forms-drupal-5-and-6
Follow me @DarthDrupal and @Dinamicamente.org
Dinamicamente.org
Eh vabè, aggira l'ostacolo in questo modo:
global $user;
if ($user->uid) {
if (module_exists('profile')) {
$objectrow = db_fetch_object(db_query("SELECT fid FROM {profile_fields} WHERE title ='profile_licenze'"));
$fid = $objectrow->fid;
$objectrow = db_fetch_object(db_query("SELECT value FROM {profile_values} WHERE fid =%d AND uid=%d", $fid, $user->uid));
$abilitazioni_rimanenti = $objectrow->value;
if ($abilitazioni_rimanenti > 0) {
$abilitazioni_rimanenti--;
db_query("UPDATE {profile_values} SET value =%d WHERE fid =%d AND uid=%d", $abilitazioni_rimanenti, $fid, $user->uid);
}
profile_load_profile($user);
if ($user->profile_licenze) print '<strong>Licenza:</strong> '.$user->profile_licenze.'<br>';
}
}
Adatta il codice alle tue esigenze!!
C
i
a
o
Grande danzisiweb !!
Adesso funziona esattamente come serve a me. Modifica il campo da decrementare e lascia stare gli altri. Ho faticato un pochino perchè nella prima query profile_licenze è il name e non il title.
Grazie e ancora grazie
a buon rendere e alla prossima rogna :)
antongiove