Доступ к дополнительным полям профиля пользователя


9

Я добавил дюжину новых полей (в Drupal 7) в профили пользователей, используя:

Конфигурация -> Люди -> Настройки учетной записи -> Управление полями (admin / config / people / account / fields)

Как я могу получить доступ к этим значениям? Они не являются частью $ user

Пробовал, но безуспешно

global $user;
var_dump($user);

Ответы:


13

Я думаю, что нашел это. Кажется, есть еще один шаг.

global $user;
$user_full = user_load($user->uid); // user_load(uid) returns the complete array
var_dump($user_full);

Теперь у меня есть доступ к полям моего пользовательского профиля через $ user_full


1

Панели также могут делать это безболезненно с отношениями.


0

Я публикую свой ответ с /programming/8124089/get-value-of-custom-user-field-in-drupal-7- здесь, так как считаю, что это альтернативное решение. В этом примере показано, как использовать что-то вроде field_real_name вместо имени пользователя по умолчанию.

Если вы используете функцию предварительной обработки, вам не нужно извлекать глобальный $userобъект. Вы можете изменить поле в массиве $ variable, которое соответствует $variables['name']тому, что у вас есть в пользовательском поле, которое я назвал field_real_name. У вас есть доступ к $variablesмассиву, так что вы можете получить информацию о пользователе с этим - он загрузит информацию, связанную с uid ( см. Template_preprocess_username ):

function mythemename_preprocess_username(&$variables) {
    $account = user_load($variables['account']->uid);
    ...more code will go here in a moment
}

Если вы dpm($account)(или kpr($account)если вы не используете devel), вы увидите, что у вас есть доступ ко всей пользовательской информации, без использования глобального $userобъекта.

Затем вы можете изменить вывод $variables['name']на ваш field_real_nameследующим образом:

function mythemename_preprocess_username(&$variables) {

  // Load user information with user fields
  $account = user_load($variables['account']->uid);

  // See if user has real_name set, if so use that as the name instead
  $real_name = $account->field_real_name[LANGUAGE_NONE][0]['safe_value'];
  if (isset($real_name)) {
    $variables['name'] = $real_name;
  }
}

0

По какой-то странной причине поля профиля в Drupal 7 уже не те, что раньше. Однако объект профиля пользователя делает дополнительные поля профиля доступными в качестве элементов массива. Например:

$profile->field_fieldname['und'][0]['value']

недоступно, но будет работать при переписывании следующим образом:

$user_profile['field_fieldname']['#object']->field_fieldname['und'][0]['value'];

Поэтому я просто сделал следующее в своем коде:

/*
 * Create simplified variables as shortcuts for all fields.
 * Use these variables for read access lateron.
 */
$firstname = $user_profile['field_first_name']['#object']
  ->field_first_name['und'][0]['value'];

$middlename = $user_profile['field_middle_name']['#object']
  ->field_middle_name['und'][0]['value'];

$surname = $user_profile['field_surname']['#object']
  ->field_surname['und'][0]['value'];

$image = $user_profile['field_user_picture']['#object']
  ->field_user_picture['und'][0]['uri'];

Просто еще один способ заставить вещи работать, вместо того, чтобы $userснова вызывать объект.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.