Mercurial > hg > cmmr2012-drupal-site
diff themes/contrib/mayo/inc/plugins.inc @ 2:5311817fb629
Theme updates
author | Chris Cannam |
---|---|
date | Tue, 10 Jul 2018 13:19:18 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/themes/contrib/mayo/inc/plugins.inc Tue Jul 10 13:19:18 2018 +0000 @@ -0,0 +1,215 @@ +<?php + +/** + * @file + * MAYO plugin sub-system. + */ + +/** + * Find and return all plugins. + * + * This will search all base themes and the active theme for "plugins" in their + * info files, and return all plugins directories. + * MAYO page layouts uses: + * - "plugins[page_layout][layout] = layouts/core" + * + * @param $theme_name, usually the active theme. + */ +function mayo_get_plugins($theme_name) { + $plugins = &drupal_static(__FUNCTION__, array()); + if (empty($plugins)) { + $plugins_list = array(); + $themes_info = mayo_get_info_trail(\Drupal::theme()->getActiveTheme()->getName()); + // Look for and get all the plugins + if (!empty($themes_info)) { + foreach ($themes_info as $this_theme => $theme_info) { + foreach ($theme_info as $info) { + if (array_key_exists('plugins', $info)) { + foreach ($info['plugins'] as $plugin_type => $types) { + $plugins_list[$this_theme][$plugin_type] = $types; + } + } + } + } + $plugins_list = ($plugins_list); + $plugins = $plugins_list; + } + } + return $plugins; +} + +/** + * Return the paths to all plugin providers plugin directories, this usually + * means themes - both base themes and sub-themes that include plugin directory + * declarations in their info files. + * + * @param $theme_name, ususally the active theme. + */ +function mayo_get_plugins_paths($theme_name) { + $provider_paths = array(); + $plugins_list = mayo_get_plugins($theme_name); + + foreach ($plugins_list as $plugin_provider => $provider) { + foreach ($provider as $plugin_type => $types) { + foreach ($types as $type => $path) { + $provider_path = drupal_get_path('theme', $plugin_provider) . '/' . $path; + $provider_paths[$plugin_provider][$plugin_type][$type] = $provider_path; + } + } + } + + return $provider_paths; +} + +/** + * Returns all files for plugins of a particular type. + * This is called from mayo_load_plugins(), cannot be cached else it will return + * stale data at some point. + * + * @param $theme_name + */ +function mayo_get_plugins_files($theme_name) { + $plugins_files = array(); + $plugins_list = mayo_get_plugins($theme_name); + + $extension = 'inc'; + foreach ($plugins_list as $plugin_provider => $provider) { + foreach ($provider as $plugin_type => $types) { + foreach ($types as $type => $path) { + foreach ($path as $foo => $goo) { + $provider_path = drupal_get_path('theme', $plugin_provider) . '/' . $goo; + $plugins_files[$plugin_provider][$plugin_type][$type] = file_scan_directory($provider_path, '/\.' . $extension . '$/', array('key' => 'name')); + } + } + } + } + + return $plugins_files; +} + +/** + * Extract plugin data structures. + * + * In essence what this does is return the data strutures (arrays) for all + * plugins of a particular type. MAYO only uses the "page_layout" type. + * This is hard to cache because it takes the + * $plugin_type parameter, so everything else that calls this is heavily cached + * instead. It does support an "everything else" plugin type, whatever that is. + * + * @param $theme_name, usually the active theme. + * @param $plugin_type, the plugin type you need to return, usually one of + * "panels" or "page_layout". + */ +function mayo_load_plugins($theme_name, $plugin_type) { + $plugin_data_structures = array(); + $plugins_list = mayo_get_plugins_files($theme_name); + $plugins_array = array(); + foreach ($plugins_list as $plugin_provider => $plugin_types) { + $plugin_providers[] = $plugin_provider; + foreach ($plugin_types as $type => $plugins) { + if ($type === $plugin_type) { + foreach ($plugins as $ptypes => $plugin) { + $plugins_array[$plugin_provider][$type] = $plugin; + } + } + } + } + $plugin_files = array(); + foreach ($plugins_array as $provider => $types) { + foreach ($types as $key => $value) { + $plugin_files = array_merge_recursive($plugin_files, $value); + } + } + + foreach ($plugin_files as $file_data) { + + include_once(\Drupal::root() . '/' . $file_data->uri); + + // page_layout + if ($plugin_type === 'page_layout') { + $identifier = $file_data->name; + $page_layout_function = $identifier; + if (function_exists($page_layout_function)) { + $plugin_data_structures[] = $page_layout_function(); + } + } + } + + if (empty($plugin_data_structures)) { + return; + } + return $plugin_data_structures; +} + +/** + * Return Page layout data structures. + * This returns the full data structures for all page layout plugins. Because + * this can be a lot of data and appears to be computationally expensive to get + * it is cached in the cache table. + * + * @param $theme_name, the active theme. + */ +function page_layouts_data_structure($theme_name = NULL) { + // Use the passed in theme_name, else grab it from the global variable + if ($theme_name == NULL) { + + $theme_name = \Drupal::theme()->getActiveTheme()->getName(); + } + + $page_data_structure = &drupal_static(__FUNCTION__, array()); + if (empty($page_data_structure)) { + $data_structure = mayo_load_plugins($theme_name, $plugin_type = 'page_layout'); + foreach ($data_structure as $plugin => $datum) { + foreach ($datum as $method => $layout) { + $page_data_structure[$method] = $layout; + } + } + } + return $page_data_structure; +} + +/** + * Return option arrays for forms. + * Returns the options for radio lists in the page layout settings in the + * appearance theme settings. + * + * @param $theme_name + */ +function page_layouts_device_group_options($theme_name) { + $device_group_options = &drupal_static(__FUNCTION__, array()); + if (empty($device_group_options)) { + $layout_methods = page_layouts_data_structure($theme_name); + foreach ($layout_methods as $method => $values) { + foreach ($values as $key => $value) { + if ($key == 'device_groups') { + $method_values[$method] = $value; + } + } + } + foreach ($method_values as $this_method => $these_values) { + foreach ($these_values as $k => $dv) { + $device_group_options[$dv][] = $this_method; + } + } + } + + return $device_group_options; +} + +/** + * Base config for page layout builder. + * This is used in mayo_core.submit.responsive.inc to help retrieve the form + * values for each device groups layout. + */ +function assemble_page_layout() { + $variables_array = array( + 'layout', + 'media_query', + 'page_width', + 'page_unit', + 'sidebar_first', + 'sidebar_second', + 'sidebar_unit', + ); + return $variables_array; +}