hook_user - insert & update data i users

9 replies [Seneste indlæg]
willowwillow
User offline. Last seen 2 dage 9 timer ago. Offline
Joined: 26/01/2010

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
User offline. Last seen 2 dage 9 timer ago. Offline
Joined: 26/01/2010
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
User offline. Last seen 6 timer 30 minutter ago. Offline
Joined: 25/09/2006
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 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

willowwillow
User offline. Last seen 2 dage 9 timer ago. Offline
Joined: 26/01/2010
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
User offline. Last seen 6 timer 30 minutter ago. Offline
Joined: 25/09/2006
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
User offline. Last seen 6 timer 30 minutter ago. Offline
Joined: 25/09/2006
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
User offline. Last seen 2 dage 9 timer ago. Offline
Joined: 26/01/2010
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
User offline. Last seen 6 timer 30 minutter ago. Offline
Joined: 25/09/2006
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
User offline. Last seen 2 dage 9 timer ago. Offline
Joined: 26/01/2010
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
User offline. Last seen 2 dage 9 timer ago. Offline
Joined: 26/01/2010
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

Udgiv indhold