class Select2EntityReferenceWidget in Select 2 8
Plugin implementation of the 'select2' widget.
Plugin annotation
@FieldWidget(
id = "select2_entity_reference",
label = @Translation("Select2"),
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\Core\Field\Plugin\Field\FieldWidget\OptionsWidgetBase
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget
- class \Drupal\select2\Plugin\Field\FieldWidget\Select2Widget
- class \Drupal\select2\Plugin\Field\FieldWidget\Select2EntityReferenceWidget uses Select2Trait
- class \Drupal\select2\Plugin\Field\FieldWidget\Select2Widget
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsWidgetBase
- 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 Select2EntityReferenceWidget
File
- src/
Plugin/ Field/ FieldWidget/ Select2EntityReferenceWidget.php, line 27
Namespace
Drupal\select2\Plugin\Field\FieldWidgetView source
class Select2EntityReferenceWidget extends Select2Widget {
use Select2Trait;
/**
* The entity type manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$widget = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$widget
->setEntityTypeManager($container
->get('entity_type.manager'));
return $widget;
}
/**
* Set the entity type manager service.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
* The entity type manager service.
*/
protected function setEntityTypeManager(EntityTypeManagerInterface $entityTypeManager) {
$this->entityTypeManager = $entityTypeManager;
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'autocomplete' => FALSE,
'match_operator' => 'CONTAINS',
'match_limit' => 10,
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$element = parent::settingsForm($form, $form_state);
$element['autocomplete'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Autocomplete'),
'#default_value' => $this
->getSetting('autocomplete'),
'#description' => $this
->t('Options will be lazy loaded. This is recommended for lists with a lot of values.'),
];
$element['match_operator'] = [
'#type' => 'radios',
'#title' => $this
->t('Autocomplete matching'),
'#default_value' => $this
->getSetting('match_operator'),
'#options' => $this
->getMatchOperatorOptions(),
'#description' => $this
->t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of entities.'),
'#states' => [
'visible' => [
':input[name$="[settings_edit_form][settings][autocomplete]"]' => [
'checked' => TRUE,
],
],
],
];
$element['match_limit'] = [
'#type' => 'number',
'#title' => $this
->t('Number of results'),
'#default_value' => $this
->getSetting('match_limit'),
'#min' => 0,
'#description' => $this
->t('The number of suggestions that will be listed. Use <em>0</em> to remove the limit.'),
'#states' => [
'visible' => [
':input[name$="[settings_edit_form][settings][autocomplete]"]' => [
'checked' => TRUE,
],
],
],
];
return $element;
}
/**
* {@inheritdoc}
*/
protected function getOptions(FieldableEntityInterface $entity) {
if (!isset($this->options) && $this
->getSetting('autocomplete')) {
// Get all currently selected options.
$selected_options = [];
foreach ($entity
->get($this->fieldDefinition
->getName()) as $item) {
if ($item->{$this->column} !== NULL) {
$selected_options[] = $item->{$this->column};
}
}
if (!$selected_options) {
return $this->options = [];
}
// Validate that the options are matching the target_type and handler
// settings.
$handler_settings = $this
->getSelectionSettings() + [
'target_type' => $this
->getFieldSetting('target_type'),
'handler' => $this
->getFieldSetting('handler'),
];
return $this->options = static::getValidReferenceableEntities($selected_options, $handler_settings);
}
return parent::getOptions($entity);
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = parent::settingsSummary();
$autocomplete = $this
->getSetting('autocomplete');
$operators = $this
->getMatchOperatorOptions();
$summary[] = $this
->t('Autocomplete: @autocomplete', [
'@autocomplete' => $autocomplete ? $this
->t('On') : $this
->t('Off'),
]);
if ($autocomplete) {
$summary[] = $this
->t('Autocomplete matching: @match_operator', [
'@match_operator' => $operators[$this
->getSetting('match_operator')],
]);
$size = $this
->getSetting('match_limit') ?: $this
->t('unlimited');
$summary[] = $this
->t('Autocomplete suggestion list size: @size', [
'@size' => $size,
]);
}
return $summary;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$element['#target_type'] = $this
->getFieldSetting('target_type');
$element['#selection_handler'] = $this
->getFieldSetting('handler');
$element['#selection_settings'] = $this
->getSelectionSettings();
$element['#autocomplete'] = $this
->getSetting('autocomplete');
if ($this
->getSelectionHandlerSetting('auto_create') && ($bundle = $this
->getAutocreateBundle())) {
$entity = $items
->getEntity();
$element['#autocreate'] = [
'bundle' => $bundle,
'uid' => $entity instanceof EntityOwnerInterface ? $entity
->getOwnerId() : \Drupal::currentUser()
->id(),
];
}
// Do not display a 'multiple' select box if there is only one option. But
// with 'autocreate' or 'autocomplete' we want to ignore that.
$element['#multiple'] = $this->multiple && (count($this->options) > 1 || isset($element['#autocreate']) || $element['#autocomplete']);
if ($element['#autocomplete'] && $element['#multiple']) {
$entity_definition = $this->entityTypeManager
->getDefinition($element['#target_type']);
$message = $this
->t("Drag to re-order @entity_types.", [
'@entity_types' => $entity_definition
->getPluralLabel(),
]);
if (!empty($element['#description'])) {
$element['#description'] = [
'#theme' => 'item_list',
'#items' => [
$element['#description'],
$message,
],
];
}
else {
$element['#description'] = $message;
}
}
return $element;
}
/**
* Build array of selection settings.
*
* @return array
* Selection settings.
*
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
protected function getSelectionSettings() {
$label_field = $this->entityTypeManager
->getDefinition($this
->getFieldSetting('target_type'))
->getKey('label') ?: '_none';
return [
'match_operator' => $this
->getSetting('match_operator'),
'match_limit' => $this
->getSetting('match_limit'),
'sort' => [
'field' => $label_field,
],
] + $this
->getFieldSetting('handler_settings');
}
/**
* {@inheritdoc}
*/
protected static function prepareFieldValues(array $values, array $element) {
if (empty($element['#autocreate'])) {
return parent::prepareFieldValues($values, $element);
}
$handler_settings = $element['#selection_settings'] + [
'target_type' => $element['#target_type'],
'handler' => $element['#selection_handler'],
];
/** @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface $handler */
$handler = \Drupal::service('plugin.manager.entity_reference_selection')
->getInstance($handler_settings);
$options = empty($element['#options']) ? [] : static::getValidReferenceableEntities(array_keys(OptGroup::flattenOptions($element['#options'])), $handler_settings);
$items = [];
foreach ($values as $value) {
if (isset($options[$value])) {
$items[] = [
$element['#key_column'] => $value,
];
}
else {
if ($handler instanceof SelectionWithAutocreateInterface) {
$label = substr($value, 4);
// We are not saving created entities, because that's part of
// Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::preSave().
$items[] = [
'entity' => $handler
->createNewEntity($element['#target_type'], $element['#autocreate']['bundle'], $label, $element['#autocreate']['uid']),
];
}
}
}
return $items;
}
/**
* Returns the name of the bundle which will be used for autocreated entities.
*
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*
* @uses \Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget::getAutocreateBundle().
* This is copied from core.
*
* @return string
* The bundle name.
*/
protected function getAutocreateBundle() {
$bundle = NULL;
if ($this
->getSelectionHandlerSetting('auto_create')) {
// If a bundle is explicitly defined, use it.
if ($bundle = $this
->getSelectionHandlerSetting('auto_create_bundle')) {
return $bundle;
}
$target_bundles = $this
->getSelectionHandlerSetting('target_bundles');
// If there's no target bundle at all, use the target_type. It's the
// default for bundleless entity types.
if (empty($target_bundles)) {
$bundle = $this
->getFieldSetting('target_type');
}
elseif (count($target_bundles) == 1) {
$bundle = reset($target_bundles);
}
else {
// If no bundle has been set as auto create target means that there is
// an inconsistency in entity reference field settings.
trigger_error(sprintf("The 'Create referenced entities if they don't already exist' option is enabled but a specific destination bundle is not set. You should re-visit and fix the settings of the '%s' (%s) field.", $this->fieldDefinition
->getLabel(), $this->fieldDefinition
->getName()), E_USER_WARNING);
}
}
return $bundle;
}
/**
* Returns the value of a setting for the entity reference selection handler.
*
* @param string $setting_name
* The setting name.
*
* @uses \Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget::getSelectionHandlerSetting().
* This is copied from core.
*
* @return mixed
* The setting value.
*/
protected function getSelectionHandlerSetting($setting_name) {
$settings = $this
->getFieldSetting('handler_settings');
return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
}
/**
* Returns the options for the match operator.
*
* @return array
* List of options.
*/
protected function getMatchOperatorOptions() {
return [
'STARTS_WITH' => $this
->t('Starts with'),
'CONTAINS' => $this
->t('Contains'),
];
}
}
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. | |
OptionsSelectWidget:: |
protected | function |
Sanitizes a string label to display as an option. Overrides OptionsWidgetBase:: |
|
OptionsSelectWidget:: |
protected | function |
Indicates whether the widgets support optgroups. Overrides OptionsWidgetBase:: |
|
OptionsWidgetBase:: |
protected | property | Abstract over the actual field columns, to allow different field types to reuse those widgets. | |
OptionsWidgetBase:: |
protected | function | Determines selected options from the incoming field values. | |
OptionsWidgetBase:: |
public | function |
Constructs a WidgetBase object. Overrides WidgetBase:: |
1 |
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:: |
|
Select2EntityReferenceWidget:: |
protected | property | The entity type manager service. | |
Select2EntityReferenceWidget:: |
public static | function |
Creates an instance of the plugin. Overrides WidgetBase:: |
|
Select2EntityReferenceWidget:: |
public static | function |
Defines the default settings for this plugin. Overrides Select2Widget:: |
|
Select2EntityReferenceWidget:: |
public | function |
Returns the form for a single field widget. Overrides Select2Widget:: |
|
Select2EntityReferenceWidget:: |
protected | function | Returns the name of the bundle which will be used for autocreated entities. | |
Select2EntityReferenceWidget:: |
protected | function | Returns the options for the match operator. | |
Select2EntityReferenceWidget:: |
protected | function |
Returns the array of options for the widget. Overrides OptionsWidgetBase:: |
|
Select2EntityReferenceWidget:: |
protected | function | Returns the value of a setting for the entity reference selection handler. | |
Select2EntityReferenceWidget:: |
protected | function | Build array of selection settings. | |
Select2EntityReferenceWidget:: |
protected static | function |
Set's the values to the correct column key. Overrides Select2Widget:: |
|
Select2EntityReferenceWidget:: |
protected | function | Set the entity type manager service. | |
Select2EntityReferenceWidget:: |
public | function |
Returns a form to configure settings for the widget. Overrides Select2Widget:: |
|
Select2EntityReferenceWidget:: |
public | function |
Returns a short summary for the current widget settings. Overrides Select2Widget:: |
|
Select2Trait:: |
protected static | function | Validates an array of IDs. | |
Select2Widget:: |
protected | function |
Returns the empty option label to add to the list of options, if any. Overrides OptionsSelectWidget:: |
|
Select2Widget:: |
public static | function |
Form validation handler for widget elements. Overrides OptionsWidgetBase:: |
|
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 | Generates the form element for a single copy of the widget. | |
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 | function |
Massages the form values into the format expected for field values. Overrides WidgetInterface:: |
7 |
WidgetBase:: |
public static | function |
Stores processing information about the widget in $form_state. Overrides WidgetBaseInterface:: |