Изменяем размер аватар в нодах и комментариях

ср, 04.04.2012 13:57 :: olk

Иногда бывает необходимо что бы при выводе материалов и комментариев размер (а возможно и вид) автарки отличался от размеров заданных в профиле пользователя. Одно из решений — использовать модуль image с его пресетами. Добавляем (или редактируем если он уже есть) файл theme-settings.php в каталоге вашей темы.

Если данный файл есть и в нем есть функция  function Ваша_тема_form_system_theme_settings_alter(&$form, $form_state) , то нижеприведенный код добавляем в данную функцию, иначе добавляем саму функцию.

  1. /**
  2.  * @file
  3.  *  theme-settings.php
  4.  */
  5.  
  6. function Ваша_тема_form_system_theme_settings_alter(&$form, $form_state){
  7.   if(module_exists('image')) {
  8.   $options = image_style_options();
  9.   $form['node_avatar_style'] = array(
  10.     '#type' => 'select',
  11.     '#title' => t('Node avatar style'),
  12.     '#default_value' => theme_get_setting('node_avatar_style'),
  13.     '#options' => $options,
  14.   );
  15.   $form['comment_avatar_style'] = array(
  16.     '#type' => 'select',
  17.     '#title' => t('Comment avatar style'),
  18.     '#default_value' => theme_get_setting('comment_avatar_style'),
  19.     '#options' => $options,
  20.   );
  21.  
  22.   }
  23.   return $form;
  24. }
Естественно Ваша_тема заменяем на наименование используемой темы

Далее идем в настройки темы (admin/appearance/settings/Ваша_тема) И выбираем нужный пресет для нод и комментариев (предварительно можно создать нужные пресеты используя всю мощь модуля image (также советую дополнительно установить модуль imagecache_actions), хоть он и дев версии, но некоторые эффекты уже работают).

Следующий этап задействовать данные пресеты для вывода аватары в материалах и/или комментариях.

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

  1. function Ваша_тема_preprocess_node(&$vars) {
  2.  $style = theme_get_setting('node_avatar_style');
  3.  $node = $vars['elements']['#node'];
  4.  $attributes = array();
  5.  $uri = (is_object($node->picture) && $node->picture)? $node->picture->uri : variable_get('user_picture_default', '');
  6.  if (module_exists('image') && $uri) {
  7.    $picture = theme_get_setting('toggle_node_user_picture') ? theme('image_style', array('style_name'=>$style,'path'=>$uri)) : '';
  8.    if ($picture) {
  9.      if(user_access('access user profiles') && !empty($node->uid)) {
  10.       $attributes = array(
  11.           'attributes' => array('title' => t('View user profile.')),
  12.           'html' => TRUE,
  13.         );
  14.       $vars['picture'] = l($picture,"user/$node->uid",$attributes);
  15.      }
  16.      else {
  17.       $vars['picture'] = $picture;
  18.      }
  19.    }
  20.  }
  21. }
  22.  
  23. function Ваша_тема_preprocess_comment(&$vars) {
  24.  $style = theme_get_setting('comment_avatar_style');
  25.  $comment = $vars['elements']['#comment'];
  26.  $attributes = array();
  27.  $uri = (is_object($comment->picture) && $comment->picture)?$comment->picture->uri : variable_get('user_picture_default', '');
  28.  if (module_exists('image')  && $uri) {
  29.    $picture = theme_get_setting('toggle_comment_user_picture') ? theme('image_style', array('style_name'=>$style,'path'=>$uri)) : '';
  30.    if ($picture) {
  31.      if(user_access('access user profiles') && !empty($comment->uid)) {
  32.       $attributes = array(
  33.           'attributes' => array('title' => t('View user profile.')),
  34.           'html' => TRUE,
  35.         );
  36.       $vars['picture'] = l($picture,"user/$comment->uid",$attributes);
  37.      }
  38.      else {
  39.       $vars['picture'] = $picture;
  40.      }
  41.    }
  42.  }
  43. }

Вот и все, сбрасываем кэш и смотрим результат.

Если функции с данными именами существуют, то надо в них добавить код из тела функции, обращая внимание на то, как называется параметр функции $vars в вашей функции.

Дополнение: Если вы используете аватарку по умолчанию в настройках профиля пользователя, то указывайте путь как drupal uri, а не как path. Т.е. например: Общедоступный путь файловой системы: sites/default/files Метод загрузки по умолчанию: Открытый — передачей файлов управляет веб-сервер Вы закачали аватар по умолчанию в директорию sites/default/files/anonim.png то в настройках профиля в качестве пути к аватару по умолчанию нужно указать public://anonim.png В таком случае будут корректно использоваться все установленные пресеты, как в профиле пользователя так и в нодах и комментариях.

Комментарии

Насколько я понял это решение аналогичное решению которое предлагает модуль imagecache_profiles

Фактически да. Просто тут вопрос — на каком уровне абстракции реализовывать поддержку данного функционала. На уровне модуля или на уровне темизации (конкретной темы). Мне кажется, что размер (читай внешний вид) аватары все же ближе к уровню внешнего оформления (т.е. темизации), но наверное имеют право на жизнь оба решения.

The best blog commenting experts are difficult to be saw. You are a lucky one when you determine great forum posting service!

Добавить комментарий
« Добавить комментарий
» Добавить комментарий