Глобальная переменная $user

Опубликовано 2011.12.12 в разделе Drupal

Глобальная переменная user хранит в себе основную информацию о текущем пользователе. То есть находясь на сайте в эту переменную помещается ваш ник,дата регистрации,e-mail и так далее. Получить эту переменную можно в любой функции любого модуля,главное чтоб она была объявленной. То есть в коде функции необходимо написать
  1. global $user
. Вывести переменную можно с помощью функции print_r , не echo , так как это не строка. Drupal 7: Итак,выводим:
  1. global $user;
  2. echo '<pre>';
  3. print_r($user);
  4. echo '</pre>';
Я запускаю эту функцию на реальном сайте и вижу: Я сразу оставлю комментарии ко всем нужным нам пунктам.
  1. stdClass Object
  2. (
  3. [uid] => 1 // уникальный номер пользователя
  4. [name] => admin //логин
  5. [pass] => $S$hfTY99АAckRXyPnCT8y7GaFhWG/pOv985O0ePXkrq //зашифрованный пароль
  6. [mail] => example@gmail.com //ящик
  7. [theme] => //тема пользователя.если она не задана-то используется тема по умолчанию
  8. [signature] => //подпись,указанная в настройках пользователя
  9. [signature_format] => filtered_html //формат ввода этой подписи
  10. [created] => 1316016673 //дата создания аккаунта
  11. [access] => 1323676302 //дата получения доступа к сайту
  12. [login] => 1323061398 //дата последнего логина
  13. [status] => 1 //статус.1-пользователь активен.0-заблокирован
  14. [timezone] => Europe/Moscow //временная зона(часовой пояс)
  15. [language] => ru //язык пользователя
  16. [picture] => 0 //аватар
  17. [init] => example@gmail.com
  18. [data] => Array
  19. (
  20. [contact] => 0
  21. [block] => Array
  22. (
  23. [views] => Array
  24. (
  25. [og_members-block_1] => 1
  26. )
  27.  
  28. )
  29.  
  30. [overlay] => 1
  31. [htmlmail_plaintext] => 0
  32. )
  33.  
  34. [sid] => 0nMYwlyPdjhGSddfK03bxQ2OTGTIchuGQg-CRQHvvSQ //идентификатор сессии
  35. [ssid] =>
  36. [hostname] => 41.41.151.11 //IP адрес пользователя
  37. [timestamp] => 1323676302 //его текущее время
  38. [cache] => 0
  39. [session] => 'много всего ненужного'
  40. [roles] => Array //роли пользователя
  41. (
  42. [2] => authenticated user
  43. [3] => super_administrator
  44. [5] => Автор
  45. )
  46.  
  47. )
Теперь,зная из чего состоит эта переменная-мы можем ей пользоваться. Примеры кода:
  1. global $user;
  2.  
  3. //вывод имени
  4. echo $user->name;
  5.  
  6. //IP
  7. echo $user->hostname;
  8.  
  9. //статус
  10. $status=$user->status;
  11. if($status==1){
  12. echo 'Пользователь '.$user->name.' активен';
  13. }else{
  14. echo 'Пользователь '.$user->name.' заблокирован';
  15. }
  16.  
  17. //ящик
  18. echo $user->mail;
Нечего сложного. Например если вам известен только uid пользователя-то можно воспользоваться функцией user_load, передав функции номер пользователя. Например:
  1. echo '<a href="/user/'.$user->uid.'">'.$user->name.'</a>';
Ещё:
  1. //загрузка пользователя под номером 5
  2. $user=user_load(5);
Если нужно изменить объект пользователя, то вначале загрузите его, потом добавьте/удалите свои данные и сохраните объект.
  1. // Загрузка пользователя под номером 7 и изменение ему почтового ящика
  2. $user=user_load(7);
  3. $user->mail = 'new-email@example.com';
  4. user_save($user);
  1. // Загрузка пользователя под номером 10 и добавление ему роли.
  2. // Роль обязательно должна быть создана заранее. Пусть это роль автора под номером 4
  3. $user=user_load(10);
  4. $user->roles[4]= 'Автор';
  5. user_save($user);
Обратите внимание, что сохранять надо объект пользователя, а не указывать только идентификатор пользователя.

41 Комментариев

