Получить значение пользовательского поля в шаблоне Drupal 7?

Делаю свой первый сайт на друпале. И я сделал пользовательское поле пользователя: Полное имя. Теперь я хочу получить значение этого поля в моем шаблоне, чтобы сказать «Привет, %username%». Как я могу это сделать?


person Konstantin Bodnia    schedule 14.11.2011    source источник


Ответы (4)


В зависимости от вашего имени настройки/поля, что-то вроде этого в template.php (функция предварительной обработки для файла шаблона):

function mytheme_preprocess_page() {
  global $user;
  $user = user_load($user->uid); // Make sure the user object is fully loaded

  $vars['full_name'] = $user->field_full_name[LANGUAGE_NONE][0]['value'];
}

Затем что-то вроде этого в page.tpl.php:

if (isset($full_name) && !empty($full_name)) :
  echo 'Hello ' . $full_name;
endif;

Обратите внимание, что LANGUAGE_NONE может потребоваться изменить, если вы используете многоязычный сайт.

person Clive    schedule 14.11.2011
comment
Вы должны использовать field_get_items. Прямой доступ может прерваться на многоязычном веб-сайте или при изменении структуры полей. - person gagarine; 26.11.2012
comment
@gagarine Это было давным-давно. Полевые структуры не могут изменить FYI, для этого нет механизма. - person Clive; 26.11.2012
comment
Это работает только в шаблонах или также в модуле? когда я загружаю своего пользователя с помощью $account = user_load($uid);, я получаю только пустые массивы вместо настраиваемых полей: $account->pwyw_balance - это просто массив() без содержимого. Нужно ли загружать настраиваемые поля с дополнительным кодом? То же самое происходит, когда я загружаю пользователя с помощью $wrapper = entity_metadata_wrapper('user', $account)->value(). $wrapper['pwyw_balance']это пустой массив. - person nerdoc; 29.10.2015

Ответ Клайва правильный, за исключением того, что вы должны использовать field_get_items чтобы получить значения для поля. Он будет обрабатывать язык для вас. Вы также должны очистить значение.

function THEME_preprocess_page() {
  global $user;
  $user = user_load($user->uid); // Make sure the user object is fully loaded
  $full_names = field_get_items('user', $user, 'field_full_name');
  if ($full_names) {
    $vars['full_name'] = check_plain($full_names[0]['value']);
  }
}

Если на вашем сайте используется модуль Entity API, вы также можете использовать оболочку метаданных сущности, подобную этой

function THEME_preprocess_page() {
  global $user;
  $user = user_load($user->uid); // Make sure the user object is fully loaded
  $wrapper = entity_metadata_wrapper('user', $user);
  $vars['full_name'] = $wrapper->field_full_name->get(0)->value(array('sanitize' => TRUE));
}

См. также Написание надежного кода, использующего поля, в Drupal 7

person Pierre Buyle    schedule 07.12.2011
comment
отсутствующий знак $ в вызове entity_metadata_wrapper() должен быть $user вместо user - person FLY; 13.08.2013
comment
Привет, Пьер, следующий код не получает никаких данных. $пользователь = user_load('72'); $first_name = field_get_items('пользователь', $user, 'field_first_name'); - person Ananth; 09.05.2014
comment
Если вы не получаете никаких данных, это означает, что для поля этого объекта нет значения. - person Pierre Buyle; 29.10.2015

Я знаю, что этот вопрос был задан довольно давно, но я хотел опубликовать альтернативу. Похоже, вы хотите изменить поле в массиве $variables, которое равно $variables['name'], на то, что есть в вашем пользовательском поле, которое я назвал field_real_name. Если вы используете функцию предварительной обработки, нет необходимости извлекать глобальный объект $user. У вас есть доступ к массиву $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;
  }
}
person kbrinner    schedule 14.08.2015

Мы можем добавить приведенный ниже код в любое место файла шаблона.

<?php
global $user;
$user = user_load($user->uid);
print $user->name;
?>
person Sankara Narayanan    schedule 05.01.2016