• урок
  • pantey

Выводим аватар пользователя на страницу с применением стиля изображения.

17.10.2013

Как вы понимаете, сегодня будем решать довольно тривиальную задачу, которая в последнее время становится все более актуальной, а именно будем выводить аватар пользователя (поле из профиля пользователя) на страницу сайта (шаблон page.tpl.php). По умолчанию, drupal предоставляет при регистрации загружать аватар и выбрать для него «стиль изображения», но на этом все его настройки и заканчиваются, а что делать если нам необходимо в профиле пользователя показать допустим изображение с размерами 200px на 200px, а на странице сайта допустим 30px на 30px? Естественно есть ряд решений:

  • Воспользоваться средствами CSS – решение имеет место быть, но зачем нагружать сайт загрузкой изображения с размерами 200px на 200px, да еще и к тому же, что великий и могучий IE в любой его версии очень криво сжимает изображение до указанных значений.
  • Воспользовать модулем views – как бы я не любил этот модуль, но и у него есть свой недостаток на мой взгляд. Да он может изменить выводимое изображение самостоятельно и пропустить его через любой стиль изображения, но под него, как правило, необходимо вывести дополнительный регион в шаблоне, хотя на самом деле это и не такое плохое решение, особенно если просто воспользоваться сниппетом для вывода:
  1. <?php views_embed_view();?>

то можно обойтись и без региона, но данное средство не является универсальным, хотя бы потому, что вдруг вы решите выложить свой шаблон на drupal.org – то всё ваше решение с views сойдёт на нет.

Всё хватит рассуждений, теперь расскажу какое решение я использую в своих проектах для решения этой задачи. Сначала определимся с исходными данными, у нас загружен аватар и пропускается по умолчанию через указанный стиль изображения (medium). В моём случае это выглядит вот так:

Так же у меня уже загружен аватар,

И есть стиль изображения, который мы будем использовать при выводе аватара пользователя на страницу:

Как вы можете заметить, название нашего стиля – ava_user_page.

С исходными данными определились, теперь займёмся выводом. В качестве подопытного шаблона я использую стандартный шаблон Bartik. Открываем файл

  1. page.tpl.php

И используем следующий код, в том месте где вам необходимо вывести аватар, я его выведу в шапке сайта:

  1. <?php
  2. theme('user_picture', array('account' => $user));
  3. $filepath = $user->picture->uri;
  4. $user_picture = theme('image_style', array('style_name' => 'ava_user_page', 'path' => $filepath, 'alt' => 'аватар пользователя ' .$user->name, 'title' => 'пользователь ' .$user->name)); //не забудьте поменять на свой стиль изображения
  5. print '<div class="user-picture">' .$user_picture .'</div>';
  6. ?>

В результате чего мы получим вот такую картину:

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

  1. <?php if($logged_in == TRUE){
  2. theme('user_picture', array('account' => $user));
  3. $filepath = $user->picture->uri;
  4. $user_picture = theme('image_style', array('style_name' => 'ava_user_page', 'path' => $filepath, 'alt' => 'аватар пользователя ' .$user->name, 'title' => 'пользователь ' .$user->name));
  5. print '<div class="user-picture">' .$user_picture .'</div>';
  6. };?>

В результате для зарегистрированного пользователя у нас будет выводится его аватар, а для анонимного ничего. Теперь возникает другая проблема, ели аватар для зарегистрированного пользователя не загружен, то появится ошибка, давайте теперь и ее исправим. Для каждого загруженного изображения есть свой числовой id, соответственно если id нет (т.е возвращает FALSE), это значит и изображения нет, допишем и эту проверку

  1. <?php if($logged_in == TRUE){
  2. if (!empty($user->picture)){
  3. theme('user_picture', array('account' => $user));
  4. $filepath = $user->picture->uri;
  5. $user_picture = theme('image_style', array('style_name' => 'ava_user_page', 'path' => $filepath, 'alt' => 'аватар пользователя ' .$user->name, 'title' => 'пользователь ' .$user->name));
  6. print '<div class="user-picture">' .$user_picture .'</div>';
  7. }
  8.  
  9. };?>

В результате такого небольшого сниппета, мы получили именно ту функциональность, которая была нам необходимо. Теперь для зарегистрированного пользователя который загрузил аватар у нас будет выводится его аватар на страницу с пропуском через указанный стиль изображения, а для пользователей которые зарегистрированы и не загрузили свой аватар, а так же для анонимных пользователей мы показывать ничего не будем. На этом думаю всё.

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

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

Profile picture for user 1541
Женя
30.09.2014

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

Profile picture for user pantey
pantey
30.09.2014

Это зависит от того, в каком файле вы собираетесь это делать. В comment.tpl.php ? То для комментариев и так можно без снипетов пропускать изображение через стиль, через админку сайта.

Profile picture for user 1541
Женя
30.09.2014

Да в comment.tpl.php, но и не только(также в нодах, для вывода аватара автора), на данный момент для этого использую модуль ImageCache Profiles

З.Ы. а где можно задать через админку?

Profile picture for user 1541
Mist
01.04.2015

А какую роль выполняет код:

theme('user_picture', array('account' => $user));

?

Profile picture for user pantey
pantey
01.04.2015

пропускает аватар пользователя, через указанный image style, но здесь он действительно лишний.

Profile picture for user 1541
Mist
01.04.2015

Павел, этот код нужный. Без него не работает. Без него в свойстве $user->picture будет только id картинки, а нужный путь до картинки будет отсутствовать. Сейчас проверил опытным путём.

Profile picture for user pantey
pantey
01.04.2015

точно, дальше не посмотрел код

Profile picture for user 1541
AncicCam
19.06.2017

Благодарю