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)));
willowwillow
8. februar 2010 - 19:40
Permalink
Måske er det fordi jeg mangler forståelse for
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?
rolfington
9. februar 2010 - 8:51
Permalink
The Drupal way
Hvis du vil gemme noget data i $user object kan du gøre det direkte gennem user_save funktionen:
// tilføj brugers alderglobal $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
willowwillow
9. februar 2010 - 8:54
Permalink
user_save
Er det ikke noget med at man ikke kan/skal benytte user_save i hook_user, da denne alligevel bliver kaldt efterfølgende?
rolfington
9. februar 2010 - 9:04
Permalink
Jo du må helst ikke bruge
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:
http://api.drupal.org/api/function/hook_user/6
rolfington
9. februar 2010 - 9:14
Permalink
Her er et eksempel på
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);
}
}
willowwillow
9. februar 2010 - 13:16
Permalink
tac_lite
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.
rolfington
9. februar 2010 - 14:05
Permalink
Bruger du Drupal 5 eller
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);
}
willowwillow
2. marts 2010 - 20:25
Permalink
hmm, spændende
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.
willowwillow
2. marts 2010 - 22:25
Permalink
vrøvl, det var regcode
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
Xen
29. marts 2010 - 23:42
Permalink
Problemet med at gemme i data
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'].