обновление пользователя() вызывается до сохранения учетной записи пользователя, а не после
Я создал модуль, который реализует 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);
}
Когда я проверяю результат на этом этапе, значения остаются теми же, что и до сохранения учетной записи пользователя.
Я думал, что это будет какой-то кэш базы данных, но это предполагается, что он будет удален после редактирования таблицы.
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')
.