Глобальный объект $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);
}

Фу! Это известная проблема, или это звучит так, будто я делаю что-то не так?

 1
Author: kiamlaluno, 2012-05-01

2 answers

Нет, вы делаете это правильно, так как это известная проблема/поведение. Проверьте http://api.drupal.org/api/drupal/developer%21globals.php/global/user/6 для получения гораздо большей информации об этом. Ссылка оттуда, http://drupal.org/node/57287 , напрямую говорит с вашей точкой зрения (это для D7, но относится к D6).

 3
Author: Jimajamma, 2012-05-01 19:31:02

С пользовательскими крючками общее эмпирическое правило заключается в том, что, когда параметр в API указан как $account, не ожидайте, что он будет взаимозаменяем с $user. Таким образом, в вашем случае выполнение user_load() для явной загрузки дополнительной информации является уместным и необходимым. hook_node_access в Drupal 7 есть еще один пример, который делает это. Аналогичная вещь происходит с объектами, подлежащими заполнению, с некоторыми крючками, где не все поля присутствуют в аргументе, переданном в крючок.

Существует ответьте на главном сайте SO, который более подробно рассматривает эту тему. Существует также связанная проблема по drupal.org и об этом тоже.

 1
Author: mpdonadio, 2017-05-23 12:41:25