You are here

class GridStackStylizer in GridStack 8.2

Same name in this branch
  1. 8.2 src/GridStackStylizer.php \Drupal\gridstack\GridStackStylizer
  2. 8.2 src/Annotation/GridStackStylizer.php \Drupal\gridstack\Annotation\GridStackStylizer

Implements GridStackStylizerInterface.

Hierarchy

Expanded class hierarchy of GridStackStylizer

1 string reference to 'GridStackStylizer'
gridstack.services.yml in ./gridstack.services.yml
gridstack.services.yml
1 service uses GridStackStylizer
gridstack.stylizer in ./gridstack.services.yml
Drupal\gridstack\GridStackStylizer

File

src/GridStackStylizer.php, line 11

Namespace

Drupal\gridstack
View source
class GridStackStylizer extends GridStackPluginManagerBase implements GridStackStylizerInterface {

  /**
   * {@inheritdoc}
   */
  protected static $path = 'Plugin/gridstack/stylizer';

  /**
   * {@inheritdoc}
   */
  protected static $interface = 'Drupal\\gridstack\\GridStackStylizerPluginInterface';

  /**
   * {@inheritdoc}
   */
  protected static $annotation = 'Drupal\\gridstack\\Annotation\\GridStackStylizer';

  /**
   * {@inheritdoc}
   */
  protected static $key = 'gridstack_stylizer';

  /**
   * The admin regions.
   *
   * @var array
   */
  protected $regions = [];

  /**
   * The loaded stylizer plugin.
   *
   * @var array
   */
  protected $loadStyle;

  /**
   * The style plugin.
   *
   * @var \Drupal\gridstack\Plugin\gridstack\stylizer\Style
   */
  protected $style;

  /**
   * The builder plugin.
   *
   * @var \Drupal\gridstack\Plugin\gridstack\stylizer\Builder
   */
  protected $builder;

  /**
   * The form plugin.
   *
   * @var \Drupal\gridstack\Plugin\gridstack\stylizer\Form
   */
  protected $form;

  /**
   * {@inheritdoc}
   */
  public function style(array $configuration = [], $reload = FALSE) {
    if (!isset($this->style) || $reload) {
      $this->style = $this
        ->loadStyle('style', $configuration, $reload);
    }
    return $this->style;
  }

  /**
   * Sets the style plugin.
   */
  private function setStyle(array $configuration = [], $reload = FALSE) {
    $this->style = $this
      ->loadStyle('style', $configuration, $reload);
    return $this;
  }

  /**
   * Returns a particular style from settings.
   *
   * @todo rename to ::getConfiguredStyle to avoid confusion?
   */
  public function getStyle($key, array $settings) {
    return $this
      ->style()
      ->getStyle($key, $settings);
  }

  /**
   * Returns a particular style from settings.
   */
  public function getConfiguredStyle($key, array $settings) {
    return $this
      ->style()
      ->getStyle($key, $settings);
  }

  /**
   * {@inheritdoc}
   */
  public function builder(array $configuration = [], $reload = FALSE) {
    if (!isset($this->builder) || $reload) {
      $this->builder = $this
        ->loadStyle('builder', $configuration, $reload);
    }
    return $this->builder;
  }

