Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 9 |
CRAP | |
0.00% |
0 / 100 |
| BreakpointManager | |
0.00% |
0 / 1 |
|
0.00% |
0 / 9 |
870 | |
0.00% |
0 / 100 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 7 |
|||
| getDiscovery | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
| processDefinition | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 9 |
|||
| providerExists | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 2 |
|||
| getBreakpointsByGroup | |
0.00% |
0 / 1 |
56 | |
0.00% |
0 / 25 |
|||
| getGroups | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 19 |
|||
| getGroupProviders | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 17 |
|||
| clearCachedDefinitions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getGroupLabel | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 11 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\breakpoint\BreakpointManager. | |
| */ | |
| namespace Drupal\breakpoint; | |
| use Drupal\Core\Cache\Cache; | |
| use Drupal\Core\Cache\CacheBackendInterface; | |
| use Drupal\Core\Extension\ModuleHandlerInterface; | |
| use Drupal\Core\Extension\ThemeHandlerInterface; | |
| use Drupal\Core\Plugin\DefaultPluginManager; | |
| use Drupal\Core\Plugin\Discovery\ContainerDerivativeDiscoveryDecorator; | |
| use Drupal\Core\Plugin\Discovery\YamlDiscovery; | |
| use Drupal\Core\Plugin\Factory\ContainerFactory; | |
| use Drupal\Core\StringTranslation\StringTranslationTrait; | |
| use Drupal\Core\StringTranslation\TranslationInterface; | |
| /** | |
| * Defines a breakpoint plugin manager to deal with breakpoints. | |
| * | |
| * Extension can define breakpoints in a EXTENSION_NAME.breakpoints.yml file | |
| * contained in the extension's base directory. Each breakpoint has the | |
| * following structure: | |
| * @code | |
| * MACHINE_NAME: | |
| * label: STRING | |
| * mediaQuery: STRING | |
| * weight: INTEGER | |
| * multipliers: | |
| * - STRING | |
| * @endcode | |
| * For example: | |
| * @code | |
| * bartik.mobile: | |
| * label: mobile | |
| * mediaQuery: '(min-width: 0px)' | |
| * weight: 0 | |
| * multipliers: | |
| * - 1x | |
| * - 2x | |
| * @endcode | |
| * Optionally a breakpoint can provide a group key. By default an extensions | |
| * breakpoints will be placed in a group labelled with the extension name. | |
| * | |
| * @see \Drupal\breakpoint\Breakpoint | |
| * @see \Drupal\breakpoint\BreakpointInterface | |
| * @see plugin_api | |
| */ | |
| class BreakpointManager extends DefaultPluginManager implements BreakpointManagerInterface { | |
| use StringTranslationTrait; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected $defaults = array( | |
| // Human readable label for breakpoint. | |
| 'label' => '', | |
| // The media query for the breakpoint. | |
| 'mediaQuery' => '', | |
| // Weight used for ordering breakpoints. | |
| 'weight' => 0, | |
| // Breakpoint multipliers. | |
| 'multipliers' => array(), | |
| // The breakpoint group. | |
| 'group' => '', | |
| // Default class for breakpoint implementations. | |
| 'class' => 'Drupal\breakpoint\Breakpoint', | |
| // The plugin id. Set by the plugin system based on the top-level YAML key. | |
| 'id' => '', | |
| ); | |
| /** | |
| * The theme handler. | |
| * | |
| * @var \Drupal\Core\Extension\ThemeHandlerInterface | |
| */ | |
| protected $themeHandler; | |
| /** | |
| * Static cache of breakpoints keyed by group. | |
| * | |
| * @var array | |
| */ | |
| protected $breakpointsByGroup; | |
| /** | |
| * The plugin instances. | |
| * | |
| * @var array | |
| */ | |
| protected $instances = array(); | |
| /** | |
| * Constructs a new BreakpointManager instance. | |
| * | |
| * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler | |
| * The module handler. | |
| * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler | |
| * The theme handler. | |
| * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend | |
| * The cache backend. | |
| * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation | |
| * The string translation service. | |
| */ | |
| public function __construct(ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, CacheBackendInterface $cache_backend, TranslationInterface $string_translation) { | |
| $this->factory = new ContainerFactory($this); | |
| $this->moduleHandler = $module_handler; | |
| $this->themeHandler = $theme_handler; | |
| $this->setStringTranslation($string_translation); | |
| $this->alterInfo('breakpoints'); | |
| $this->setCacheBackend($cache_backend, 'breakpoints', array('breakpoints')); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function getDiscovery() { | |
| if (!isset($this->discovery)) { | |
| $this->discovery = new YamlDiscovery('breakpoints', $this->moduleHandler->getModuleDirectories() + $this->themeHandler->getThemeDirectories()); | |
| $this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery); | |
| } | |
| return $this->discovery; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function processDefinition(&$definition, $plugin_id) { | |
| parent::processDefinition($definition, $plugin_id); | |
| // Allow custom groups and therefore more than one group per extension. | |
| if (empty($definition['group'])) { | |
| $definition['group'] = $definition['provider']; | |
| } | |
| // Ensure a 1x multiplier exists. | |
| if (!in_array('1x', $definition['multipliers'])) { | |
| $definition['multipliers'][] = '1x'; | |
| } | |
| // Ensure that multipliers are sorted correctly. | |
| sort($definition['multipliers']); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function providerExists($provider) { | |
| return $this->moduleHandler->moduleExists($provider) || $this->themeHandler->themeExists($provider); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getBreakpointsByGroup($group) { | |
| if (!isset($this->breakpointsByGroup[$group])) { | |
| if ($cache = $this->cacheBackend->get($this->cacheKey . ':' . $group)) { | |
| $this->breakpointsByGroup[$group] = $cache->data; | |
| } | |
| else { | |
| $breakpoints = array(); | |
| foreach ($this->getDefinitions() as $plugin_id => $plugin_definition) { | |
| if ($plugin_definition['group'] == $group) { | |
| $breakpoints[$plugin_id] = $plugin_definition; | |
| } | |
| } | |
| uasort($breakpoints, array('Drupal\Component\Utility\SortArray', 'sortByWeightElement')); | |
| $this->cacheBackend->set($this->cacheKey . ':' . $group, $breakpoints, Cache::PERMANENT, array('breakpoints')); | |
| $this->breakpointsByGroup[$group] = $breakpoints; | |
| } | |
| } | |
| $instances = array(); | |
| foreach ($this->breakpointsByGroup[$group] as $plugin_id => $definition) { | |
| if (!isset($this->instances[$plugin_id])) { | |
| $this->instances[$plugin_id] = $this->createInstance($plugin_id); | |
| } | |
| $instances[$plugin_id] = $this->instances[$plugin_id]; | |
| } | |
| return $instances; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getGroups() { | |
| // Use a double colon so as to not clash with the cache for each group. | |
| if ($cache = $this->cacheBackend->get($this->cacheKey . '::groups')) { | |
| $groups = $cache->data; | |
| } | |
| else { | |
| $groups = array(); | |
| foreach ($this->getDefinitions() as $plugin_definition) { | |
| if (!isset($groups[$plugin_definition['group']])) { | |
| $groups[$plugin_definition['group']] = $plugin_definition['group']; | |
| } | |
| } | |
| $this->cacheBackend->set($this->cacheKey . '::groups', $groups, Cache::PERMANENT, array('breakpoints')); | |
| } | |
| // Get the labels. This is not cacheable due to translation. | |
| $group_labels = array(); | |
| foreach ($groups as $group) { | |
| $group_labels[$group] = $this->getGroupLabel($group); | |
| } | |
| asort($group_labels); | |
| return $group_labels; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getGroupProviders($group) { | |
| $providers = array(); | |
| $breakpoints = $this->getBreakpointsByGroup($group); | |
| foreach ($breakpoints as $breakpoint) { | |
| $provider = $breakpoint->getProvider(); | |
| $extension = FALSE; | |
| if ($this->moduleHandler->moduleExists($provider)) { | |
| $extension = $this->moduleHandler->getModule($provider); | |
| } | |
| elseif ($this->themeHandler->themeExists($provider)) { | |
| $extension = $this->themeHandler->getTheme($provider); | |
| } | |
| if ($extension) { | |
| $providers[$extension->getName()] = $extension->getType(); | |
| } | |
| } | |
| return $providers; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function clearCachedDefinitions() { | |
| parent::clearCachedDefinitions(); | |
| $this->breakpointsByGroup = NULL; | |
| $this->instances = array(); | |
| } | |
| /** | |
| * Gets the label for a breakpoint group. | |
| * | |
| * @param string $group | |
| * The breakpoint group. | |
| * | |
| * @return string | |
| * The label. | |
| */ | |
| protected function getGroupLabel($group) { | |
| // Extension names are not translatable. | |
| if ($this->moduleHandler->moduleExists($group)) { | |
| $label = $this->moduleHandler->getName($group); | |
| } | |
| elseif ($this->themeHandler->themeExists($group)) { | |
| $label = $this->themeHandler->getName($group); | |
| } | |
| else { | |
| // Custom group label that should be translatable. | |
| $label = $this->t($group, array(), array('context' => 'breakpoint')); | |
| } | |
| return $label; | |
| } | |
| } |