обновление пользователя() вызывается до сохранения учетной записи пользователя, а не после


Я создал модуль, который реализует hook_user_update().
Насколько я понимаю, этот метод вызывается после того, как пользователь отредактировал свои данные и они были сохранены в базе данных.

Проблема, которую я замечаю, заключается в том, что это не то, что на самом деле происходит с моим кодом: код вызывается раньше.

function mymodule_user_update(&$edit, $account, $category) {
  $username = "username";
  $password = "password";
  $database = "database";

  mysql_connect(localhost,$username,$password);
  @mysql_select_db($database) or die( "Unable to select database");
  $query = "select * from somewhere;";
  $result = mysql_query($query);

  $num = mysql_numrows($result);

  $myFile = "some_file.txt";
  $fh = fopen($myFile, 'w') or die("can't open file");
  $stringData = "now: ".date('Y-m-d H:i:s')." Value is:".mysql_result($result,0);
  fwrite($fh, $stringData);
  fclose($fh);      
}

Когда я проверяю результат на этом этапе, значения остаются теми же, что и до сохранения учетной записи пользователя.
Я думал, что это будет какой-то кэш базы данных, но это предполагается, что он будет удален после редактирования таблицы.

Author: kiamlaluno, 2011-07-31

1 answers

На самом деле, в Drupal 7 user_save() сначала вызывает hook_user_presave(), затем сохраняет учетную запись пользователя в базе данных и вызывает hook_user_update() или hook_user_insert(). Невозможно, чтобы hook_user_update() вызывался до сохранения учетной записи пользователя.
hook_entity_update() и hook_entity_insert() вызываются сразу после hook_user_update() и hook_user_insert(). Возможные обновления полей должны выполняться с помощью этих крючков.

// Invoke hook_user_presave() for all modules.
user_module_invoke('presave', $edit, $account, $category);

// …

if (is_object($account) && !$account->is_new) {
  // ...
  $success = drupal_write_record('users', $account, 'uid');
  if ($success === FALSE) {
    // The query failed - better to abort the save than risk further
    // data loss.
    return FALSE;
  }

  // …

  user_module_invoke('update', $edit, $account, $category);
  module_invoke_all('entity_update', $account, 'user');
}
else {
  // …

  $success = drupal_write_record('users', $account);
  if ($success === FALSE) {
    // On a failed INSERT some other existing user's uid may be returned.
    // We must abort to avoid overwriting their account.
    return FALSE;
  }

  // …

  user_module_invoke('insert', $edit, $account, $category);
  module_invoke_all('entity_insert', $account, 'user');

  // …
}

// …

В Drupal 6, user_save() вызывает hook_user('update'), сохраняет данные пользователя в базе данных, а затем вызывает hook_user('afer_update'); если учетная запись пользователя ранее не существовала, она сохраняет данные в базе данных, а затем вызывает hook_user('insert').

 12
Author: kiamlaluno, 2014-09-30 02:13:12