• статья
  • pantey

Вывод поля из профиля пользователя в ноду

26.12.2012

Сейчас я вам продемонстрирую, каким образом возможно вывести поля пользователей в ноду, т.е мы займёмся выводом полей из профиля пользователя. Данный функционал широко распространён в свободных блоговых системах, где у какого-то пользователя написавшем статью, в качестве информации о пользователе размещена еще и дополнительная информация, например «Увлечения», и находится это всё на одной странице, нет необходимости делать лишние клики, для перехода в профиль пользователя. Далее думаю будет более понятно. Приступим, для начала давайте создадим дополнительное поле для пользователей, которое они будут заполнять при регистрации на сайте. Переходим по пути «Конфигурация»-> «Настройка учётной записи»-> «Управление полями»

И добавляем новое поле, например «Ваши увлечения», вот с такими настройками

Далее «Сохранить»-> «Сохранить настройки поля» -> «Сохранить настройки». Все остальные настройки оставим по умолчанию. Теперь переходим в свой профиль и заполним данное поле

И сохраняем. С полем закончили, теперь необходимо вывести это поле в ноду. Давйте этим и займёмся. Я использую для примера стандартный шаблон Bartik, который идёт из коробки Drupal 7. Первое что нам необходимо это подгрузить поля профиля в ноду, поэтому открываем файл

  1. node.tpl.php

Вашего шаблона и перед началом основного кода пишем вот такую конструкцию

  1. $user_node = user_load($node->uid);

Тем самым мы подгрузили поля из профиля в ноду и занесли ее в переменную. Если вы помните то машинное имя нашего поля имело название

  1. filed_hoby

И именно его теперь нам нужно вытащить. Что бы написать запрос воспользуемся свойством

  1. print "<pre>";
  2. print_r ($user_node);
  3. print "</pre>";

и посмотрим к каком массиве находится наше поле

Вот всё теперь у нас отображается , можем смело писать запрос, выглядеть в моём случае он будет вот так

  1. $user_node->field_hoby['und']['0']['safe_value'];

Теперь нам лишь осталось все наши действия соединить и вывести на экран, в результате наш код примет вид

  1. $user_node = user_load($node->uid);
  2. print $user_node->field_hoby['und']['0']['safe_value'];

Что даст нам ноду вот такого вида

На этом всё.

Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (39)

Profile picture for user Николай
Виталёк
17.01.2013

"И именно его теперь нам нужно вытащить. Что бы написать запрос воспользуемся свойством " можно по подробнее, как это сделать?

Profile picture for user pantey
pantey
17.01.2013

необходимо вписать

print "<pre>";
print_r ($user_node);
print "</pre>";

в

node.tpl.php

после чего можно будет писать запрос к объекту.

Profile picture for user Николай
Виталёк
17.01.2013

И что потом надо сделать что бы увидеть картинку как на скриншоте №5, на какую страницу надо зайти?

Profile picture for user pantey
pantey
17.01.2013

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

Profile picture for user Николай
dex
11.07.2013

Статья супер!

А вот вопрос - можно ли так вытягивать не только текст? а например аватарку? или термин словаря?

Profile picture for user pantey
pantey
11.07.2013

да можно!

Profile picture for user Николай
dex
11.07.2013

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

Profile picture for user Николай
dex
11.07.2013

иными словами, у меня есть поле в профиле - автарка.
вот ее код:

[field_avatar] => Array
        (
            [und] => Array
                (
                    [0] => Array
                        (
                            [fid] => 21
                            [alt] => 
                            [title] => 
                            [width] => 700
                            [height] => 700
                            [uid] => 1
                            [filename] => 03_03_2009_0739695001236108283_oprisco.jpg
                            [uri] => public://03_03_2009_0739695001236108283_oprisco.jpg
                            [filemime] => image/jpeg
                            [filesize] => 145564
                            [status] => 1
                            [timestamp] => 1373539510
                            [rdf_mapping] => Array
                                (
                                )

                        )

                )

        )