Оставить комментарий

  1. Гость 2016/08/08

    $user в entity form как-то странно пристроено. Можно ли изменить автора у отправленных форм?

    Ответить

    1. Админ 2016/08/10

      Точно прям не скажу, но например можно поальтерить форму, в альтере добавить свой валидатор.
      Затем в валидаторе в переменную с автором поместить своё нужное значение. Тогда уже до сохранения дойдёт то что вам нужно.

      Ответить

      1. Гость 2016/08/10

        автора менять надо выборочно и на определенного по настроению (их штук 10 штатных), и не редко оптом. Логично VBO применить.

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

        Ответить

        1. Админ 2016/08/12

          У каждой формы должен быть id.
          В hook_form_alter выведи $form_id - узнаешь айдишник этой формы.
          И прям там же саму форму поальтеришь.

          Ответить

      2. Гость 2016/08/10

        автора менять надо выборочно и на определенного по настроению (их штук 10 штатных), иногда "оптом". Логично что VBO https://www.drupal.org/project/views_bulk_operations уместно.

        Автор у обычной ноды меняется "из коробки"
        здесь же с entityform - совершенно не понятно что и как, хотя разработчики модуля и позиционируют как полная интеграция сущностей

        Ответить

  2. Гость 2016/05/11

    А как скрыть $signature в комментариях от незарегистрированных посетителей?

    Стоит модуль Field Permissions, но signature из профиля пользователя - не тянет... ))

    Ответить

    1. Админ 2016/05/12

      Может просто скрывать его в шаблоне или удалять в препроцессе комментария?

      Ответить

      1. Гость 2016/05/12

        Конешно! Но почему-то не хочет нормально работать то, что по незнанию сочиняется... ))

        function тема_preprocess_comment(&$vars) {
        if (!user_has_role(2)) {
        hide($vars['content']['links']);} } - работает с links, а с signature - нет
        и ещё с десяток вариантов есть, но никак интеллекту не хватает.
        Помогите пожалуйста.

        Ответить

        1. Админ 2016/05/13

          hide применяется в шаблоне, а не в препроцессе.
          Вот например такой код у меня сработал:

          1. function bartik_preprocess_comment(&$vars) {
          2. unset($vars['signature']);
          3. }

          Ответить

          1. Гость 2016/05/14

            Супер! Спасибо! работает как надо

            но если усложнить
            function тема_preprocess_comment(&$variables) {
            global $user;
            if (!user_has_role(2)) {
            unset($variables['signature']);
            unset($variables['content']['links']);}}

            только для неавторизированного пользователя появляется Notice: Undefined variable: signature в функции include() (строка 1 в файле /hermes/..../site/domian/komment/sites/all/themes/тема/comment.tpl.php)

            А в comment.tpl только

            Ответить

            1. Админ 2016/05/15

              Можете написать @unset($variables['signature']);
              Знак @ сделает подавление ошибки.
              Или лучше проверку перед удалением:

              1. if(!empty($variables['signature'])){
              2. unset($variables['signature']);
              3. }

              Ответить

              1. Гость 2016/05/15

                Знак @ у меня в 500 ошибку выпадает

                А проверка - бездействует... ))

                Ответить

                1. Админ 2016/05/15

                  Значит @ с unset не работает.
                  Можно ещё:

                  1. if (isset($variables['signature'])) {
                  2. unset($variables['signature']);
                  3. }

                  Ответить

                  1. Гость 2016/05/16

                    По-ходу signature простыми вариантами манипулироваться не особо хочет... ))

                    Даже у модуля hide_user_signature-7.x какая-то странная логика внутри, а там только переключатель скрыть\показать

                    Ответить

                    1. Админ 2016/05/16

                      Да, поглядел его код. Там срабатывает hook_comment_view_alter.

                      1. /**
                      2.  * Implements hook_comment_view_alter().
                      3.  */
                      4. function hide_user_signature_comment_view_alter(&$build) {
                      5. switch (variable_get('hide_user_signature', HIDE_USER_SIGNATURE_SHOW)) {
                      6. case HIDE_USER_SIGNATURE_SHOW:
                      7. break;
                      8.  
                      9. case HIDE_USER_SIGNATURE_HIDE:
                      10. $build['comment_body']['#object']->signature = '';
                      11. break;
                      12.  
                      13. case HIDE_USER_SIGNATURE_CUSTOM:
                      14. if (isset($GLOBALS['user']->hide_user_signature) && $GLOBALS['user']->hide_user_signature == HIDE_USER_SIGNATURE_HIDE) {
                      15. $build['comment_body']['#object']->signature = '';
                      16. }
                      17. break;
                      18. }
                      19. }

                      Если использовать его - то можно попробовать так:
                      1. function mymodule_comment_view_alter(&$build) {
                      2. global $user;
                      3. if (!user_has_role(2)) {
                      4. $build['comment_body']['#object']->signature = '';
                      5. }
                      6. }

                      Но для этого вам потребуется создать свой модуль. Это не сложно))
                      Вам там в module файле вот только один этот хук достаточно прописать и всё.

                      Ответить

                      1. Гость 2016/05/16

                        Ура!!!
                        Из модуля работает как надо!
                        Спасибо!

                        Ответить

                        1. Админ 2016/05/16

                          Пожалуйста)
                          Только сейчас заметил что ссылки не пропечатались:
                          Вот и вот

                          Ответить

  3. Гость 2015/12/31

    Где можно посмотреть все глобальные переменные друпала и все что к ним относится? На drupal.org не нашел.

    Ответить

    1. Админ 2016/01/04

      Как вариант - можно попробовать такой код:

      dpm(get_defined_vars());

      Разместите его вне функции и попробуйте.
      Для работы dpm должен быть включен модуль Devel

      Ответить

  4. Гость 2015/12/31

    Где можно посмотреть все глобальные переменные друпала и все что к ним относится? На drupal.org не нашел.

    Ответить

  5. Гость 2015/09/20

    Здравствуйте!

    Подскажите пожалуйста как работать с переменными.
    Необходимо вывести переменную из кастомного модуля в page.tpl.php .
    Можно конечно в template.php в ИМЯ_ТЕМЫ_preprocess_page() создать переменную в массиве $variables , но в модуле она недоступна, а template.php не хочется излишне загромождать.

    Ответить

    1. Админ 2015/09/21

      Не бойтесь добавить препроцесс в template.php
      А в модуле переменная как хранится? Вы как и прежде держите переменную в модуле, передавайте в ИМЯ_ТЕМЫ_preprocess_page и оттуда уже в шаблон. Это будет самый правильный подход.

      Ответить

      1. Гость 2015/09/21

        Все оказалось проще. В модуле не видно текущий объект ноды и то его можно загрузить, распарсив УРЛ. У меня модуль строит фрагмент HTML (список терминов), который потом помещается в переменную и выводится в page.tpl . Для этой задачи использовал ИМЯ_МОДУЛЯ_preprocess_page() и все получилось.

        Ответить

  6. Гость 2014/04/03

    а можно ли как то вытащить значение определенного поля юзера-автора просматриваемого материала?

    Ответить

    1. Админ 2014/04/04

      Да.

      1. //загружаем автора ноды.
      2. $node_author = user_load($node->uid);
      3. print $node_author->field_name;

      Ответить

      1. Гость 2014/04/04

        хм - мне скрипт в ответ выдает следующее:
        Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 173 of
        что то типо того что только строковые или числовые значения можно в user_load?

        Ответить

        1. Админ 2014/04/06

          Ну $node->field_name - это условно, это обычно массив.
          Сделай print_r($node->field_name); - и сразу станет понятно.
          Обычно это так выглядит $node->field_name[0]['value'];
          Вместо value бывает tid, если это поле ссылается на термин или что-нибудь ещё.

          Ответить

          1. Гость 2014/04/07

            что то вообще никакой реакции( И не выводит ничего и ошибки никакой не выдает если вставляю данный код.

            Ответить

            1. Админ 2014/04/08

              А так прям и писали - $node?
              Так тоже ничего не выводит?

              1. $node_author = user_load($node->uid);
              2. print_r($node_author);

              Ответить

              1. Гость 2014/04/09

                Вот такое пишет в этом случае
                Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 173 of public_html/includes/entity.inc).

                Ответить

                1. Админ 2014/04/10

                  Может тогда переменной $node нет? Попробуй перед этой конструкцией добавить global $node;
                  А где вообще этот код пишешь?

                  Ответить

                  1. Гость 2014/04/10

                    все равно тоже самое(
                    вставляю в блок, блок размещаю в сайдбаре

                    Ответить

                    1. Админ 2014/04/11

                      А, ну с этого бы и начинали. В блоке нет объекта ноды. Поэтому и не работает.
                      Его можно получить так.

                      1. if((isset(arg(0))) && (isset(arg(1))) && (arg(0) == 'node') && ((int) arg(1) > 0)) {
                      2. $node = node_load((int) arg(1));
                      3. $node_author = user_load($node->uid);
                      4. print_r($node_author);
                      5. }

                      Это конечно не очень красивый способ. На странице будет происходить лишний node_load и user_load , но это самый простой и быстрый способ.

                      Ответить

                      1. Гость 2014/04/12

                        странно - в этом случае вообще выводит пустую страницу при попытке просмотреть любой материал

                        Ответить

                        1. Админ 2014/04/13

                          Значит синтаксическая ошибка в коде...
                          Вот такой вариант кода будет работать, только что проверил.

                          1. $arg = arg();
                          2. if((isset($arg[0])) && (isset($arg[1])) && ($arg[0] == 'node') && ((int) $arg[1] > 0)) {
                          3. $node = node_load((int) $arg[1]);
                          4. $node_author = user_load($node->uid);
                          5. print_r($node_author);
                          6. }

                          Ответить

                          1. Гость 2014/04/13

                            Во- заработало, большое спасибо)

                            Ответить

                            1. Админ 2014/04/14

                              Пожалуйста))

                              Ответить

  7. Гость 2014/01/28

    Замечательная статья!
    Только по ней не разобрался, а как добавить пользователю номер телефона? В профиле (друпал 7 ) создано поле "номер телефона" и надо его заполнять скриптом. Как это сделать?

    так не сработало:
    $user=user_load(7); // только я не делал этот лоад, так как у меня переменная юзер уже используется в скрипте.
    $user->field_telnum = '555';
    user_save($user);

    Ответить

    1. Админ 2014/01/29

      Попробуй написать $user->field_telnum[0]['value'] = '555';

      Ответить

      1. Гость 2014/01/29

        да, вот так получилось:

        $user->field_telnum['und'][0]['value'] = $user_phone;
        user_save($user);

        Ответить

        1. Админ 2014/01/29

          Да, точно... und - этот андефайнед для языка ноды нужен.

          Ответить

Ваш комментарий успешно создан

Ваш комментарий

  • Для выделения кода оберните его в тэги <code> и </code>
  • Отметьте дом