Расширенные настройки темы

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

В файл 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 например, можно увидеть свою загруженную картинку.

Download: 

Комментарии

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