Profile picture for Admin

Иногда бывает нужно расширить функционал настроек темы: табы, картинки и тд. Не помню точно где я это нашел, но это выручает.

В файл theme-settings.php нужно записать alter на форму настроек темы:

function test_theme_form_system_theme_settings_alter(&$form, &$form_state) {
  $path_theme = drupal_get_path('theme', 'test_theme');

  $form['global-settings'] = array(
    '#type' => 'vertical_tabs',
    '#description' => t('Layout'),
    '#weight' => -10,
  );
 
  unset($form['theme_settings']);
  unset($form['logo']);
  unset($form['favicon']);
 

  require_once($path_theme . '/inc/settings.themevariables.inc');

  $form['#submit'][] = 'test_theme_settings_form_submit';

  // Get all themes.
  $themes = list_themes();
  // Get the current theme
  $active_theme = $GLOBALS['theme_key'];
  $form_state['build_info']['files'][] = str_replace("/$active_theme.info", '', $themes[$active_theme]->filename) . '/theme-settings.php';
  return $form;
}

 

С помощью FAPI создаем вертикальные вкладки $form['global-settings'].

Убираем ненужные настройки

  unset($form['theme_settings']);
  unset($form['logo']);
  unset($form['favicon']);

Подключаем наш файл с массивом настроек. Можно и здесь все массивы описать, но это только создаст мусор.

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

 

В файле inc/settings.themevariables.inc у нас следующая инфа:

$form['global-settings']['theme-images'] = array(
  '#type' => 'fieldset',
  '#title' => 'Images',
  '#description' => '<h3>Theme images</h3>',
);

$themsevar_fields = array();
$themsevar_fields['text-theme-image'] = array(
  '#type' => 'managed_file',
  '#title' => t('Image'),
  '#required' => false,
  '#upload_location' => file_default_scheme() . '://images',
  '#default_value' => theme_get_setting('text-theme-image', 'test_theme'),
  '#upload_validators' => array(
    'file_validate_extensions' => array('gif png jpg jpeg'),
   ),
);

$form['global-settings']['theme-images'][] = _test_theme_form_settings_generate_i18($themsevar_fields);

 

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

function _test_theme_form_settings_generate_i18($fields){
  $lang_list = language_list();
  $form = array();
 
  foreach ($fields as $elem => $opt){
    $form[$elem] = array(
      '#type' => 'fieldset',
      '#title' => $opt['#title'],
      '#collapsible' => TRUE,
    );

    foreach ($lang_list as $pref => $lang){
      if (!empty($lang->enabled)) {
        if (!in_array($opt['#type'], array('managed_file'))) {
          $def_val = theme_get_setting($elem . '-' . $lang->language);
          $form[$elem][$elem . '-' . $lang->language] = array(
            '#type' => $opt['#type'],
          );
          
          if (is_array($def_val) && $opt['#type'] == 'text_format') $form[$elem][$elem . '-' . $lang->language]['#default_value'] = $def_val['value'];
            else $form[$elem][$elem . '-' . $lang->language]['#default_value'] = $def_val;
          if (isset($opt['#format'])) $form[$elem][$elem . '-' . $lang->language]['#format'] = $opt['#format'];
          if (isset($opt['#wysiwyg'])) $form[$elem][$elem . '-' . $lang->language]['#title'] = $opt['#wysiwyg'];
          
          $form[$elem][$elem . '-' . $lang->language]['#title'] = $lang->name;
        }
        else {
          $form[$elem] = $opt;
        }
      }
    }
  }
  return $form;
}

Главное, что функция создает мультиязычные поля. И вам не нужно делать это для каждого элемента. Только изображения пропускаются.

Для обратного алгоритма – получения переенной из базы используется функция из файла template.php

/**
* Get theme setting
*/
function _tt($param){
  global $language;
 
  $val = theme_get_setting($param . '-' . $language->language, 'test_theme');
 
  if (is_array($val))
    return $val['value'];
  else return $val;
}

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

function test_theme_settings_form_submit(&$form, &$form_state) {
  $image_fid = $form_state['values']['text-theme-image'];
  $image = file_load($image_fid);
  if (is_object($image)) {
    // Check to make sure that the file is set to be permanent.
    if ($image->status == 0) {
      // Update the status.
      $image->status = FILE_STATUS_PERMANENT;
      // Save the update.
      file_save($image);
      // Add a reference to prevent warnings.
      file_usage_add($image, 'test_theme', 'theme', 1);
    }
  }
}

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

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

Для отображения картинок можно написать кастомную функцию в файле template.php:

function _test_theme_custom_image() {
  $image_fid = theme_get_setting('text-theme-image');
  $image_style = '';

  if (!empty($image_fid)){
    $image = file_load($image_fid);
    if (is_object($image)) {
      
      $image_style = theme('image_style', array(
        'style_name' => 'frontpage_slider',
        'path'       => $image->uri,
        'attributes' => array(
          'class' => array('big-image')
          )
      ));

    }
  }


  $output = '<div id="my-custom-image">' . $image_style . '</div>';

  return $output;
}

Теперь, вызывая функцию _test_theme_custom_image(), в page.tpl.php например, можно увидеть свою загруженную картинку.

test_theme.tar.gz (1.78 КБ)

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

Содержимое данного поля является приватным и не предназначено для показа.
 dP   dP   dP  dP     dP   88888888b  888888P  dP     dP 
88 88 88 88 88 88 88' 88 .d8'
88 .8P .8P 88 .8P a88aaaa 88baaa. 88aaa8P'
88 d8' d8' 88 d8' 88 `88 88 `8b.
88.d8P8.d8P 88 .d8P 88 88 88 88
8888' Y88' 888888' 88888888P d88888P dP dP

Введите код, изображенный в стиле ASCII-арт.