class BlockFieldWidget in Block field 8
Plugin implementation of the 'block_field' widget.
Plugin annotation
@FieldWidget(
id = "block_field_default",
label = @Translation("Block field"),
field_types = {
"block_field"
}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
- class \Drupal\Core\Field\WidgetBase implements WidgetInterface, ContainerFactoryPluginInterface uses AllowedTagsXssTrait
- class \Drupal\block_field\Plugin\Field\FieldWidget\BlockFieldWidget implements ContainerFactoryPluginInterface
- class \Drupal\Core\Field\WidgetBase implements WidgetInterface, ContainerFactoryPluginInterface uses AllowedTagsXssTrait
- class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of BlockFieldWidget
File
- src/
Plugin/ Field/ FieldWidget/ BlockFieldWidget.php, line 30
Namespace
Drupal\block_field\Plugin\Field\FieldWidgetView source
class BlockFieldWidget extends WidgetBase implements ContainerFactoryPluginInterface {
/**
* The Drupal context repository.
*
* @var \Drupal\context\Entity\ContextRepositoryInterface
*/
protected $contextRepository;
/**
* The block manager.
*
* @var \Drupal\Core\Block\BlockManagerInterface
*/
protected $blockManager;
/**
* The block field selection manager.
*
* @var \Drupal\block_field\BlockFieldSelectionManager
*/
protected $blockFieldSelectionManager;
/**
* {@inheritdoc}
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, BlockManagerInterface $block_manager, BlockFieldSelectionManager $block_field_selection_manager, ContextRepositoryInterface $contextRepository) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
$this->blockManager = $block_manager;
$this->blockFieldSelectionManager = $block_field_selection_manager;
$this->contextRepository = $contextRepository;
$this->blockManager = $block_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['third_party_settings'], $container
->get('plugin.manager.block'), $container
->get('plugin.manager.block_field_selection'), $container
->get('context.repository'));
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'plugin_id' => '',
'settings' => [],
'configuration_form' => 'full',
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$elements['configuration_form'] = [
'#type' => 'select',
'#title' => $this
->t('Configuration form'),
'#description' => $this
->t('How the block configuration form will be shown.'),
'#options' => [
'full' => $this
->t('Full'),
'hidden' => $this
->t('Hidden'),
],
'#default_value' => $this
->getSetting('configuration_form'),
'#required' => TRUE,
];
return $elements;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary[] = $this
->t('Configuration form: @configuration_form', [
'@configuration_form' => $this
->getSetting('configuration_form'),
]);
return $summary;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
/** @var \Drupal\block_field\BlockFieldItemInterface $item */
$item =& $items[$delta];
$field_name = $this->fieldDefinition
->getName();
$settings_id = implode('-', array_merge($element['#field_parents'], [
$field_name,
$delta,
'settings',
]));
$values = $form_state
->getValues();
$item->plugin_id = isset($values[$field_name][$delta]['plugin_id']) ? $values[$field_name][$delta]['plugin_id'] : $item->plugin_id;
if (!empty($values[$field_name][$delta]['settings'])) {
$item->settings = $values[$field_name][$delta]['settings'];
}
else {
$item->settings = $item->settings ?: [];
}
$options = $this->blockFieldSelectionManager
->getWidgetOptions($this->fieldDefinition);
if ($item->plugin_id) {
// If plugin_id not in second level arrays, unset plugin_id and settings..
if (!in_array($item->plugin_id, array_keys(call_user_func_array('array_merge', array_values($options))), TRUE)) {
$item->plugin_id = '';
$item->setting = [];
}
}
$element['plugin_id'] = [
'#type' => 'select',
'#title' => $this
->t('Block'),
'#options' => $options,
'#empty_option' => $this
->t('- None -'),
'#default_value' => $item->plugin_id,
'#required' => $element['#required'],
];
// Show configuration form if required.
if ($this
->getSetting('configuration_form') === 'full') {
$element['plugin_id']['#ajax'] = [
'callback' => [
$this,
'configurationForm',
],
'wrapper' => $settings_id,
];
// Build configuration container.
$element['settings'] = [
'#type' => 'container',
'#attributes' => [
'id' => $settings_id,
],
'#tree' => TRUE,
];
// If block plugin exists get the block's configuration form.
if ($block_instance = $item
->getBlock()) {
$form_state
->setTemporaryValue('gathered_contexts', $this->contextRepository
->getAvailableContexts());
$element['settings'] += $block_instance
->buildConfigurationForm([], $form_state);
// Hide admin label (aka description).
if (isset($element['settings']['admin_label'])) {
$element['settings']['admin_label']['#access'] = FALSE;
}
$element['#element_validate'] = [
[
$this,
'validate',
],
];
}
}
return $element;
}
/**
* {@inheritdoc}
*/
protected function formSingleElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formSingleElement($items, $delta, $element, $form, $form_state);
// For single element set the plugin id title and description to use the
// field's title and description.
$element['plugin_id']['#title'] = $element['#title'];
$element['plugin_id']['#title_display'] = $element['#title_display'];
$element['plugin_id']['#description'] = $element['#description'];
return $element;
}
/**
* Ajax callback that return block configuration setting form.
*/
public function configurationForm(array $form, FormStateInterface $form_state) {
$trigger_element = $form_state
->getTriggeringElement();
$array_parents = $trigger_element['#array_parents'];
$array_parents[count($array_parents) - 1] = 'settings';
$settings_element = NestedArray::getValue($form, $array_parents);
// Set the label #value to the default block instance's label.
$plugin_id = $trigger_element['#value'];
/** @var \Drupal\Core\Block\BlockPluginInterface $block_instance */
if ($block_instance = $this->blockManager
->createInstance($plugin_id)) {
$settings_element['label']['#value'] = $block_instance
->label();
}
return $settings_element;
}
/**
* Form element validation handler.
*/
public static function validate($element, FormStateInterface $form_state, $form) {
/** @var \Drupal\Core\Block\BlockManagerInterface $block_manager */
$block_manager = \Drupal::service('plugin.manager.block');
$values = $form_state
->getValues();
$plugin_id = NestedArray::getValue($values, $element['plugin_id']['#parents']);
if (!empty($plugin_id) && $block_manager
->hasDefinition($plugin_id)) {
// Clean up configuration settings.
$settings = NestedArray::getValue($values, $element['settings']['#parents']);
// Convert label display to FALSE instead of 0. This allow the label to be
// hidden.
if ($settings['label_display'] === 0) {
$settings['label_display'] = FALSE;
}
// Execute block validate configuration.
$block_instance = $block_manager
->createInstance($plugin_id, $settings);
$settings = (new FormState())
->setValues($settings);
$block_instance
->validateConfigurationForm($element['settings'], $settings);
// Pass along errors from the block validation.
foreach ($settings
->getErrors() as $key => $error) {
$parents = implode('][', $element['settings']['#parents']);
// If the block form used setError() then the parents will already be
// part of the key since we are passing along the element in the context
// of the whole form. If the block form used setErrorByName we need to
// add the parents in.
if (strpos($key, $parents) === FALSE) {
$key = sprintf('%s][%s', $parents, $key);
}
$form_state
->setErrorByName($key, $error);
}
NestedArray::setValue($values, $element['settings']['#parents'], $settings
->getValues());
$form_state
->setValues($values);
}
else {
// Clear all configuration settings.
NestedArray::setValue($values, $element['settings']['#parents'], []);
}
}
/**
* {@inheritdoc}
*/
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
$field_name = $this->fieldDefinition
->getName();
// Some blocks clean the processed values in form state. However, entity
// forms extract the form values twice during submission. For the second
// submission to work as well, we need to prevent the removal of the form
// values during the first submission.
$form_state = clone $form_state;
foreach ($values as &$value) {
// Execute block submit configuration in order to transform the form
// values into block configuration.
if (!empty($value['plugin_id']) && !empty($value['settings']) && ($block = $this->blockManager
->createInstance($value['plugin_id']))) {
$elements =& $form[$field_name]['widget'][$value['_original_delta']]['settings'];
$subform_state = SubformState::createForSubform($elements, $form_state
->getCompleteForm(), $form_state);
$block
->submitConfigurationForm($elements, $subform_state);
// If this block is context-aware, set the context mapping.
if ($block instanceof ContextAwarePluginInterface && $block
->getContextDefinitions()) {
$context_mapping = $subform_state
->getValue('context_mapping', []);
$block
->setContextMapping($context_mapping);
}
$value['settings'] = $block
->getConfiguration();
}
}
return $values;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AllowedTagsXssTrait:: |
public | function | Returns a list of tags allowed by AllowedTagsXssTrait::fieldFilterXss(). | |
AllowedTagsXssTrait:: |
public | function | Returns a human-readable list of allowed tags for display in help texts. | |
AllowedTagsXssTrait:: |
public | function | Filters an HTML string to prevent XSS vulnerabilities. | |
BlockFieldWidget:: |
protected | property | The block field selection manager. | |
BlockFieldWidget:: |
protected | property | The block manager. | |
BlockFieldWidget:: |
protected | property | The Drupal context repository. | |
BlockFieldWidget:: |
public | function | Ajax callback that return block configuration setting form. | |
BlockFieldWidget:: |
public static | function |
Creates an instance of the plugin. Overrides WidgetBase:: |
|
BlockFieldWidget:: |
public static | function |
Defines the default settings for this plugin. Overrides PluginSettingsBase:: |
|
BlockFieldWidget:: |
public | function |
Returns the form for a single field widget. Overrides WidgetInterface:: |
|
BlockFieldWidget:: |
protected | function |
Generates the form element for a single copy of the widget. Overrides WidgetBase:: |
|
BlockFieldWidget:: |
public | function |
Massages the form values into the format expected for field values. Overrides WidgetBase:: |
|
BlockFieldWidget:: |
public | function |
Returns a form to configure settings for the widget. Overrides WidgetBase:: |
|
BlockFieldWidget:: |
public | function |
Returns a short summary for the current widget settings. Overrides WidgetBase:: |
|
BlockFieldWidget:: |
public static | function | Form element validation handler. | |
BlockFieldWidget:: |
public | function |
Constructs a WidgetBase object. Overrides WidgetBase:: |
|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginSettingsBase:: |
protected | property | Whether default settings have been merged into the current $settings. | |
PluginSettingsBase:: |
protected | property | The plugin settings injected by third party modules. | |
PluginSettingsBase:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
6 |
PluginSettingsBase:: |
public | function |
Returns the value of a setting, or its default value if absent. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Returns the array of settings, including defaults for missing settings. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Gets the list of third parties that store information. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Gets the value of a third-party setting. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Gets all third-party settings of a given module. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
protected | function | Merges default settings values into $settings. | |
PluginSettingsBase:: |
public | function |
Informs the plugin that some configuration it depends on will be deleted. Overrides PluginSettingsInterface:: |
3 |
PluginSettingsBase:: |
public | function |
Sets the value of a setting for the plugin. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Sets the settings for the plugin. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Sets the value of a third-party setting. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Unsets a third-party setting. Overrides ThirdPartySettingsInterface:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
WidgetBase:: |
protected | property | The field definition. | |
WidgetBase:: |
protected | property |
The widget settings. Overrides PluginSettingsBase:: |
|
WidgetBase:: |
public static | function | Ajax callback for the "Add another item" button. | |
WidgetBase:: |
public static | function | Submission handler for the "Add another item" button. | |
WidgetBase:: |
public static | function | After-build handler for field elements in a form. | |
WidgetBase:: |
public | function |
Assigns a field-level validation error to the right widget sub-element. Overrides WidgetInterface:: |
8 |
WidgetBase:: |
public | function |
Extracts field values from submitted form values. Overrides WidgetBaseInterface:: |
2 |
WidgetBase:: |
public | function |
Reports field-level validation errors against actual form elements. Overrides WidgetBaseInterface:: |
2 |
WidgetBase:: |
public | function |
Creates a form element for a field. Overrides WidgetBaseInterface:: |
3 |
WidgetBase:: |
protected | function | Special handling to create form elements for multiple values. | 1 |
WidgetBase:: |
protected | function | Returns the value of a field setting. | |
WidgetBase:: |
protected | function | Returns the array of field settings. | |
WidgetBase:: |
protected | function | Returns the filtered field description. | |
WidgetBase:: |
public static | function |
Retrieves processing information about the widget from $form_state. Overrides WidgetBaseInterface:: |
|
WidgetBase:: |
protected static | function | Returns the location of processing information within $form_state. | |
WidgetBase:: |
protected | function | Returns whether the widget handles multiple values. | |
WidgetBase:: |
public static | function |
Returns if the widget can be used for the provided field. Overrides WidgetInterface:: |
4 |
WidgetBase:: |
protected | function | Returns whether the widget used for default value form. | |
WidgetBase:: |
public static | function |
Stores processing information about the widget in $form_state. Overrides WidgetBaseInterface:: |