function views_theme in Zircon Profile 8
Same name and namespace in other branches
- 8.0 core/modules/views/views.module \views_theme()
Implements hook_theme().
Register views theming functions and those that are defined via views plugin definitions.
File
- core/
modules/ views/ views.module, line 88 - Primarily Drupal hooks and global API functions to manipulate views.
Code
function views_theme($existing, $type, $theme, $path) {
\Drupal::moduleHandler()
->loadInclude('views', 'inc', 'views.theme');
// Some quasi clever array merging here.
$base = array(
'file' => 'views.theme.inc',
);
// Our extra version of pager from pager.inc
$hooks['views_mini_pager'] = $base + array(
'variables' => array(
'tags' => array(),
'quantity' => 9,
'element' => 0,
'parameters' => array(),
),
);
$variables = array(
// For displays, we pass in a dummy array as the first parameter, since
// $view is an object but the core contextual_preprocess() function only
// attaches contextual links when the primary theme argument is an array.
'display' => array(
'view_array' => array(),
'view' => NULL,
'rows' => array(),
'header' => array(),
'footer' => array(),
'empty' => array(),
'exposed' => array(),
'more' => array(),
'feed_icons' => array(),
'pager' => array(),
'title' => '',
'attachment_before' => array(),
'attachment_after' => array(),
),
'style' => array(
'view' => NULL,
'options' => NULL,
'rows' => NULL,
'title' => NULL,
),
'row' => array(
'view' => NULL,
'options' => NULL,
'row' => NULL,
'field_alias' => NULL,
),
'exposed_form' => array(
'view' => NULL,
'options' => NULL,
),
'pager' => array(
'view' => NULL,
'options' => NULL,
'tags' => array(),
'quantity' => 9,
'element' => 0,
'parameters' => array(),
),
);
// Default view themes
$hooks['views_view_field'] = $base + array(
'variables' => array(
'view' => NULL,
'field' => NULL,
'row' => NULL,
),
);
$hooks['views_view_grouping'] = $base + array(
'variables' => array(
'view' => NULL,
'grouping' => NULL,
'grouping_level' => NULL,
'rows' => NULL,
'title' => NULL,
),
);
// Only display, pager, row, and style plugins can provide theme hooks.
$plugin_types = [
'display',
'pager',
'row',
'style',
'exposed_form',
];
$plugins = array();
foreach ($plugin_types as $plugin_type) {
$plugins[$plugin_type] = Views::pluginManager($plugin_type)
->getDefinitions();
}
$module_handler = \Drupal::moduleHandler();
// Register theme functions for all style plugins. It provides a basic auto
// implementation of theme functions or template files by using the plugin
// definitions (theme, theme_file, module, register_theme). Template files are
// assumed to be located in the templates folder.
foreach ($plugins as $type => $info) {
foreach ($info as $def) {
// Not all plugins have theme functions, and they can also explicitly
// prevent a theme function from being registered automatically.
if (!isset($def['theme']) || empty($def['register_theme'])) {
continue;
}
// For each theme registration, we have a base directory to check for the
// templates folder. This will be relative to the root of the given module
// folder, so we always need a module definition.
// @todo: watchdog or exception?
if (!isset($def['provider']) || !$module_handler
->moduleExists($def['provider'])) {
continue;
}
$hooks[$def['theme']] = array(
'variables' => $variables[$type],
);
// We always use the module directory as base dir.
$module_dir = drupal_get_path('module', $def['provider']);
$hooks[$def['theme']]['path'] = $module_dir;
// For the views module we ensure views.theme.inc is included.
if ($def['provider'] == 'views') {
if (!isset($hooks[$def['theme']]['includes'])) {
$hooks[$def['theme']]['includes'] = array();
}
if (!in_array('views.theme.inc', $hooks[$def['theme']]['includes'])) {
$hooks[$def['theme']]['includes'][] = $module_dir . '/views.theme.inc';
}
}
elseif (!empty($def['theme_file'])) {
$hooks[$def['theme']]['file'] = $def['theme_file'];
}
// Whenever we have a theme file, we include it directly so we can
// auto-detect the theme function.
if (isset($def['theme_file'])) {
$include = \Drupal::root() . '/' . $module_dir . '/' . $def['theme_file'];
if (is_file($include)) {
require_once $include;
}
}
// If there is no theme function for the given theme definition, it must
// be a template file. By default this file is located in the /templates
// directory of the module's folder. If a module wants to define its own
// location it has to set register_theme of the plugin to FALSE and
// implement hook_theme() by itself.
if (!function_exists('theme_' . $def['theme'])) {
$hooks[$def['theme']]['path'] .= '/templates';
$hooks[$def['theme']]['template'] = Html::cleanCssIdentifier($def['theme']);
}
else {
$hooks[$def['theme']]['function'] = 'theme_' . $def['theme'];
}
}
}
$hooks['views_form_views_form'] = $base + array(
'render element' => 'form',
);
$hooks['views_exposed_form'] = $base + array(
'render element' => 'form',
);
return $hooks;
}