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