какое значение выводить, что бы в итоге получилась картинка, а не текстовый путь или название ее?

Profile picture for user pantey
pantey
11.07.2013

вот так попробуйте

<?php echo render($user_node['название_вашего_поля']);?>
Profile picture for user Николай
dex
11.07.2013

=(
Fatal error: Cannot use object of type stdClass as array in Y:\home\wedd-dru\www\sites\all\themes\w\node--user.tpl.php on line 12

Profile picture for user Николай
dex
11.07.2013

на просторах инета я нашел вот это

$output = field_view_field('node', $node, 'field_name');

типа это собирает поле в кучу(из частей), но вот как спарить это с вашим кодом - не доходит....

Profile picture for user pantey
pantey
11.07.2013

тогда сделайте

<?php global $user;?>

и дальше посмотрите что она в себя подгружает, через

<?php print_r();?>

к сожалению, пока посмотреть не могу.

Profile picture for user Николай
dex
11.07.2013

это в теле ноды писать? Спасибо Вам за содейтвие, голова уже кипит!

Profile picture for user pantey
pantey
11.07.2013

да в

node.tpl.php

и по примеру их этого урока посмотрите, что она в себя подгружает. А чем вам путь до картинки не подходит?

Profile picture for user Николай
dex
11.07.2013

"и по примеру их этого урока посмотрите" - это вы про что? а что в итоге мне даст подгрузка

??? не совсем понимаю=))
Почему не подходит адрес - потому что у меня кроме картинки куча полей типа термин словаря, которые тоже выводят номер словаря а не его обозначение. А вообще это долгая история у меня, бьюсь уже наверно неделю над реализацией, все началось с того, что мне нужно было сделать пользователей с классификацей как на фрилансе, по профессиям, ну и соответственно с профилями, в итоге долгих манипуляций, я дошел до этого плана - я рулсами создаю правило при регистрации пользователя, создается нода(это будет профиль), и в него(по вашему примеру) я хочу интегрировать поля пользователя, что бы получился полноценный профиль, тип нода, с которым можно делать все что угодно. А вот со стандарным профилем зареганого пользователя, я даже комменты в профиль не могу вставить. грустная история. и хз как делать.

Profile picture for user Николай
dex
11.07.2013

да и адрес кривой

Profile picture for user ftomivec
ftomivec
05.12.2013

тут тоже верно

Profile picture for user ftomivec
ftomivec
05.12.2013

этот код у меня сработал

Profile picture for user pantey
pantey
11.07.2013

как вариант на скорую руку я бы использовал вот такую конструкцию

<?php 
$user_node = user_load($node->uid);
print "<img src='sites/default/files/"  .$user_node ->имя_вашего_поля['und']['0']['filename'] ."'>";
?>
Profile picture for user Николай
dex
11.07.2013

Спасибо за содействие!!! Вы хороший человек

Profile picture for user Николай
dex
11.07.2013

ответ найден!

uid);
print (render(field_view_field('user', $user, 'field_cat')));
?>
Profile picture for user Николай
ftomivec
14.11.2013

Подскажите как вывести поле в шаблон page.tpl.php в не зависимости где находится юзер в ноде или на главнойстранице, в любом случаем необходимо выводить поле юзера

Profile picture for user pantey
pantey
15.11.2013

комментарием выше, как раз этот код и написан!

<?php
$user = user_load($node->uid);
print (render(field_view_field('user', $user, 'field_cat')));
?>
Profile picture for user ftomivec
ftomivec
15.11.2013

Не получается, выводит ошибку:
Notice: Undefined variable: node в функции include() (строка 7 в файле sites/all/themes/bartik/templates/page.tpl.php).
Notice: Trying to get property of non-object в функции include() (строка 7 в файле sites/all/themes/bartik/templates/page.tpl.php).
Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! в функции DrupalDefaultEntityController->load() (строка 178 в файле /includes/entity.inc).

