diff --git a/core/modules/views/lib/Drupal/views/Views.php b/core/modules/views/lib/Drupal/views/Views.php index 12b76a19066e486c52f900254a01b5aeca2286ef..ba45e1768fd312b0ef769da5eeb469a945d46140 100644 --- a/core/modules/views/lib/Drupal/views/Views.php +++ b/core/modules/views/lib/Drupal/views/Views.php @@ -7,6 +7,9 @@ namespace Drupal\views; +use Drupal\Component\Utility\MapArray; +use Drupal\Component\Utility\String; + /** * Static service container wrapper for views. */ @@ -89,4 +92,281 @@ public static function getView($id) { } } + /** + * 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 = array()) { + $definitions = static::pluginManager($type)->getDefinitions(); + $plugins = array(); + + 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 = array(); + 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 MapArray::copyValuesToKeys($enabled); + } + + /** + * Return a list of all views 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_hook_menu'). + * + * @return array + * A list of arrays containing the $view and $display_id. + * @code + * array( + * array($view, $display_id), + * array($view, $display_id), + * ); + * @endcode + */ + public static function getApplicableViews($type) { + // Get all display plugins which provides the type. + $display_plugins = static::pluginManager('display')->getDefinitions(); + $ids = array(); + foreach ($display_plugins as $id => $definition) { + if (!empty($definition[$type])) { + $ids[$id] = $id; + } + } + + $entity_ids = \Drupal::service('entity.query')->get('view') + ->condition('status', TRUE) + ->condition("display.*.display_plugin", $ids, 'IN') + ->execute(); + + $result = array(); + foreach (\Drupal::entityManager()->getStorageController('view')->loadMultiple($entity_ids) as $view) { + // Check each display to see if it meets the criteria and is enabled. + $executable = $view->getExecutable(); + $executable->initDisplay(); + foreach ($executable->displayHandlers as $id => $handler) { + if (!empty($handler->definition[$type]) && $handler->isEnabled()) { + $result[] = array($executable, $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()->getStorageController('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()->getStorageController('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()->getStorageController('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 array(); + } + + // 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 = array(); + 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', array('@view' => $id, '@display' => $display['id'])); + } + else { + $options[$id . ':' . $display['id']] = t('View: @view - Display: @display', array('@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 = array(); + 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] = array( + 'type' => $type, + 'title' => String::checkPlain($info[$name]['title']), + 'provider' => String::checkPlain($info[$name]['provider']), + 'views' => array(), + ); + } + + // Add this view to the list for this plugin. + $plugins[$key]['views'][$view->id()] = $view->id(); + } + } + } + return $plugins; + } + } diff --git a/core/modules/views/views.module b/core/modules/views/views.module index f8f9ff5e870ad2c8483669900d00aa2328b4d492..edc5ec14cfa65ed8ce5800a53cc81e829a71611c 100644 --- a/core/modules/views/views.module +++ b/core/modules/views/views.module @@ -196,57 +196,6 @@ function views_theme($existing, $type, $theme, $path) { return $hooks; } -/** - * 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. - */ -function views_plugin_list() { - $plugin_data = views_get_plugin_definitions(); - $plugins = array(); - foreach (views_get_enabled_views() 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] = array( - 'type' => $type, - 'title' => check_plain($info[$name]['title']), - 'provider' => check_plain($info[$name]['provider']), - 'views' => array(), - ); - } - - // Add this view to the list for this plugin. - $plugins[$key]['views'][$view->id()] = $view->id(); - } - } - } - return $plugins; -} - /** * A theme preprocess function to automatically allow view-based node * templates if called from a view. @@ -879,28 +828,11 @@ function views_library_info() { * * @return * A keyed array of in the form of 'base_table' => 'Description'. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::fetchPluginNames(). */ function views_fetch_plugin_names($type, $key = NULL, $base = array()) { - $definitions = Views::pluginManager($type)->getDefinitions(); - $plugins = array(); - - 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; + return Views::fetchPluginNames($type, $key, $base); } /** @@ -908,23 +840,38 @@ function views_fetch_plugin_names($type, $key = NULL, $base = array()) { * * @return array * An array of plugin definitions for all types. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getPluginDefinitions(). */ function views_get_plugin_definitions() { - $plugins = array(); - foreach (ViewExecutable::getPluginTypes() as $plugin_type) { - $plugins[$plugin_type] = Views::pluginManager($plugin_type)->getDefinitions(); - } + return Views::getPluginDefinitions(); +} - return $plugins; +/** + * 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. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::pluginList(). + */ +function views_plugin_list() { + return Views::pluginList(); } /** * Get enabled display extenders. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getEnabledDisplayExtenders(). */ function views_get_enabled_display_extenders() { - $enabled = array_filter((array) \Drupal::config('views.settings')->get('display_extenders')); - - return drupal_map_assoc($enabled); + return Views::getEnabledDisplayExtenders(); } /** @@ -942,64 +889,38 @@ function views_get_enabled_display_extenders() { * array($view, $display_id), * ); * @endcode + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getApplicableViews(). */ function views_get_applicable_views($type) { - // Get all display plugins which provides the type. - $display_plugins = Views::pluginManager('display')->getDefinitions(); - $ids = array(); - foreach ($display_plugins as $id => $definition) { - if (!empty($definition[$type])) { - $ids[$id] = $id; - } - } - - $entity_ids = \Drupal::service('entity.query')->get('view') - ->condition('status', TRUE) - ->condition("display.*.display_plugin", $ids, 'IN') - ->execute(); - - $result = array(); - foreach (\Drupal::entityManager()->getStorageController('view')->loadMultiple($entity_ids) as $view) { - // Check each display to see if it meets the criteria and is enabled. - $executable = $view->getExecutable(); - $executable->initDisplay(); - foreach ($executable->displayHandlers as $id => $handler) { - if (!empty($handler->definition[$type]) && $handler->isEnabled()) { - $result[] = array($executable, $id); - } - } - } - - return $result; + return Views::getApplicableViews($type); } /** * Returns an array of all views as fully loaded $view objects. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getAllViews(). */ function views_get_all_views() { - return \Drupal::entityManager()->getStorageController('view')->loadMultiple(); + return Views::getAllViews(); } /** * Returns an array of all enabled views, as fully loaded $view objects. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getEnabledViews(). */ function views_get_enabled_views() { - $query = \Drupal::entityQuery('view') - ->condition('status', TRUE) - ->execute(); - - return entity_load_multiple('view', $query); + return Views::getEnabledViews(); } /** * Returns an array of all disabled views, as fully loaded $view objects. + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getDisabledViews(). */ function views_get_disabled_views() { - $query = \Drupal::entityQuery('view') - ->condition('status', FALSE) - ->execute(); - - return entity_load_multiple('view', $query); + return Views::getDisabledViews(); } /** @@ -1026,61 +947,11 @@ function views_get_disabled_views() { * @return array * an associative array for use in select. * - key: view name and display id separated by ':', or the view name only + * + * @deprecated as of Drupal 8.0. Use \Drupal\views\Views::getViewsAsOptions(). */ function views_get_views_as_options($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': - $func = "views_get_{$filter}_views"; - $views = $func(); - break; - default: - return array(); - } - - // 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 = array(); - 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', array('@view' => $id, '@display' => $display['id'])); - } - else { - $options[$id . ':' . $display['id']] = t('View: @view - Display: @display', array('@view' => $id, '@display' => $display['id'])); - } - } - } - } - } - if ($sort) { - ksort($options); - } - return $options; + return Views::getViewsAsOptions($views_only, $filter, $exclude_view, $optgroup, $sort); } /**