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

Используя модуль профиля, я создал текстовое поле под названием profile_real_name, которое пользователь заполняет при регистрации. Как мне получить доступ к этой переменной в node.tpl.php?

Я использовал функцию dsm($user) для вывода пользовательских переменных, и она содержала все, кроме данных для profile_real_name

Я также запустил dsm($vars) на phptemplate_preprocess_user_profile и увидел, что он содержит объект с именем account, который действительно содержит необходимую мне информацию, но этот объект недоступен в переменной $ user.

Большое спасибо


person screenm0nkey    schedule 17.02.2010    source источник


Ответы (3)


Если вы хотите получить доступ к информации профиля автора в node.tpl.php, тогда вы хотите работать с функцией phptemplate_preprocess_node, а не с user_profile. Однако функция предварительной обработки узла по умолчанию не имеет объекта $ account, поэтому вам придется загрузить его в:

Это входит в функцию phptemplate_preprocess_node в вашем файле template.php:

if ($vars['uid']) {
  $vars['account'] = user_load(array('uid' => $vars['uid']));
}

Тогда вы сможете получить доступ к значениям профиля автора в вашем node.tpl.php. Значение, о котором вы конкретно спрашивали, будет:

print($account->profile_real_name);

Однако похоже, что вы можете захотеть, чтобы имя автора узла отображалось как значение profile_real_name, а не имя его учетной записи?

Если это так, то НАМНОГО более эффективным способом было бы переопределить функцию theme_username.

Это не совсем то, о чем вы спрашивали, поэтому я не буду здесь вдаваться в подробности, но этот пост на форумах drupal.org будет отличным местом для начала работы с Drupal 5 или 6: http://drupal.org/node/122303#comment-204277

person ashtonium    schedule 19.02.2010
comment
Спасибо аштониум. Возможно, я ошибаюсь, но, похоже, есть несколько способов добиться того же с Drupal, что немного сбивает с толку новичка, но мне все равно это нравится. - person screenm0nkey; 21.02.2010
comment
Да, это одно из преимуществ и недостатков Drupal: оценка различных возможных способов решения проблемы и выбор лучшего для вашей ситуации. Хотя мне это тоже нравится. - person ashtonium; 22.02.2010
comment
Следует ли мне вставить это в функцию mytheme_preprocess_user_profile? Спасибо! - person Rosamunda; 13.01.2013

$account - это то, что вы обычно называете пользователем, который не является глобальным пользователем, чтобы избежать случайной перезаписи глобального пользователя, что может привести к тому, что пользователь войдет в систему как этот пользователь.

Я только что немного проверил, и самый простой способ решить вашу проблему - использовать в шаблоне $ account вместо $ user.

Использование $user в шаблоне или выполнение действий, предложенных WmasterJ, является ошибкой. Вы опубликуете неверные данные. Вы будете публиковать данные вошедшего в систему пользователя, а не данные пользователя, профиль которого просматривается. Эта ошибка возникает, когда вы просматриваете профили всех других пользователей, кроме своего собственного.

Функции предварительной обработки сделать несложно, в вашем файле template.php в вашей теме вы просто заменяете phptemplate именем вашей темы, определяющим код. В этом случае вам не нужно изменять функцию предварительной обработки, поскольку у вас уже есть то, что вам нужно.

person googletorp    schedule 17.02.2010
comment
Привет, googletorp, я все еще уверен, как мне получить переменную из phptemplate_preprocess_user_profile в другую функцию предварительной обработки. Честно говоря, я не совсем уверен, как создавать свои собственные функции препроцесса, но я изучу ваш ответ и узнаю, как это сделать. Также знаете ли вы, почему ответ WmasterJ, приведенный ниже, был отклонен? Что-то делать в Drupal - это неправильно? - person screenm0nkey; 18.02.2010
comment
Привет, googletorp, теперь я понимаю, что вы имеете в виду, но до сих пор не знаю, как получить доступ к массиву $ account. Я попытался найти его, но ничего не нашел. Я поместил dsm ($ account) в свой phptemplate_preprocess_node, и он вернулся ни с чем. - person screenm0nkey; 19.02.2010
comment
$ account доступен в шаблоне, а не в функции предварительной обработки. Также это не массив, а объект. - person googletorp; 19.02.2010

Если вы хотите сделать это, например, в user-profile.tpl.php, вся необходимая информация существует в массиве $account.

В противном случае вы можете получить доступ к пользовательским данным, загрузив пользовательский объект на основе его идентификатора (от лица, которое в данный момент вошло в систему, или если вы можете запросить БД и получить uid таким образом).

Сначала получите uid текущего пользователя:

$uid = $user->uid;

Затем загрузите объект пользователя:

// Create user objets based on uid ()
$user_obj = user_load($user->uid);

Затем загрузите переменные профиля пользователя:

// Load profile
profile_load_profile($user_obj);

Теперь переменная $user_obj (которая передается по ссылке в profile_load_profile) имеет объект с информацией профиля, к которому можно получить доступ следующим образом:

$user_obj->profile_real_name

Надеюсь, поможет!

person JeroenEijkhof    schedule 17.02.2010
comment
Привет, WmasterJ, не совсем уверен, почему вы были проигнорированы за ваш ответ, но я попробую вместе с просмотром ответа googletorp. Большое спасибо - person screenm0nkey; 18.02.2010
comment
Привет, WmasterJ, ваш ответ сработал. Я использовал ваш код для получения переменной и добавил в массив $ vars в phptemplate_preprocess_page. Я все еще новичок в Drupal, поэтому я не совсем уверен, что делаю. Спасибо за вашу помощь - person screenm0nkey; 18.02.2010
comment
Я думаю, что googletorp оценил меня, так как он сказал в своем ответе, что если я сделаю это так, как я предлагаю, глобальный пользователь будет перезаписан. Может быть, вы хотите проверить это, так как это отлично работает для меня, но опять же, я не проверил, что он говорит в своем первом предложении. Здорово, что вам помогло :) - person JeroenEijkhof; 19.02.2010
comment
Я проголосовал против вас, потому что ваш ответ ошибочен и неэффективен. Ваш код привел к ошибке, которую OP не осознал ... Пока. Также я не сказал, что использование вашего метода приведет к перезаписи глобального пользователя. Я объяснил эту традицию, используя $ user и $ account. - person googletorp; 19.02.2010
comment
Не могли бы вы объяснить ошибку? И скажите, как этого избежать, теперь я в замешательстве, и все, кто придет после, не будут знать, что не так, но галочка «Правильный ответ» все равно заставит их взглянуть на мой ответ, - person JeroenEijkhof; 23.02.2010
comment
Я поставил галочку напротив правильного ответа WmasterJ, чтобы другие знали правильный путь, даже если ваш ответ сработал. - person screenm0nkey; 05.03.2010