  /**
   * Sets the builder plugin.
   */
  private function setBuilder(array $configuration = [], $reload = FALSE) {
    $this->builder = $this
      ->loadStyle('builder', $configuration, $reload);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function form(array $configuration = [], $reload = FALSE) {
    if (!isset($this->form) || $reload) {
      $this->form = $this
        ->loadStyle('form', $configuration, $reload);
    }
    return $this->form;
  }

  /**
   * Sets the form plugin.
   */
  public function setForm(array $configuration = [], $reload = FALSE) {
    $this->form = $this
      ->loadStyle('form', $configuration, $reload);
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  private function loadStyle($id = 'style', array $configuration = [], $reload = FALSE) {
    if (!isset($this->loadStyle[$id]) || $reload) {
      $this->loadStyle[$id] = $this
        ->load($id, $configuration);
    }
    return $this->loadStyle[$id];
  }

  /**
   * Provides gridstack skins and libraries.
   */
  public function attach(array &$load, array $attach = []) {
    if (!empty($attach['_stylizer'])) {
      $load['library'][] = 'gridstack/stylizer';
      $this
        ->setAttachments($load, $attach);
    }
  }

  /**
   * Prepares the settings, selector and active styles.
   */
  public function prepare(array &$element, array &$attributes, array &$settings, $optionset) {

    // Provides configurable attributes and background media if so configured.
    // Runs before ::containerAttributes to pass the media settings.
    $this
      ->setStyle($settings);
    if ($media = $this
      ->style()
      ->buildMedia($attributes, $settings)) {
      $element['#preface']['media'] = $media;
    }

    // Provides admin utilities.
    if (!empty($settings['_ipe'])) {
      $this
        ->setBuilder($settings);
      $this->regions = $this
        ->builder()
        ->regions($element);
      if ($links = $this
        ->builder()
        ->getVariantEditor($settings, $optionset)) {
        $pos = $this
          ->config('editor_pos') == 'bottom' ? '#bottom' : '#aside';
        $element[$pos]['layout_editor'] = $links;
      }
    }
  }

  /**
   * Modifies item content and attributes.
   */
  public function modifyItem($delta, array &$settings, array &$content, array &$attributes, array &$content_attributes) {
    $rid = isset($settings['rid']) ? $settings['rid'] : -1;
    if (empty($settings['_ipe']) && !empty($settings['contentless'])) {
      $content['box'] = [];
    }

    // Layout Builder only output for granted users.
    if (!empty($settings['_ipe']) && isset($this->regions[$rid])) {
      $this
        ->builder()
        ->adminAttributes($content['box'], $content_attributes, $settings, $this->regions);
    }

    // Provides background media to support contentless, if any.
    if ($media = $this
      ->style()
      ->buildMedia($content_attributes, $settings)) {
      $content['box']['preface'] = $media;
      $content['box']['preface']['#weight'] = -100;
    }
  }

  /**
   * Builds aggregated styles based on the provided settings.
   *
   * This is not saved to public directory due to too small a portion.
   * Not a big deal, as it is always unique to an edited page, not re-usable.
   * Aside it is recommended by lighthouse relevant for the above-fold rules.
   */
  public function rootStyles(array &$element, array $styles, array $settings) {
    if ($rules = $this
      ->style()
      ->parseStyles($styles, TRUE)) {
      $css = implode('', reset($rules));
      $element['#attached']['html_head'][] = [
        [
          '#tag' => 'style',
          '#value' => $css,
          '#weight' => 1,
        ],
        'gridstack-style-' . key($rules),
      ];
      if (!empty($settings['_ipe'])) {
        $element['#attributes'] = isset($element['#attributes']) ? $element['#attributes'] : [];
        $this
          ->builder()
          ->rootAttributes($element['#attributes'], $styles);
      }
    }
  }

  /**
   * Parses the formatted styles per region based on settings.
   */
  public function styles(array &$attributes, array $settings) {
    $styles = $this
      ->style()
      ->getStyles($settings);
    if ($styles && ($data = $this
      ->style()
      ->getSelector($settings, '', $styles))) {

      // Only inline it to DOM element if at LB edit pages.
      if (!empty($settings['_ipe'])) {
        $this
          ->builder()
          ->inlineAttributes($attributes, $data);
      }
      return $data;
    }
    return [];
  }

  /**
   * Provides both CSS grid and js-driven attributes configurable via UI.
   */
  public function attributes(array &$attributes, array $settings) {
    $this
      ->style()
      ->attributes($attributes, $settings);
  }

  /**
   * Returns the module feature CSS classes, not available at CSS frameworks.
   */
  public function getInternalClasses() {
    return $this
      ->style()
      ->getInternalClasses();
  }

  /**
   * Returns classes that can be used for select options.
   */
  public function getMergedClasses($flatten = FALSE, array $framework_classes = []) {
    $cid = $flatten ? 'gridstack_classes_flattened' : 'gridstack_classes_grouped';
    if ($cache = $this->cacheBackend
      ->get($cid)) {
      return $cache->data;
    }
    $output = [];
    if ($classes = $this
      ->mergeFrameworkAndInternalClasses($framework_classes)) {
      $grouped = $ungrouped = [];
      foreach ($classes as $group => $data) {
        $grouped[$group] = $data;
        $items = [];
        foreach ($data as $datum) {
          $items[] = $datum;
        }
        $ungrouped = NestedArray::mergeDeep($ungrouped, $items);
      }

      // Do not use array_unique() here, was processed per group instead.
      $output = $flatten ? $ungrouped : $grouped;
      $this->moduleHandler
        ->alter('gridstack_classes_preset', $output, $grouped, $ungrouped, $flatten);
      ksort($output);
      $count = count($output);
      $tags = Cache::buildTags($cid, [
        'count:' . $count,
      ]);
      $this->cacheBackend
        ->set($cid, $output, Cache::PERMANENT, $tags);
    }
    return $output;
  }

  /**
   * Merges preset classes with the custom defined ones.
   */
  private function mergeFrameworkAndInternalClasses(array $classes = []) {
    $classes = $classes ? NestedArray::mergeDeep($this
      ->getInternalClasses(), $classes) : $this
      ->getInternalClasses();
    if ($fw_classes = $this
      ->config('fw_classes')) {
      $fw_classes = array_map('trim', explode("\n", $fw_classes));
      foreach ($fw_classes as $fw_class) {
        if (strpos($fw_class, '|') !== FALSE) {
          list($group, $group_class) = array_pad(array_map('trim', explode("|", $fw_class, 2)), 2, NULL);
          $group_classes = array_map('trim', explode(" ", $group_class));
          $new_group = [];
          foreach ($group_classes as $group_class) {
            $new_group[] = $group_class;
          }
          $new_group = isset($classes[$group]) ? NestedArray::mergeDeep($classes[$group], $new_group) : $new_group;
          $classes[$group] = array_unique($new_group);
        }
      }
    }
    return $classes;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DefaultPluginManager::$additionalAnnotationNamespaces protected property Additional namespaces the annotation discovery mechanism should scan for annotation definitions.
DefaultPluginManager::$alterHook protected property Name of the alter hook if one should be invoked.
DefaultPluginManager::$cacheKey protected property The cache key.
DefaultPluginManager::$cacheTags protected property An array of cache tags to use for the cached definitions.
DefaultPluginManager::$defaults protected property A set of defaults to be referenced by $this->processDefinition() if additional processing of plugins is necessary or helpful for development purposes. 9
DefaultPluginManager::$moduleHandler protected property The module handler to invoke the alter hook. 1
DefaultPluginManager::$namespaces protected property An object that implements \Traversable which contains the root paths keyed by the corresponding namespace to look for plugin implementations.
DefaultPluginManager::$pluginDefinitionAnnotationName protected property The name of the annotation that contains the plugin definition.
DefaultPluginManager::$pluginInterface protected property The interface each plugin should implement. 1
DefaultPluginManager::$subdir protected property The subdirectory within a namespace to look for plugins, or FALSE if the plugins are in the top level of the namespace.
DefaultPluginManager::alterDefinitions protected function Invokes the hook to alter the definitions if the alter hook is set. 1
DefaultPluginManager::alterInfo protected function Sets the alter hook name.
DefaultPluginManager::clearCachedDefinitions public function Clears static and persistent plugin definition caches. Overrides CachedDiscoveryInterface::clearCachedDefinitions 5
DefaultPluginManager::extractProviderFromDefinition protected function Extracts the provider from a plugin definition.
DefaultPluginManager::findDefinitions protected function Finds plugin definitions. 7
DefaultPluginManager::fixContextAwareDefinitions private function Fix the definitions of context-aware plugins.
DefaultPluginManager::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyInterface::getCacheContexts
DefaultPluginManager::getCachedDefinitions protected function Returns the cached plugin definitions of the decorated discovery class.
DefaultPluginManager::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyInterface::getCacheMaxAge
DefaultPluginManager::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags
DefaultPluginManager::getDefinitions public function Gets the definition of all plugins for this type. Overrides DiscoveryTrait::getDefinitions 2
DefaultPluginManager::getDiscovery protected function Gets the plugin discovery. Overrides PluginManagerBase::getDiscovery 12
DefaultPluginManager::getFactory protected function Gets the plugin factory. Overrides PluginManagerBase::getFactory
DefaultPluginManager::processDefinition public function Performs extra processing on plugin definitions. 13
DefaultPluginManager::providerExists protected function Determines if the provider of a definition exists. 3
DefaultPluginManager::setCacheBackend public function Initialize the cache backend.
DefaultPluginManager::setCachedDefinitions protected function Sets a cache of plugin definitions for the decorated discovery class.
DefaultPluginManager::useCaches public function Disable the use of caches. Overrides CachedDiscoveryInterface::useCaches 1
DiscoveryCachedTrait::$definitions protected property Cached definitions array. 1
DiscoveryCachedTrait::getDefinition public function Overrides DiscoveryTrait::getDefinition 3
DiscoveryTrait::doGetDefinition protected function Gets a specific plugin definition.
DiscoveryTrait::hasDefinition public function
GridStackPluginManagerBase::$attachments protected property The plugin attachments.
GridStackPluginManagerBase::$config protected property The config factory.
GridStackPluginManagerBase::$implementors protected property The implementors of a method.
GridStackPluginManagerBase::config public function Returns gridstack config shortcut.
GridStackPluginManagerBase::getCache public function Returns cache backend service.
GridStackPluginManagerBase::getData protected function Returns gridstack plugin data.
GridStackPluginManagerBase::getDataOptions public function Returns available data for select options.
GridStackPluginManagerBase::getImplementors protected function Returns plugins names implementing a method.
GridStackPluginManagerBase::load public function Returns an instance of a plugin given a plugin id. Overrides GridStackPluginManagerInterface::load
GridStackPluginManagerBase::loadMultiple public function Returns all available plugins.
GridStackPluginManagerBase::setAttachments protected function Collects attachments from plugins.
GridStackPluginManagerBase::__construct public function Creates the discovery object. Overrides DefaultPluginManager::__construct
GridStackStylizer::$annotation protected static property The plugin annotation. Overrides GridStackPluginManagerBase::$annotation
GridStackStylizer::$builder protected property The builder plugin.
GridStackStylizer::$form protected property The form plugin.
GridStackStylizer::$interface protected static property The plugin interface. Overrides GridStackPluginManagerBase::$interface
GridStackStylizer::$key protected static property The plugin key. Overrides GridStackPluginManagerBase::$key
GridStackStylizer::$loadStyle protected property The loaded stylizer plugin.
GridStackStylizer::$path protected static property The plugin path. Overrides GridStackPluginManagerBase::$path
GridStackStylizer::$regions protected property The admin regions.
GridStackStylizer::$style protected property The style plugin.
GridStackStylizer::attach public function Provides gridstack skins and libraries.
GridStackStylizer::attributes public function Provides both CSS grid and js-driven attributes configurable via UI.
GridStackStylizer::builder public function
GridStackStylizer::form public function
GridStackStylizer::getConfiguredStyle public function Returns a particular style from settings.
GridStackStylizer::getInternalClasses public function Returns the module feature CSS classes, not available at CSS frameworks.
GridStackStylizer::getMergedClasses public function Returns classes that can be used for select options. Overrides GridStackStylizerInterface::getMergedClasses
GridStackStylizer::getStyle public function Returns a particular style from settings.
GridStackStylizer::loadStyle private function
GridStackStylizer::mergeFrameworkAndInternalClasses private function Merges preset classes with the custom defined ones.
GridStackStylizer::modifyItem public function Modifies item content and attributes.
GridStackStylizer::prepare public function Prepares the settings, selector and active styles.
GridStackStylizer::rootStyles public function Builds aggregated styles based on the provided settings.
GridStackStylizer::setBuilder private function Sets the builder plugin.
GridStackStylizer::setForm public function Sets the form plugin.
GridStackStylizer::setStyle private function Sets the style plugin.
GridStackStylizer::style public function
GridStackStylizer::styles public function Parses the formatted styles per region based on settings.
PluginManagerBase::$discovery protected property The object that discovers plugins managed by this manager.
PluginManagerBase::$factory protected property The object that instantiates plugins managed by this manager.
PluginManagerBase::$mapper protected property The object that returns the preconfigured plugin instance appropriate for a particular runtime condition.
PluginManagerBase::createInstance public function Creates a pre-configured instance of a plugin. Overrides FactoryInterface::createInstance 12
PluginManagerBase::getInstance public function Gets a preconfigured instance of a plugin. Overrides MapperInterface::getInstance 7
PluginManagerBase::handlePluginNotFound protected function Allows plugin managers to specify custom behavior if a plugin is not found. 1
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UseCacheBackendTrait::$cacheBackend protected property Cache backend instance.
UseCacheBackendTrait::$useCaches protected property Flag whether caches should be used or skipped.
UseCacheBackendTrait::cacheGet protected function Fetches from the cache backend, respecting the use caches flag. 1
UseCacheBackendTrait::cacheSet protected function Stores data in the persistent cache, respecting the use caches flag.