跳转到主要内容
东方龙马 提交于 30 September 2016

原文链接: Creating advanced theme settings  译者:Fishfree

每个主题在Drupal的管理后台都有自己的设置页,路径是admin/appearance/settings/THEMENAME。设置页上一般都有表单,带有诸如Logo图像和Favicon图标等标准的设置。

在Drupal 8里,通过在“THEMENAME.theme” 文件或在“theme-settings.php”文件里添加THEMENAME_form_system_theme_settings_alter(&$form, $form_state)钩子函数,可更改主题设置表单。详细用法可参考“Drupal 8的Form API”、“表单和渲染表单元素”一览表、hook_form_FORM_ID_alter() 等文档。

举个例子:有个“foo”主题,要在它里面添加一个单行文本字段,其默认值是“blue bikeshed”。则可在foo/foo.theme文件或foo/theme-settings.php文件里添加如下代码:

function foo_form_system_theme_settings_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id = NULL) {
  // 一个变通方法,为了解决核心的一个影响到管理主体的bug,详见 issue #943212.
  if (isset($form_id)) {
    return;
  }

  $form['foo_example'] = array(
    '#type'          => 'textfield',
    '#title'         => t('Widget'),
    '#default_value' => theme_get_setting('foo_example'),
    '#description'   => t("Place this text in the widget spot on your site."),
  );
}

为了给添加的表单元素设置默认值,需要创建一个文件config/install/THEME.settings.yml文件,只需要在里面添加一行:SETTING_NAME: DEFAULT_VALUE。对于例子中的foo主题,需要编辑foo/config/install/foo.settings.yml文件并添加这行:

foo_example: blue bikeshed

在主题里的任意PHP文件里,都可以像这样取到用户设置的值:

$foo_example = theme_get_setting('foo_example');

注意:主题作者可以使用高级Form API来创建复杂、动态化的表单(如:自动完成、可折叠的fieldset)。

在主题文件中获取设置值

在THEMENAME.theme文件里添加preprocess函数可在Twig文件中添加新变量。

$variables['varname'] = theme_get_setting('varname')

例如:欲在node.html.twig文件里添加foo_example设置,先要在foo.theme文件里添加:

<?php
function foo_preprocess_node(&$variables) {
$variables['foo_example'] = theme_get_setting('foo_example');
}

然后在node.html.twig文件里就可以像访问任何普通的Twig变量一样来访问foo_example:

{{ foo_example }}