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@17
|
51 // Show the context selector only if there is more than 1 option to choose
|
Chris@17
|
52 // from. Also, show if there is a single option but the plugin does not
|
Chris@17
|
53 // require a context.
|
Chris@17
|
54 if (count($options) > 1 || (count($options) == 1 && !$definition->isRequired())) {
|
Chris@0
|
55 $assignments = $plugin->getContextMapping();
|
Chris@0
|
56 $element[$context_slot] = [
|
Chris@0
|
57 '#title' => $definition->getLabel() ?: $this->t('Select a @context value:', ['@context' => $context_slot]),
|
Chris@0
|
58 '#type' => 'select',
|
Chris@0
|
59 '#options' => $options,
|
Chris@0
|
60 '#required' => $definition->isRequired(),
|
Chris@0
|
61 '#default_value' => !empty($assignments[$context_slot]) ? $assignments[$context_slot] : '',
|
Chris@0
|
62 '#description' => $definition->getDescription(),
|
Chris@0
|
63 ];
|
Chris@0
|
64 if (!$definition->isRequired()) {
|
Chris@0
|
65 $element[$context_slot]['#empty_value'] = '';
|
Chris@0
|
66 }
|
Chris@0
|
67 }
|
Chris@0
|
68 }
|
Chris@0
|
69 return $element;
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 }
|