diff core/lib/Drupal/Core/Plugin/ContextAwarePluginAssignmentTrait.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Plugin/ContextAwarePluginAssignmentTrait.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\Core\Plugin;
+
+/**
+ * Handles context assignments for context-aware plugins.
+ */
+trait ContextAwarePluginAssignmentTrait {
+
+  /**
+   * Ensures the t() method is available.
+   *
+   * @see \Drupal\Core\StringTranslation\StringTranslationTrait
+   */
+  abstract protected function t($string, array $args = [], array $options = []);
+
+  /**
+   * Wraps the context handler.
+   *
+   * @return \Drupal\Core\Plugin\Context\ContextHandlerInterface
+   */
+  protected function contextHandler() {
+    return \Drupal::service('context.handler');
+  }
+
+  /**
+   * Builds a form element for assigning a context to a given slot.
+   *
+   * @param \Drupal\Core\Plugin\ContextAwarePluginInterface $plugin
+   *   The context-aware plugin.
+   * @param \Drupal\Component\Plugin\Context\ContextInterface[] $contexts
+   *   An array of contexts.
+   *
+   * @return array
+   *   A form element for assigning context.
+   */
+  protected function addContextAssignmentElement(ContextAwarePluginInterface $plugin, array $contexts) {
+    $element = [];
+    foreach ($plugin->getContextDefinitions() as $context_slot => $definition) {
+      $valid_contexts = $this->contextHandler()->getMatchingContexts($contexts, $definition);
+      $options = [];
+      foreach ($valid_contexts as $context_id => $context) {
+        $element['#tree'] = TRUE;
+        $options[$context_id] = $context->getContextDefinition()->getLabel();
+        $element[$context_slot] = [
+          '#type' => 'value',
+          '#value' => $context_id,
+        ];
+      }
+
+      if (count($options) > 1 || !$definition->isRequired()) {
+        $assignments = $plugin->getContextMapping();
+        $element[$context_slot] = [
+          '#title' => $definition->getLabel() ?: $this->t('Select a @context value:', ['@context' => $context_slot]),
+          '#type' => 'select',
+          '#options' => $options,
+          '#required' => $definition->isRequired(),
+          '#default_value' => !empty($assignments[$context_slot]) ? $assignments[$context_slot] : '',
+          '#description' => $definition->getDescription(),
+        ];
+        if (!$definition->isRequired()) {
+          $element[$context_slot]['#empty_value'] = '';
+        }
+      }
+    }
+    return $element;
+  }
+
+}