You are here

class BootstrapLayoutsBase in Bootstrap Layouts 8.5

Same name and namespace in other branches
  1. 8.4 src/Plugin/Layout/BootstrapLayoutsBase.php \Drupal\bootstrap_layouts\Plugin\Layout\BootstrapLayoutsBase

Layout class for all bootstrap layouts.

Hierarchy

Expanded class hierarchy of BootstrapLayoutsBase

1 file declares its use of BootstrapLayoutsBase
BootstrapLayoutsManager.php in src/BootstrapLayoutsManager.php
1 string reference to 'BootstrapLayoutsBase'
bootstrap_layouts.layouts.yml in ./bootstrap_layouts.layouts.yml
bootstrap_layouts.layouts.yml

File

src/Plugin/Layout/BootstrapLayoutsBase.php, line 16

Namespace

Drupal\bootstrap_layouts\Plugin\Layout
View source
class BootstrapLayoutsBase extends LayoutDefault implements PluginFormInterface {

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
  }

  /**
   * Provides a default region definition.
   *
   * @return array
   *   Default region array.
   */
  protected function getRegionDefaults() {
    return [
      'wrapper' => 'div',
      'classes' => [],
      'attributes' => '',
      'add_region_classes' => TRUE,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    $configuration = parent::defaultConfiguration();
    $configuration += [
      'layout' => [
        'wrapper' => 'div',
        'classes' => [
          'row',
        ],
        'attributes' => '',
        'add_layout_class' => TRUE,
      ],
      'regions' => [],
    ];
    foreach ($this
      ->getPluginDefinition()
      ->getRegions() as $region => $info) {
      $region_configuration = [];
      foreach ([
        'wrapper',
        'classes',
        'attributes',
      ] as $key) {
        if (isset($info[$key])) {
          $region_configuration[$key] = $info[$key];
        }
      }
      $configuration['regions'][$region] = $region_configuration + $this
        ->getRegionDefaults();
    }
    return $configuration;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {

    // This can potentially be invoked within a subform instead of a normal
    // form. There is an ongoing discussion around this which could result in
    // the passed form state going back to a full form state. In order to
    // prevent BC breaks, check which type of FormStateInterface has been
    // passed and act accordingly.
    // @see https://www.drupal.org/node/2868254
    // @todo Re-evaluate once https://www.drupal.org/node/2798261 makes it in.
    $complete_form_state = $form_state instanceof SubformStateInterface ? $form_state
      ->getCompleteFormState() : $form_state;
    $configuration = $this
      ->getConfiguration();

    /** @var \Drupal\bootstrap_layouts\BootstrapLayoutsManager $manager */
    $manager = \Drupal::getContainer()
      ->get('plugin.manager.bootstrap_layouts');
    $classes = $manager
      ->getClassOptions();
    $tokens = FALSE;
    if (\Drupal::moduleHandler()
      ->moduleExists('token')) {
      $tokens = [
        '#title' => $this
          ->t('Tokens'),
        '#type' => 'container',
      ];
      $tokens['help'] = [
        '#theme' => 'token_tree_link',
        '#token_types' => 'all',
        '#global_types' => FALSE,
        '#dialog' => TRUE,
      ];
    }

    // Add wrappers.
    $wrapper_options = [
      'div' => 'Div',
      'span' => 'Span',
      'section' => 'Section',
      'article' => 'Article',
      'header' => 'Header',
      'footer' => 'Footer',
      'aside' => 'Aside',
      'figure' => 'Figure',
    ];
    $form['layout'] = [
      '#type' => 'container',
      '#tree' => TRUE,
    ];
    $form['layout']['wrapper'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Wrapper'),
      '#options' => $wrapper_options,
      '#default_value' => $complete_form_state
        ->getValue([
        'layout',
        'wrapper',
      ], $configuration['layout']['wrapper']),
    ];
    $form['layout']['classes'] = [
      '#type' => 'select',
      '#title' => $this
        ->t('Classes'),
      '#options' => $classes,
      '#default_value' => $complete_form_state
        ->getValue([
        'layout',
        'classes',
      ], $configuration['layout']['classes']) ?: [],
      '#multiple' => TRUE,
    ];
    $form['layout']['add_layout_class'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Add layout specific class: <code>@class</code>', [
        '@class' => Html::cleanCssIdentifier($this
          ->getPluginId()),
      ]),
      '#default_value' => (int) $complete_form_state
        ->getValue([
        'layout',
        'add_layout_class',
      ], $configuration['layout']['add_layout_class']),
    ];
    $form['layout']['attributes'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Additional attributes'),
      '#description' => 'E.g. id|custom-id,role|navigation,data-something|some value',
      '#default_value' => $complete_form_state
        ->getValue([
        'layout',
        'attributes',
      ], $configuration['layout']['attributes']),
    ];
    if ($tokens) {
      $form['layout']['tokens'] = $tokens;
    }

    // Add each region's settings.
    foreach ($this
      ->getPluginDefinition()
      ->getRegions() as $region => $region_info) {
      $region_label = $region_info['label'];
      $default_values = NestedArray::mergeDeep($this
        ->getRegionDefaults(), isset($configuration['regions'][$region]) ? $configuration['regions'][$region] : [], $complete_form_state
        ->getValue([
        'regions',
        $region,
      ], []));
      $form[$region] = [
        '#group' => 'additional_settings',
        '#type' => 'details',
        '#open' => TRUE,
        '#title' => $this
          ->t('Region: @region', [
          '@region' => $region_label,
        ]),
        '#weight' => 20,
      ];
      $form[$region]['wrapper'] = [
        '#type' => 'select',
        '#title' => $this
          ->t('Wrapper'),
        '#options' => $wrapper_options,
        '#default_value' => $default_values['wrapper'],
      ];
      $form[$region]['classes'] = [
        '#type' => 'select',
        '#title' => $this
          ->t('Classes'),
        '#options' => $classes,
        '#default_value' => $default_values['classes'],
        '#multiple' => TRUE,
      ];
      $form[$region]['add_region_classes'] = [
        '#type' => 'checkbox',
        '#title' => $this
          ->t('Add region specific classes: <code>bs-region</code> and <code>bs-region--@region</code>', [
          '@region' => $region,
        ]),
        '#default_value' => (int) $default_values['add_region_classes'],
      ];
      $form[$region]['attributes'] = [
        '#type' => 'textfield',
        '#title' => $this
          ->t('Additional attributes'),
        '#description' => 'E.g. id|custom-id,role|navigation,data-something|some value',
        '#default_value' => $default_values['attributes'],
      ];
      if ($tokens) {
        $form[$region]['tokens'] = $tokens;
      }
    }
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function setConfiguration(array $configuration) {

    // Don't use NestedArray::mergeDeep here since this will merge both the
    // default classes and the classes stored in config.
    $default = $this
      ->defaultConfiguration();

    // Ensure top level properties exist.
    $configuration += $default;

    // Ensure specific top level sub-properties exists.
    $configuration['layout'] += $default['layout'];
    $configuration['regions'] += $default['regions'];

    // Remove any region configuration that doesn't apply to current layout.
    $regions = $this
      ->getPluginDefinition()
      ->getRegions();
    foreach (array_keys($configuration['regions']) as $region) {
      if (!isset($regions[$region])) {
        unset($configuration['regions'][$region]);
      }
    }
    $this->configuration = $configuration;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $defaults = $this
      ->getRegionDefaults();
    if ($layout = $form_state
      ->getValue('layout', $defaults)) {

      // Apply Xss::filter to attributes.
      $layout['attributes'] = Xss::filter($layout['attributes']);
      $this->configuration['layout'] = $layout;
    }
    $regions = [];
    foreach ($this
      ->getPluginDefinition()
      ->getRegionNames() as $name) {
      if ($region = $form_state
        ->getValue($name, $defaults)) {

        // Apply Xss::filter to attributes.
        $region['attributes'] = Xss::filter($region['attributes']);
        $regions[$name] = $region;
      }
    }
    $this->configuration['regions'] = $regions;
  }

  /**
   * {@inheritdoc}
   */
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BootstrapLayoutsBase::buildConfigurationForm public function Form constructor. Overrides LayoutDefault::buildConfigurationForm
BootstrapLayoutsBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides LayoutDefault::defaultConfiguration
BootstrapLayoutsBase::getRegionDefaults protected function Provides a default region definition.
BootstrapLayoutsBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides LayoutDefault::setConfiguration
BootstrapLayoutsBase::submitConfigurationForm public function Form submission handler. Overrides LayoutDefault::submitConfigurationForm
BootstrapLayoutsBase::validateConfigurationForm public function Form validation handler. Overrides LayoutDefault::validateConfigurationForm
BootstrapLayoutsBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides LayoutDefault::__construct
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
LayoutDefault::$pluginDefinition protected property The layout definition. Overrides PluginBase::$pluginDefinition
LayoutDefault::build public function Build a render array for layout with regions. Overrides LayoutInterface::build 3
LayoutDefault::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies 2
LayoutDefault::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
LayoutDefault::getPluginDefinition public function Overrides PluginBase::getPluginDefinition
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
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.