Come modificare da codice il valore di un campo del profilo

18 contenuti / 0 new
Ultimo contenuto
Come modificare da codice il valore di un campo del profilo

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.

Io uso questo codice dopo aver creato Nome e Cognome in profilo utente:

<?php
 
if (module_exists('profile')) {
 
profile_load_profile($user);
  if (
$user->profile_nome) print '<strong>Nome e Cognome:</strong> '.$user->profile_nome.' '.$user->profile_cognome.'<br>';
}
?>

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:

<?php
 
global $user;
  
//definisce array con gli indici esistenti del profilo utente
  
$change = array(
    
'profile_nome' => 'Nome nuovo',
    
'profile_cognome' => 'Cognome nuovo',
    );
   
//legge le info dell'utente loggato
   
$member = user_load($user->uid);
  
//setta la categoria esistente già creata in precedenza
   
$category = "Anagrafica del profilo utente";
  
//salva un nuovo profilo
   
profile_save_profile($change, $member, $category);
?>

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):

<?php
 $fields
= array();
   
$result = db_query('SELECT......');
    while (
$record = db_fetch_object($result)) {
     
$fields[] = $record;
    }
..........
$result = pager_query(".........");
   
$content = '';
    while (
$account = db_fetch_object($result)) {
     
$account = user_load(array('uid' => $account->uid));
     
$profile = _profile_update_user_fields($fields, $account);
     
$content .= theme('profile_listing', $account, $profile);
    }
 
?>

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:

<?php
global $user;
//poi puoi mettere:
profile_load_profile($user);
//segue tuo codice
?>

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:

<?php
 
global $user;
             if (
$user->uid) {
                if (
module_exists('profile')) {
                    unset(
$user->profile_licenze);
                   
profile_load_profile($user);
                   
$abilitazioni_rimanenti = $user->profile_licenze;
                    if (
$abilitazioni_rimanenti > 0) {
                     
//mettere nella variabile $change tutti i profili
                     
$change = array(
                       
'profile_licenze' => ($abilitazioni_rimanenti - 1),
                       
'profile_nome' => $user->profile_nome,
                       
'profile_cognome' => $user->profile_cognome,
                      );
                     
$category = "Info personali";
                     
profile_save_profile($change, $user, $category);
                    }
                 }
             }
?>

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

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