Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\Plugin;
|
Chris@0
|
4
|
Chris@0
|
5 /**
|
Chris@0
|
6 * Handles context assignments for context-aware plugins.
|
Chris@0
|
7 */
|
Chris@0
|
8 trait ContextAwarePluginAssignmentTrait {
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * Ensures the t() method is available.
|
Chris@0
|
12 *
|
Chris@0
|
13 * @see \Drupal\Core\StringTranslation\StringTranslationTrait
|
Chris@0
|
14 */
|
Chris@0
|
15 abstract protected function t($string, array $args = [], array $options = []);
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Wraps the context handler.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @return \Drupal\Core\Plugin\Context\ContextHandlerInterface
|
Chris@0
|
21 */
|
Chris@0
|
22 protected function contextHandler() {
|
Chris@0
|
23 return \Drupal::service('context.handler');
|
Chris@0
|
24 }
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * Builds a form element for assigning a context to a given slot.
|
Chris@0
|
28 *
|
Chris@0
|
29 * @param \Drupal\Core\Plugin\ContextAwarePluginInterface $plugin
|
Chris@0
|
30 * The context-aware plugin.
|
Chris@0
|
31 * @param \Drupal\Component\Plugin\Context\ContextInterface[] $contexts
|
Chris@0
|
32 * An array of contexts.
|
Chris@0
|
33 *
|
Chris@0
|
34 * @return array
|
Chris@0
|
35 * A form element for assigning context.
|
Chris@0
|
36 */
|
Chris@0
|
37 protected function addContextAssignmentElement(ContextAwarePluginInterface $plugin, array $contexts) {
|
Chris@0
|
38 $element = [];
|
Chris@0
|
39 foreach ($plugin->getContextDefinitions() as $context_slot => $definition) {
|
Chris@0
|
40 $valid_contexts = $this->contextHandler()->getMatchingContexts($contexts, $definition);
|
Chris@0
|
41 $options = [];
|
Chris@0
|
42 foreach ($valid_contexts as $context_id => $context) {
|
Chris@0
|
43 $element['#tree'] = TRUE;
|
Chris@0
|
44 $options[$context_id] = $context->getContextDefinition()->getLabel();
|
Chris@0
|
45 $element[$context_slot] = [
|
Chris@0
|
46 '#type' => 'value',
|
Chris@0
|
47 '#value' => $context_id,
|
Chris@0
|
48 ];
|
Chris@0
|
49 }
|
Chris@0
|
50
|
Chris@0
|
51 if (count($options) > 1 || !$definition->isRequired()) {
|
Chris@0
|
52 $assignments = $plugin->getContextMapping();
|
Chris@0
|
53 $element[$context_slot] = [
|
Chris@0
|
54 '#title' => $definition->getLabel() ?: $this->t('Select a @context value:', ['@context' => $context_slot]),
|
Chris@0
|
55 '#type' => 'select',
|
Chris@0
|
56 '#options' => $options,
|
Chris@0
|
57 '#required' => $definition->isRequired(),
|
Chris@0
|
58 '#default_value' => !empty($assignments[$context_slot]) ? $assignments[$context_slot] : '',
|
Chris@0
|
59 '#description' => $definition->getDescription(),
|
Chris@0
|
60 ];
|
Chris@0
|
61 if (!$definition->isRequired()) {
|
Chris@0
|
62 $element[$context_slot]['#empty_value'] = '';
|
Chris@0
|
63 }
|
Chris@0
|
64 }
|
Chris@0
|
65 }
|
Chris@0
|
66 return $element;
|
Chris@0
|
67 }
|
Chris@0
|
68
|
Chris@0
|
69 }
|