class ReferenceWidget in Select (or other) 8
Same name and namespace in other branches
- 4.x src/Plugin/Field/FieldWidget/ReferenceWidget.php \Drupal\select_or_other\Plugin\Field\FieldWidget\ReferenceWidget
Plugin implementation of the 'select_or_other_reference' widget.
Plugin annotation
@FieldWidget(
id = "select_or_other_reference",
label = @Translation("Select or Other"),
field_types = {
"entity_reference"
},
multiple_values = TRUE
)
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\select_or_other\Plugin\Field\FieldWidget\WidgetBase
- class \Drupal\select_or_other\Plugin\Field\FieldWidget\ReferenceWidget implements ContainerFactoryPluginInterface
- class \Drupal\select_or_other\Plugin\Field\FieldWidget\WidgetBase
- 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 ReferenceWidget
1 file declares its use of ReferenceWidget
- ReferenceWidgetTest.php in tests/
src/ Unit/ ReferenceWidgetTest.php
File
- src/
Plugin/ Field/ FieldWidget/ ReferenceWidget.php, line 30
Namespace
Drupal\select_or_other\Plugin\Field\FieldWidgetView source
class ReferenceWidget extends WidgetBase implements ContainerFactoryPluginInterface {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The bundle info service.
*
* @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
*/
protected $bundleInfoService;
/**
* {@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('entity_type.manager'), $container
->get('entity_type.bundle.info'));
}
/**
* Constructs a ReferenceWidget object.
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, EntityTypeManagerInterface $entity_type = NULL, EntityTypeBundleInfoInterface $bundle_info_service = NULL) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
$this->entityTypeManager = $entity_type;
$this->bundleInfoService = $bundle_info_service;
}
/**
* Helper method which prepares element values for validation.
*
* EntityAutocomplete::validateEntityAutocomplete expects a string when
* validating taxonomy terms.
*
* @param array $element
* The element to prepare.
*/
protected static function prepareElementValuesForValidation(array &$element) {
if ($element['#tags']) {
$element['#value'] = Tags::implode($element['#value']);
}
}
/**
* Retrieves the entityStorage object.
*
* @return \Drupal\Core\Entity\EntityStorageInterface
* EntityStorage for entity types that can be referenced by this widget.
*
* @codeCoverageIgnore
* Ignore this method because if ::getFieldSetting() or entityTypeManager
* does not return the expected result, we have other problems on our hands.
*/
protected function getEntityStorage() {
$target_type = $this
->getFieldSetting('target_type');
return $this->entityTypeManager
->getStorage($target_type);
}
/**
* Retrieves the key used to indicate a bundle for the entity type.
*
* @return string
* The key used to indicate a bundle for the entity type referenced by this
* widget's field.
*
* @codeCoverageIgnore
* Ignore this method because if any of the called core functions does not
* return the expected result, we've got other problems on our hands.
*/
protected function getBundleKey() {
$entity_keys = $this
->getEntityStorage()
->getEntityType()
->get('entity_keys');
return $entity_keys['bundle'];
}
/**
* {@inheritdoc}
*/
protected function getOptions(FieldableEntityInterface $entity = NULL) {
$options = [];
// Prepare properties to use for loading.
$entity_storage = $this
->getEntityStorage();
$bundle_key = $this
->getBundleKey();
$target_bundles = $this
->getSelectionHandlerSetting('target_bundles');
$properties = [
$bundle_key => $target_bundles,
];
$entities = $entity_storage
->loadByProperties($properties);
// Prepare the options.
foreach ($entities as $entity) {
$options["{$entity->label()} ({$entity->id()})"] = $entity
->label();
}
return $options;
}
/**
* {@inheritdoc}
*/
protected function prepareSelectedOptions(array $options) {
$prepared_options = [];
$entities = $this
->getEntityStorage()
->loadMultiple($options);
foreach ($entities as $entity) {
$prepared_options[] = "{$entity->label()} ({$entity->id()})";
}
return $prepared_options;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$entity = $items
->getEntity();
$element = $element + [
'#target_type' => $this
->getFieldSetting('target_type'),
'#selection_handler' => $this
->getFieldSetting('handler'),
'#selection_settings' => $this
->getFieldSetting('handler_settings'),
'#autocreate' => [
'bundle' => $this
->getAutocreateBundle(),
'uid' => $entity instanceof EntityOwnerInterface ? $entity
->getOwnerId() : \Drupal::currentUser()
->id(),
],
'#validate_reference' => TRUE,
'#tags' => $this
->getFieldSetting('target_type') === 'taxonomy_term',
'#merged_values' => TRUE,
];
$element['#element_validate'] = [
[
get_class($this),
'validateReferenceWidget',
],
];
return $element;
}
/**
* Returns the value of a setting for the entity reference selection handler.
*
* @todo This is shamelessly copied from EntityAutocomplete. We should
* probably file a core issue to turn this into a trait. The same goes for
* $this::getAutoCreateBundle()
*
* @param string $setting_name
* The setting name.
*
* @return mixed
* The setting value.
*
* @codeCoverageIgnore
* Ignore this function because it is a straight copy->paste.
*/
protected function getSelectionHandlerSetting($setting_name) {
$settings = $this
->getFieldSetting('handler_settings');
return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
}
/**
* Returns the name of the bundle which will be used for autocreated entities.
*
* @todo This is shamelessly copied from EntityAutocomplete. We should
* probably file a core issue to turn this into a trait. The same goes for
* $this::getSelectionHandlerSetting()
*
* @return string
* The bundle name.
*
* @codeCoverageIgnore
* Ignore this function because it is a straight copy->paste.
*/
protected function getAutocreateBundle() {
$bundle = NULL;
if ($this
->getSelectionHandlerSetting('auto_create')) {
// If the 'target_bundles' setting is restricted to a single choice, we
// can use that.
if (($target_bundles = $this
->getSelectionHandlerSetting('target_bundles')) && count($target_bundles) == 1) {
$bundle = reset($target_bundles);
}
else {
// @todo Expose a proper UI for choosing the bundle for autocreated
// entities in https://www.drupal.org/node/2412569.
$bundles = $this->bundleInfoService
->getBundleInfo($this
->getFieldSetting('target_type'));
$bundle = key($bundles);
}
}
return $bundle;
}
/**
* Form element validation handler for select_or_other_reference elements.
*
* @codeCoverageIgnore
* Ignore
*/
public static function validateReferenceWidget(array &$element, FormStateInterface $form_state, array &$complete_form) {
self::prepareElementValuesForValidation($element);
if (!empty($element['#value'])) {
EntityAutocomplete::validateEntityAutocomplete($element, $form_state, $complete_form);
}
}
/**
* {@inheritdoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition) {
$options = $field_definition
->getSettings();
$handler_settings = isset($options['handler_settings']) ? $options['handler_settings'] : NULL;
$handler = \Drupal::service('plugin.manager.entity_reference_selection')
->getInstance($options);
return $handler instanceof SelectionWithAutocreateInterface && isset($handler_settings['auto_create']) && $handler_settings['auto_create'];
}
}
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. | |
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:: |
|
ReferenceWidget:: |
protected | property | The bundle info service. | |
ReferenceWidget:: |
protected | property | The entity type manager. | |
ReferenceWidget:: |
public static | function |
Creates an instance of the plugin. Overrides WidgetBase:: |
|
ReferenceWidget:: |
public | function |
Returns the form for a single field widget. Overrides WidgetBase:: |
|
ReferenceWidget:: |
protected | function | Returns the name of the bundle which will be used for autocreated entities. | |
ReferenceWidget:: |
protected | function | Retrieves the key used to indicate a bundle for the entity type. | |
ReferenceWidget:: |
protected | function | Retrieves the entityStorage object. | |
ReferenceWidget:: |
protected | function |
Returns the array of options for the widget. Overrides WidgetBase:: |
|
ReferenceWidget:: |
protected | function | Returns the value of a setting for the entity reference selection handler. | |
ReferenceWidget:: |
public static | function |
Returns if the widget can be used for the provided field. Overrides WidgetBase:: |
|
ReferenceWidget:: |
protected static | function | Helper method which prepares element values for validation. | |
ReferenceWidget:: |
protected | function |
Prepares selected options for comparison to the available options. Overrides WidgetBase:: |
|
ReferenceWidget:: |
public static | function | Form element validation handler for select_or_other_reference elements. | |
ReferenceWidget:: |
public | function |
Constructs a ReferenceWidget object. Overrides WidgetBase:: |
|
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 static | function |
@codeCoverageIgnore
Ignore this method because we would be testing if a hard coded array is
equal to another hard coded array. Overrides PluginSettingsBase:: |
1 |
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:: |
protected | function | Flattens an array of allowed values. | |
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 | Generates the form element for a single copy of the widget. | |
WidgetBase:: |
private | function | Returns the available sorting options. | |
WidgetBase:: |
protected | function | Helper method to determine the identifying column for the field. | |
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:: |
protected | function | Determines selected options from the incoming field values. | |
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:: |
protected | function | Returns whether the widget used for default value form. | |
WidgetBase:: |
protected | function | Helper method to determine if the field supports multiple values. | |
WidgetBase:: |
protected | function | Helper method to determine if the field is required. | |
WidgetBase:: |
public | function |
Massages the form values into the format expected for field values. Overrides WidgetInterface:: |
7 |
WidgetBase:: |
private | function | Returns the types of select elements available for selection. | |
WidgetBase:: |
public | function |
Returns a form to configure settings for the widget. Overrides WidgetBase:: |
1 |
WidgetBase:: |
public | function |
Returns a short summary for the current widget settings. Overrides WidgetBase:: |
|
WidgetBase:: |
public static | function |
Stores processing information about the widget in $form_state. Overrides WidgetBaseInterface:: |
|
WidgetBase:: |
private | function | Adds the available options to the select or other element. | |
WidgetBase:: |
protected | function | Indicates whether the widgets support optgroups. |