原文链接: 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 }}