Получаем поля из профиля текущего пользователя

Есть у меня сайт, где в разных местах нужно выводить разные данные пользователя. Причем включая те, которые в профиле. Из коробки MODX умеет выводить только имя пользователя и id (ну и еще несколько мало кому нужных данных). Погуглил на предмет того, как выводить. Не нашел ничего стоящего, и написал свой велосипед под эти нужды.



Сниппет вызывается просто и имеет один параметр:

[[!getUser? &field=`field_name`]]

Cам сниппет:

<?php
$profile = $modx->user->getOne('Profile');
switch ($field) {
    case "fullname":
        return $profile ? $profile->get('fullname') : '';
        break;
    case "email":
        return $profile ? $profile->get('email') : '';
        break;
    case "phone":
        return $profile ? $profile->get('phone') : '';
        break;
    case "mobilephone":
        return $profile ? $profile->get('mobilephone') : '';
        break;
    case "fax":
        return $profile ? $profile->get('fax') : '';
        break;
    case "gender":
        return $profile ? $profile->get('gender') : '';
        break;
    case "address":
        return $profile ? $profile->get('address') : '';
        break;
    case "country":
        return $profile ? $profile->get('country') : '';
        break;
    case "city":
        return $profile ? $profile->get('city') : '';
        break;
    case "zip":
        return $profile ? $profile->get('zip') : '';
        break;
    case "state":
        return $profile ? $profile->get('state') : '';
        break;
    case "website":
        return $profile ? $profile->get('website') : '';
        break;
}

Если понадобится, можно внести и недостающие поля (полный список)

С extended полями пока не заморачивался, ибо незачем.

ЗЫ: Писал на PHP второй раз в жизни, если что-то неоптимально — буду рад конструктивным замечаниям.
Павел Ширяев
17 апреля 2015, 19:48
modx.pro
3
18 041
-2

Комментарии: 13

Alexander V
17 апреля 2015, 23:24
0
Т.е., чтобы вывести 5 полей, надо 5 снипетов вызвать?
    Павел Ширяев
    18 апреля 2015, 00:48
    0
    Ну вообще да. У меня не стояло задачи вывести в одном месте сразу несколько полей.

    Это такой суррогат [[+modx.user.id]], только для полей профиля.

    Возможно, потом доработаю когда появится такая необходимость.
Wassi Wassinen
18 апреля 2015, 01:27
2
+4
[[+modx.user.id:userinfo=`username`]]


подставляй в userinfo любое нужное поле.
    Сергей Фещуков
    18 апреля 2015, 08:58
    1
    +1
    Кому интересно, предлагаю свой вариант подобного сниппета, но только тут несколько отличий:
    1. Можно указать любого пользователя, а не текущего.
    2. Если несколько полей или указан параметр toPh, то всё сохраняется в плейсхолдерах.
    3. Если указано одно поле, оно и выводится при вызове сниппета.
    <?php
    if ( empty($id) ) return false;
    $fields = empty($fields) ? array('fullname') : explode(',', trim($fields));
    $toPh = empty($toPh) ? false : true;
    $user = $modx->getObject('modUser', intval($id));
    $profile = $user->getOne('Profile');
    foreach ($fields as $field) {
        $field = trim($field);
        $return[$field] = $profile->get($field);
    }
    if ($toPh || count($return) > 1) $modx->toPlaceholders($return, 'user.'.$id);
    else return $return[$field];

    А ваш сниппет можно было уместить в несколько строк:
    <?php
    $profile = $modx->user->getOne('Profile');
    $value = $profile ? $profile->get($field) : '';
    return empty($value) ? '' : $value;
      Павел Ширяев
      18 апреля 2015, 10:31
      1
      0
      О, точно, спасибо! :)

      Кстати, и коментарий Wassi Wassinen тоже работает — почему-то мне не удалось его нагуглить. Тем лучше, будет здесь, и кто-то в поиске на него наткнется.
      Сергей Шлоков
      18 апреля 2015, 12:36
      +2
      Собственно, твой сниппет работает только с полями профиля, а фильтр userinfo и с полями пользователя тоже.
      1. Можно указать любого пользователя, а не текущего.
      Пожалуйста
      [[+modx.user.id:notempty=`16`:userinfo=`fullname`]]
      или так
      [[+modx.user.id:ne=`0`:then=`16`:userinfo=`fullname`]]
      2. Если несколько полей или указан параметр toPh, то всё сохраняется в плейсхолдерах.
      Правда возможно вывести только одно поле в плейсхолдер
      [[+modx.user.id:ne=`0`:then=`16`:userinfo=`fullname`:toPlaceholder=`userfullname`]]
      Пользователь: [[+userfullname]]
      Чисто для информации.
        Павел Ширяев
        18 апреля 2015, 18:15
        +2
        Сергей, спасибо за ликбез, очень интересно. Думаю, не мне одному.
        Сниппет мой, получается, настоящий велосипед, да еще с квадратными колесами :)
        Но все равно полезно, много ценной инфы в комментариях.
          Сергей Шлоков
          18 апреля 2015, 19:46
          0
          На здоровье.
          П.С. Я писал Сергею Фещукову :)
          Сергей Фещуков
          19 апреля 2015, 19:33
          0
          Да, я делал сниппет для клиентского сайта-галереи, где нужно было сделать удобное изменение и вывод информации о фотографе. Поэтому глубоко не увлекался и сделал только поля профиля. Думаю, развить идею и добавить поля пользователя не сложно, если это кому-то нужно будет.

          Фильтр userinfo хорош, но нужно было выводить много полей, а вызывать везде этот фильтр… Есть подозрение, что быстрее вызвать сниппет один раз, чем много раз фильтр. Хотя это не проверялось, так что могу ошибаться.
        Stepan
        11 июня 2021, 10:06
        0
        а как удалить комент?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13