p.s. удалите пожалуйста похожий коммент выше

Profile picture for user pantey
pantey
15.11.2013

давайте код который в page.tpl.php пишите.

Profile picture for user ftomivec
ftomivec
15.11.2013

Ну так вот этот код и пишу:

uid);
print (render(field_view_field('user', $user, 'field_cat')));
?>

Повторюсь нужно вывести поле field_k_bonus на любой странице сайте, в не зависимости от того находится юзер в ноде или создал данную ноду, просто вывести его поле на сайте.

Profile picture for user pantey
pantey
15.11.2013

а название поля на свое изменили? т.е. в вашем варианте это выглядит так

<?php
$user = user_load($node->uid);
print (render(field_view_field('user', $user, 'field_k_bonus')));
?>
Profile picture for user ftomivec
ftomivec
15.11.2013

Да, менял поле на свое (field_k_bonus)
Ошибки:

  • Notice: Undefined variable: node в функции include() (строка 7 в файле /sites/all/themes/bartik/templates/page.tpl.php).
  • Notice: Trying to get property of non-object в функции include() (строка 7 в файле /sites/all/themes/bartik/templates/page.tpl.php).
  • Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! в функции DrupalDefaultEntityController->load() (строка 178 в файле /includes/entity.inc).
Profile picture for user pantey
pantey
15.11.2013

тогда так

<?php
	$user_node = user_load($user->uid);
	print $user_node->имя_вашего_поля["und"]["0"]["value"];
?>
Profile picture for user ftomivec
ftomivec
15.11.2013

Спасибо, это код работает, но выдает ошибку если у пользователя не заполнено это поле, не подскажите как решить?

  • Notice: Undefined index: und в функции include() (строка 6 в файле /sites/all/themes/bartik/templates/page.tpl.php).
Profile picture for user pantey
pantey
15.11.2013

ну я не знаю, что у вас на 6 строчке написано в page.tpl.php

Profile picture for user ftomivec
ftomivec
15.11.2013

:)

uid); 
print $user_node->field_bonus['und']['0']['value']; 
?>
Profile picture for user ftomivec
ftomivec
15.11.2013

Решил таким способом:

if (isset($user_node->field_bonus['und']['0']['value'])) print $user_node->field_bonus['und']['0']['value'];
Profile picture for user Николай
Макс
30.01.2015

Полезная статья. Как вывести юзер-поле в ноду разобрался. На сколько возможно вытянуть поле в форму добавления метериала? Например, в профиле пользователя имеется поле телефон(текст, целое число). Пользователь может создать объявление (тип ноды с полем телефон). Логично прдоствить юзеру значение поля по умолчанию - его номер из профиля, в то же время он может его переписать. Пробовал передовать методом GET, но это работает только если пользователь переходит на форму из профиля.

Profile picture for user pantey
pantey
30.01.2015

через

hook_form_alter

забираете значения из $user и переопределяете форму как вам необходимо, что-то вроде этого

function module_form_alter(&$form, $form_state, $form_id){
if($form_id == 'id_вашей_формы'){
global $user;
// и дальше ваши действия
}
}
Profile picture for user Николай
Виталий
24.02.2015

Здравствуйте! Прекрасно описано, большое спасибо. Могли бы Вы подсказать как на выведенное поле повесить ссылку на автора (как при выводе $name)?

Profile picture for user pantey
pantey
24.02.2015
<?php
$link_user = l(t('ваше поле'), 'user/' .$node->uid);
Profile picture for user Николай
Виталий
25.02.2015

Павел, просто громаднейшее спасибо!!!
Пытался найти это по "drupal 7 ссылка на автора материала", "передать url автора в ноду" и т.д. Еще раз большое спасибо!

Profile picture for user Николай
Виктория
13.05.2015

Подскажите, пожалуйста, возможно ли сделать все тоже самое, только наоборот...тоесть записать данные из ноды в профиль пользователя.

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

Подскажите как правильно сделать первую часть вопроса?