hook_user - insert & update data i users
Hej med jer, Sidder og retter lidt i et eksisterende modul, så det passer til mine behov. Jeg skal gemme noget data i user->data. Hvilken sker gennem hook user, både ved update og insert. Update fungere efter hensigten, men Insert vil ikke indsætte noget i user->data feltet. Jeg fatter ikke helt hvorfor. Nogle der kan pege mig i den rigtige retning.
Bruger følgende kode ved begge:
db_query("UPDATE {users} SET data='%s' WHERE uid=%d",array_merge($v,array($account->uid)));
- log ind eller opret konto for at skrive kommentarer
Hvis du vil gemme noget data i $user object kan du gøre det direkte gennem user_save funktionen:
// tilføj brugers alder
global $user;
$data = array('alder' => '20 år');
user_save($user, $data);Du kan nu altid finde alder i $user objektet:
global $user;
print $user->alder;... that's it!
Bemærk at der gemmes '20 år', men det kunne lige så godt bare være 20, 20.0, eller 'meget gammel', da data bliver serialiseret, dvs. at det er den der læser 'alder' der skal fortolke hvad der står i feltet - systemet er ligeglad.
I øvrigt gælder der for $user-data, at den ikke er særlig performance venlig ved store mængder data pr. bruger. Så hvis du skal have rigtig meget data gemt for brugeren kan det betale sig at benytter en separat tabel og opdatere den via hook_user.
// Rolf
- log ind eller opret konto for at skrive kommentarer
Er det ikke noget med at man ikke kan/skal benytte user_save i hook_user, da denne alligevel bliver kaldt efterfølgende?
- log ind eller opret konto for at skrive kommentarer
Jo du må helst ikke bruge user_save i hook_user. Men du skal helst manipulere $user->data via user_save.
Hvis du vil bruge hook_user skal du lave dit eget felt på $user objektet, f.eks. $user->alder. Det er så dit ansvar i hook_user at fylder noget i $user->alder når $op er 'login', 'load', 'view', etc. Se alle $op her:
- log ind eller opret konto for at skrive kommentarer
Her er et eksempel på hook_user. Bemærk at tabellen {login_history} er en du selv skal oprette via .install filen.
function loginhistory_user($op, &$edit, &$account, $category = NULL) {
switch($op) {
// Successful login.
case 'login':
// Record timestamp in database.
db_query("INSERT INTO {login_history} (uid, timestamp) VALUES (%d, %d)",
$account->uid, $account->login);
break;
// $account object has been created and is given to us as $account parameter.
case 'load':
// Add the number of times user has logged in.
$account->loginhistory_count = db_result(db_query("SELECT COUNT(timestamp) AS
count FROM {login_history} WHERE uid = %d", $account->uid));
$account->loginhistory_previous_login = db_result(db_query("SELECT MAX(timestamp) AS
previous_login FROM login_history WHERE uid = %d", $account->uid));
break;
// 'My account' page is being created.
case 'view':
// Add a field displaying number of logins.
$items['login_history'] = array(
'title' => t('Number of Logins'),
'value' => $account->loginhistory_count,
'class' => 'member'
);
return array(t('History') => $items);
}
}- log ind eller opret konto for at skrive kommentarer
Problemet er at jeg skal skrive til $user->data ved bruger oprettelse, for at tilføje auto tac_lite terms til den nyoprettede bruger. Da tac lite benytter $user->data til at gemme disse oplysninger.
Så jeg kan ikke komme uden om det ved at oprette min egen tabel.
- log ind eller opret konto for at skrive kommentarer
Bruger du Drupal 5 eller Drupal 6?
I Drupal 6 kan du evt. skrive din egen action når en bruger oprettes (trigger). Se mere her:
Her defineres action:
function mymodule_action_info() {
return array (
'user_set_data_action' => array (
'description' => t('Set data in user at creation'),
'type' => 'user',
'configurable' => FALSE,
'hooks' => array('insert'),
),
);
}Her implementeres den:
function user_set_data_action(&$account, $context = array()) {
// user er nu ikke global men $account
$data = array('alder' => '20 år');
user_save($account, $data);
}- log ind eller opret konto for at skrive kommentarer
Undskyld mit sene response, jeg kører D6. TAC lite gør brug af triggers. Er det ikke lidt af det samme? Jeg prøver lige at lave en trigger og ser hvad jeg får ud af det.
- log ind eller opret konto for at skrive kommentarer
vrøvl, det var regcode der har triggers, som er det modul jeg laver rettelser i.
regcode vil ikke helt kalde min trigger. hvilket jeg også tror er ligemeget da den også bliver kaldt fra hook_user og vil resultere i det samme problem, at user_save bliver kaldt under hook_user.
ex // Trigger the event foreach (module_implements('regcode_used') as $module) { $hook = $module . '_regcode_used'; $hook($edit, $account, $regcode); }
Men jeg fandt ud af at under hook_user, virker min user_save, hvis jeg laver en die() lige efter. Hvilket er lige fedt.
Jeg ville gerne bruge actions, men jeg skal bruge den parameteren $category der ligger i regcode_user.
ex: regcode_user($op, &$edit, &$account, $category = NULL)
Eller smider man den midlertidigt i en session
pft
- log ind eller opret konto for at skrive kommentarer
Log ind
Seneste kommentarer
- Det letteste med de behov er
1 dag 15 timer siden - Kære Trine
Uddyb venligst
2 dage 7 timer siden - Der findes et modul som
2 dage 7 timer siden - Hej Alexander,
Jeg kender
3 dage 4 timer siden - SOAP Client modulet er måske
4 dage 11 timer siden - kan ikke lige finde ud af det
5 dage 6 timer siden - Lav bare en theme template
5 dage 16 timer siden - Tak :)
1 uge 1 dag siden - Lidt komisk at lave et modul
1 uge 1 dag siden - Og dog.......... når jeg
1 uge 1 dag siden

Måske er det fordi jeg mangler forståelse for
hook_user($op, &$edit, &$account, $category = NULL) { switch ($op) { case 'insert': // kode... } }
Hvis jeg nu vil tilføje noget til $account-data ved insert, hvordan gøres dette?