function views_theme

views_theme($existing, $type, $theme, $path)

Implements hook_theme().

Register views theming functions and those that are defined via views plugin definitions.

File

core/modules/views/views.module, line 84
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';
        }
      }
      // The theme_file definition is always relative to the modules directory.
      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;
}

© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!modules!views!views.module/function/views_theme/8.1.x