diff core/modules/views/src/Views.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/views/src/Views.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,533 @@
+<?php
+
+namespace Drupal\views;
+
+/**
+ * Static service container wrapper for views.
+ */
+class Views {
+
+  /**
+   * The translation manager.
+   *
+   * @var \Drupal\Core\StringTranslation\TranslationInterface
+   */
+  protected static $translationManager;
+
+  /**
+   * A static cache for handler types data.
+   *
+   * @var array
+   */
+  protected static $handlerTypes;
+
+  /**
+   * A list of all available views plugin types.
+   *
+   * @var array
+   */
+  protected static $plugins = [
+    'access' => 'plugin',
+    'area' => 'handler',
+    'argument' => 'handler',
+    'argument_default' => 'plugin',
+    'argument_validator' => 'plugin',
+    'cache' => 'plugin',
+    'display_extender' => 'plugin',
+    'display' => 'plugin',
+    'exposed_form' => 'plugin',
+    'field' => 'handler',
+    'filter' => 'handler',
+    'join' => 'plugin',
+    'pager' => 'plugin',
+    'query' => 'plugin',
+    'relationship' => 'handler',
+    'row' => 'plugin',
+    'sort' => 'handler',
+    'style' => 'plugin',
+    'wizard' => 'plugin',
+  ];
+
+  /**
+   * Returns the views data service.
+   *
+   * @return \Drupal\views\ViewsData
+   *   Returns a views data cache object.
+   */
+  public static function viewsData() {
+    return \Drupal::service('views.views_data');
+  }
+
+  /**
+   * Returns the views data helper service.
+   *
+   * @return \Drupal\views\ViewsDataHelper
+   *   Returns a views data helper object.
+   */
+  public static function viewsDataHelper() {
+    return \Drupal::service('views.views_data_helper');
+  }
+
+  /**
+   * Returns the view executable factory service.
+   *
+   * @return \Drupal\views\ViewExecutableFactory
+   *   Returns a views executable factory.
+   */
+  public static function executableFactory() {
+    return \Drupal::service('views.executable');
+  }
+
+  /**
+   * Returns the view analyzer.
+   *
+   * @return \Drupal\views\Analyzer
+   *   Returns a view analyzer object.
+   */
+  public static function analyzer() {
+    return \Drupal::service('views.analyzer');
+  }
+
+  /**
+   * Returns the plugin manager for a certain views plugin type.
+   *
+   * @param string $type
+   *   The plugin type, for example filter.
+   *
+   * @return \Drupal\views\Plugin\ViewsPluginManager
+   */
+  public static function pluginManager($type) {
+    return \Drupal::service('plugin.manager.views.' . $type);
+  }
+
+  /**
+   * Returns the plugin manager for a certain views handler type.
+   *
+   * @return \Drupal\views\Plugin\ViewsHandlerManager
+   */
+  public static function handlerManager($type) {
+    return \Drupal::service('plugin.manager.views.' . $type);
+  }
+
+  /**
+   * Loads a view from configuration and returns its executable object.
+   *
+   * @param string $id
+   *   The view ID to load.
+   *
+   * @return \Drupal\views\ViewExecutable
+   *   A view executable instance, from the loaded entity.
+   */
+  public static function getView($id) {
+    $view = \Drupal::service('entity.manager')->getStorage('view')->load($id);
+    if ($view) {
+      return static::executableFactory()->get($view);
+    }
+  }
+
+  /**
+   * Fetches a list of all base tables available
+   *
+   * @param string $type
+   *   Either 'display', 'style' or 'row'.
+   * @param string $key
+   *   For style plugins, this is an optional type to restrict to. May be
+   *   'normal', 'summary', 'feed' or others based on the needs of the display.
+   * @param array $base
+   *   An array of possible base tables.
+   *
+   * @return
+   *   A keyed array of in the form of 'base_table' => 'Description'.
+   */
+  public static function fetchPluginNames($type, $key = NULL, array $base = []) {
+    $definitions = static::pluginManager($type)->getDefinitions();
+    $plugins = [];
+
+    foreach ($definitions as $id => $plugin) {
+      // Skip plugins that don't conform to our key, if they have one.
+      if ($key && isset($plugin['display_types']) && !in_array($key, $plugin['display_types'])) {
+        continue;
+      }
+
+      if (empty($plugin['no_ui']) && (empty($base) || empty($plugin['base']) || array_intersect($base, $plugin['base']))) {
+        $plugins[$id] = $plugin['title'];
+      }
+    }
+
+    if (!empty($plugins)) {
+      asort($plugins);
+      return $plugins;
+    }
+
+    return $plugins;
+  }
+
+  /**
+   * Gets all the views plugin definitions.
+   *
+   * @return array
+   *   An array of plugin definitions for all types.
+   */
+  public static function getPluginDefinitions() {
+    $plugins = [];
+    foreach (ViewExecutable::getPluginTypes() as $plugin_type) {
+      $plugins[$plugin_type] = static::pluginManager($plugin_type)->getDefinitions();
+    }
+
+    return $plugins;
+  }
+
+  /**
+   * Gets enabled display extenders.
+   */
+  public static function getEnabledDisplayExtenders() {
+    $enabled = array_filter((array) \Drupal::config('views.settings')->get('display_extenders'));
+
+    return array_combine($enabled, $enabled);
+  }
+
+  /**
+   * Return a list of all view IDs and display IDs that have a particular
+   * setting in their display's plugin settings.
+   *
+   * @param string $type
+   *   A flag from the display plugin definitions (e.g, 'uses_menu_links').
+   *
+   * @return array
+   *   A list of arrays containing the $view_id and $display_id.
+   * @code
+   * array(
+   *   array($view_id, $display_id),
+   *   array($view_id, $display_id),
+   * );
+   * @endcode
+   */
+  public static function getApplicableViews($type) {
+    // Get all display plugins which provides the type.
+    $display_plugins = static::pluginManager('display')->getDefinitions();
+
+    $plugin_ids = [];
+    foreach ($display_plugins as $id => $definition) {
+      if (!empty($definition[$type])) {
+        $plugin_ids[$id] = $id;
+      }
+    }
+
+    $entity_ids = \Drupal::entityQuery('view')
+      ->condition('status', TRUE)
+      ->condition("display.*.display_plugin", $plugin_ids, 'IN')
+      ->execute();
+
+    $result = [];
+    foreach (\Drupal::entityTypeManager()->getStorage('view')->loadMultiple($entity_ids) as $view) {
+      // Check each display to see if it meets the criteria and is enabled.
+
+      foreach ($view->get('display') as $id => $display) {
+        // If the key doesn't exist, enabled is assumed.
+        $enabled = !empty($display['display_options']['enabled']) || !array_key_exists('enabled', $display['display_options']);
+
+        if ($enabled && in_array($display['display_plugin'], $plugin_ids)) {
+          $result[] = [$view->id(), $id];
+        }
+      }
+    }
+
+    return $result;
+  }
+
+  /**
+   * Returns an array of all views as fully loaded $view objects.
+   *
+   * @return \Drupal\views\Entity\View[]
+   *   An array of loaded view entities.
+   */
+  public static function getAllViews() {
+    return \Drupal::entityManager()->getStorage('view')->loadMultiple();
+  }
+
+  /**
+   * Returns an array of all enabled views.
+   *
+   * @return \Drupal\views\Entity\View[]
+   *   An array of loaded enabled view entities.
+   */
+  public static function getEnabledViews() {
+    $query = \Drupal::entityQuery('view')
+      ->condition('status', TRUE)
+      ->execute();
+
+    return \Drupal::entityManager()->getStorage('view')->loadMultiple($query);
+  }
+
+  /**
+   * Returns an array of all disabled views.
+   *
+   * @return \Drupal\views\Entity\View[]
+   *   An array of loaded disabled view entities.
+   */
+  public static function getDisabledViews() {
+    $query = \Drupal::entityQuery('view')
+      ->condition('status', FALSE)
+      ->execute();
+
+    return \Drupal::entityManager()->getStorage('view')->loadMultiple($query);
+  }
+
+  /**
+   * Returns an array of view as options array, that can be used by select,
+   * checkboxes and radios as #options.
+   *
+   * @param bool $views_only
+   *   If TRUE, only return views, not displays.
+   * @param string $filter
+   *   Filters the views on status. Can either be 'all' (default), 'enabled' or
+   *   'disabled'
+   * @param mixed $exclude_view
+   *   View or current display to exclude.
+   *   Either a:
+   *   - views object (containing $exclude_view->storage->name and $exclude_view->current_display)
+   *   - views name as string:  e.g. my_view
+   *   - views name and display id (separated by ':'): e.g. my_view:default
+   * @param bool $optgroup
+   *   If TRUE, returns an array with optgroups for each view (will be ignored for
+   *   $views_only = TRUE). Can be used by select
+   * @param bool $sort
+   *   If TRUE, the list of views is sorted ascending.
+   *
+   * @return array
+   *   An associative array for use in select.
+   *   - key: view name and display id separated by ':', or the view name only.
+   */
+  public static function getViewsAsOptions($views_only = FALSE, $filter = 'all', $exclude_view = NULL, $optgroup = FALSE, $sort = FALSE) {
+
+    // Filter the big views array.
+    switch ($filter) {
+      case 'all':
+      case 'disabled':
+      case 'enabled':
+        $filter = ucfirst($filter);
+        $views = call_user_func("static::get{$filter}Views");
+        break;
+      default:
+        return [];
+    }
+
+    // Prepare exclude view strings for comparison.
+    if (empty($exclude_view)) {
+      $exclude_view_name = '';
+      $exclude_view_display = '';
+    }
+    elseif (is_object($exclude_view)) {
+      $exclude_view_name = $exclude_view->storage->id();
+      $exclude_view_display = $exclude_view->current_display;
+    }
+    else {
+      // Append a ':' to the $exclude_view string so we always have more than one
+      // item to explode.
+      list($exclude_view_name, $exclude_view_display) = explode(':', "$exclude_view:");
+    }
+
+    $options = [];
+    foreach ($views as $view) {
+      $id = $view->id();
+      // Return only views.
+      if ($views_only && $id != $exclude_view_name) {
+        $options[$id] = $view->label();
+      }
+      // Return views with display ids.
+      else {
+        foreach ($view->get('display') as $display_id => $display) {
+          if (!($id == $exclude_view_name && $display_id == $exclude_view_display)) {
+            if ($optgroup) {
+              $options[$id][$id . ':' . $display['id']] = t('@view : @display', ['@view' => $id, '@display' => $display['id']]);
+            }
+            else {
+              $options[$id . ':' . $display['id']] = t('View: @view - Display: @display', ['@view' => $id, '@display' => $display['id']]);
+            }
+          }
+        }
+      }
+    }
+    if ($sort) {
+      ksort($options);
+    }
+    return $options;
+  }
+
+  /**
+   * Returns a list of plugins and metadata about them.
+   *
+   * @return array
+   *   An array keyed by PLUGIN_TYPE:PLUGIN_NAME, like 'display:page' or
+   *   'pager:full', containing an array with the following keys:
+   *   - title: The plugin's title.
+   *   - type: The plugin type.
+   *   - module: The module providing the plugin.
+   *   - views: An array of enabled Views that are currently using this plugin,
+   *     keyed by machine name.
+   */
+  public static function pluginList() {
+    $plugin_data = static::getPluginDefinitions();
+    $plugins = [];
+    foreach (static::getEnabledViews() as $view) {
+      foreach ($view->get('display') as $display) {
+        foreach ($plugin_data as $type => $info) {
+          if ($type == 'display' && isset($display['display_plugin'])) {
+            $name = $display['display_plugin'];
+          }
+          elseif (isset($display['display_options']["{$type}_plugin"])) {
+            $name = $display['display_options']["{$type}_plugin"];
+          }
+          elseif (isset($display['display_options'][$type]['type'])) {
+            $name = $display['display_options'][$type]['type'];
+          }
+          else {
+            continue;
+          }
+
+          // Key first by the plugin type, then the name.
+          $key = $type . ':' . $name;
+          // Add info for this plugin.
+          if (!isset($plugins[$key])) {
+            $plugins[$key] = [
+              'type' => $type,
+              'title' => $info[$name]['title'],
+              'provider' => $info[$name]['provider'],
+              'views' => [],
+            ];
+          }
+
+          // Add this view to the list for this plugin.
+          $plugins[$key]['views'][$view->id()] = $view->id();
+        }
+      }
+    }
+    return $plugins;
+  }
+
+  /**
+   * Provide a list of views handler types used in a view, with some information
+   * about them.
+   *
+   * @return array
+   *   An array of associative arrays containing:
+   *   - title: The title of the handler type.
+   *   - ltitle: The lowercase title of the handler type.
+   *   - stitle: A singular title of the handler type.
+   *   - lstitle: A singular lowercase title of the handler type.
+   *   - plural: Plural version of the handler type.
+   *   - (optional) type: The actual internal used handler type. This key is
+   *     just used for header,footer,empty to link to the internal type: area.
+   */
+  public static function getHandlerTypes() {
+    // Statically cache this so translation only occurs once per request for all
+    // of these values.
+    if (!isset(static::$handlerTypes)) {
+      static::$handlerTypes = [
+        'field' => [
+          // title
+          'title' => static::t('Fields'),
+          // Lowercase title for mid-sentence.
+          'ltitle' => static::t('fields'),
+          // Singular title.
+          'stitle' => static::t('Field'),
+          // Singular lowercase title for mid sentence
+          'lstitle' => static::t('field'),
+          'plural' => 'fields',
+        ],
+        'argument' => [
+          'title' => static::t('Contextual filters'),
+          'ltitle' => static::t('contextual filters'),
+          'stitle' => static::t('Contextual filter'),
+          'lstitle' => static::t('contextual filter'),
+          'plural' => 'arguments',
+        ],
+        'sort' => [
+          'title' => static::t('Sort criteria'),
+          'ltitle' => static::t('sort criteria'),
+          'stitle' => static::t('Sort criterion'),
+          'lstitle' => static::t('sort criterion'),
+          'plural' => 'sorts',
+        ],
+        'filter' => [
+          'title' => static::t('Filter criteria'),
+          'ltitle' => static::t('filter criteria'),
+          'stitle' => static::t('Filter criterion'),
+          'lstitle' => static::t('filter criterion'),
+          'plural' => 'filters',
+        ],
+        'relationship' => [
+          'title' => static::t('Relationships'),
+          'ltitle' => static::t('relationships'),
+          'stitle' => static::t('Relationship'),
+          'lstitle' => static::t('Relationship'),
+          'plural' => 'relationships',
+        ],
+        'header' => [
+          'title' => static::t('Header'),
+          'ltitle' => static::t('header'),
+          'stitle' => static::t('Header'),
+          'lstitle' => static::t('Header'),
+          'plural' => 'header',
+          'type' => 'area',
+        ],
+        'footer' => [
+          'title' => static::t('Footer'),
+          'ltitle' => static::t('footer'),
+          'stitle' => static::t('Footer'),
+          'lstitle' => static::t('Footer'),
+          'plural' => 'footer',
+          'type' => 'area',
+        ],
+        'empty' => [
+          'title' => static::t('No results behavior'),
+          'ltitle' => static::t('no results behavior'),
+          'stitle' => static::t('No results behavior'),
+          'lstitle' => static::t('No results behavior'),
+          'plural' => 'empty',
+          'type' => 'area',
+        ],
+      ];
+    }
+
+    return static::$handlerTypes;
+  }
+
+  /**
+   * Returns a list of plugin types.
+   *
+   * @param string $type
+   *   (optional) filter the list of plugins by type. Available options are
+   *   'plugin' or 'handler'.
+   *
+   * @return array
+   *   An array of plugin types.
+   */
+  public static function getPluginTypes($type = NULL) {
+    if ($type === NULL) {
+      return array_keys(static::$plugins);
+    }
+
+    if (!in_array($type, ['plugin', 'handler'])) {
+      throw new \Exception('Invalid plugin type used. Valid types are "plugin" or "handler".');
+    }
+
+    return array_keys(array_filter(static::$plugins, function ($plugin_type) use ($type) {
+      return $plugin_type == $type;
+    }));
+  }
+
+  /**
+   * Translates a string to the current language or to a given language.
+   *
+   * See the t() documentation for details.
+   */
+  protected static function t($string, array $args = [], array $options = []) {
+    if (empty(static::$translationManager)) {
+      static::$translationManager = \Drupal::service('string_translation');
+    }
+
+    return static::$translationManager->translate($string, $args, $options);
+  }
+
+}