Глобальный объект $user не всегда "Полностью загружен"
У меня есть модуль Drupal 6, который реализует функцию hook_user() для добавления пользовательского свойства в op='load';
mymodule_user($op, &$edit, &$account, $category = NULL) {
$account->external_id = mymodule_get_user_external_id($account->uid);
}
В модулях я получаю доступ к глобальному объекту $user. Я нахожу, что иногда у него есть свойство my ->external_id, а иногда его нет.
В результате мне приходится проверять, установлено ли мое пользовательское свойство, а если нет, вызывайте user_load()
if(isset($GLOBALS['user']->external_id)) {
$account = $GLOBALS['user'];
} else {
$account = user_load($GLOBALS['user']->uid);
}
Фу! Это известная проблема, или это звучит так, будто я делаю что-то не так?
2 answers
Нет, вы делаете это правильно, так как это известная проблема/поведение. Проверьте http://api.drupal.org/api/drupal/developer%21globals.php/global/user/6 для получения гораздо большей информации об этом. Ссылка оттуда, http://drupal.org/node/57287 , напрямую говорит с вашей точкой зрения (это для D7, но относится к D6).
С пользовательскими крючками общее эмпирическое правило заключается в том, что, когда параметр в API указан как $account
, не ожидайте, что он будет взаимозаменяем с $user
. Таким образом, в вашем случае выполнение user_load()
для явной загрузки дополнительной информации является уместным и необходимым. hook_node_access
в Drupal 7 есть еще один пример, который делает это. Аналогичная вещь происходит с объектами, подлежащими заполнению, с некоторыми крючками, где не все поля присутствуют в аргументе, переданном в крючок.
Существует ответьте на главном сайте SO, который более подробно рассматривает эту тему. Существует также связанная проблема по drupal.org и об этом тоже.