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)));
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
Er det ikke noget med at man ikke kan/skal benytte user_save i hook_user, da denne alligevel bliver kaldt efterfølgende?
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:
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);
}
}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.
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);
}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.
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
Problemet med at gemme i data er at det er et lidt specielt felt. Når user_save har gemt de almindelige properties på user objektet, tager den resten og serialzer ned i data.
Hvis man vil gemme noget i data, sætter man bare $user->etellerandet, eller $edit['etellerandet'].
- log ind eller opret konto for at skrive kommentarer
Log ind
Seneste kommentarer
- i sites/default/settings.php
3 dage 7 timer siden - Det kommer an på hvem man spørger…
3 dage 10 timer siden - Nåh ja!
3 dage 11 timer siden - Ja og nej. Hvis det benyttes
3 dage 18 timer siden - Deprecated
3 dage 20 timer siden - Har netop fået gennemskuet
4 dage 17 timer siden - Det hjalp mig, nu er det som
1 uge 2 dage siden - Jeg har to virtuelle maskiner
1 uge 2 dage siden - BOF betyder "birds of af
1 uge 4 dage siden - Det betyder at funktionen
1 uge 6 dage 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?