function ContextAwarePluginAssignmentTrait::addContextAssignmentElement

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Plugin/ContextAwarePluginAssignmentTrait.php \Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait::addContextAssignmentElement()
  2. 8.9.x core/lib/Drupal/Core/Plugin/ContextAwarePluginAssignmentTrait.php \Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait::addContextAssignmentElement()
  3. 10 core/lib/Drupal/Core/Plugin/ContextAwarePluginAssignmentTrait.php \Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait::addContextAssignmentElement()

Builds a form element for assigning a context to a given slot.

Parameters

\Drupal\Core\Plugin\ContextAwarePluginInterface $plugin: The context-aware plugin.

\Drupal\Component\Plugin\Context\ContextInterface[] $contexts: An array of contexts.

Return value

array A form element for assigning context.

3 calls to ContextAwarePluginAssignmentTrait::addContextAssignmentElement()
BlockBase::buildConfigurationForm in core/lib/Drupal/Core/Block/BlockBase.php
Form constructor.
ConditionPluginBase::buildConfigurationForm in core/lib/Drupal/Core/Condition/ConditionPluginBase.php
Form constructor.
LayoutDefault::buildConfigurationForm in core/lib/Drupal/Core/Layout/LayoutDefault.php
Form constructor.

File

core/lib/Drupal/Core/Plugin/ContextAwarePluginAssignmentTrait.php, line 37

Class

ContextAwarePluginAssignmentTrait
Handles context assignments for context-aware plugins.

Namespace

Drupal\Core\Plugin

Code

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,
            ];
        }
        // Show the context selector only if there is more than 1 option to choose
        // from. Also, show if there is a single option but the plugin does not
        // require a context.
        if (count($options) > 1 || 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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.