Делаю свой первый сайт на друпале. И я сделал пользовательское поле пользователя: Полное имя. Теперь я хочу получить значение этого поля в моем шаблоне, чтобы сказать «Привет, %username%». Как я могу это сделать?
Получить значение пользовательского поля в шаблоне Drupal 7?
Ответы (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
может потребоваться изменить, если вы используете многоязычный сайт.
$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
$
в вызове entity_metadata_wrapper()
должен быть $user
вместо user
- person FLY; 13.08.2013
Я знаю, что этот вопрос был задан довольно давно, но я хотел опубликовать альтернативу. Похоже, вы хотите изменить поле в массиве $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;
}
}
Мы можем добавить приведенный ниже код в любое место файла шаблона.
<?php
global $user;
$user = user_load($user->uid);
print $user->name;
?>