class OptionsShsWidget in Simple hierarchical select 2.0.x
Same name and namespace in other branches
- 8 src/Plugin/Field/FieldWidget/OptionsShsWidget.php \Drupal\shs\Plugin\Field\FieldWidget\OptionsShsWidget
Plugin implementation of the 'options_shs' widget.
Plugin annotation
@FieldWidget(
id = "options_shs",
label = @Translation("Simple hierarchical select"),
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
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsWidgetBase
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget
- class \Drupal\shs\Plugin\Field\FieldWidget\OptionsShsWidget implements ContainerFactoryPluginInterface uses StringTranslationTrait
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsWidgetBase
- class \Drupal\Core\Field\WidgetBase implements WidgetInterface, ContainerFactoryPluginInterface
- class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of OptionsShsWidget
1 file declares its use of OptionsShsWidget
- OptionsShsChosenWidget.php in modules/
shs_chosen/ src/ Plugin/ Field/ FieldWidget/ OptionsShsChosenWidget.php
File
- src/
Plugin/ Field/ FieldWidget/ OptionsShsWidget.php, line 28
Namespace
Drupal\shs\Plugin\Field\FieldWidgetView source
class OptionsShsWidget extends OptionsSelectWidget implements ContainerFactoryPluginInterface {
use StringTranslationTrait;
/**
* The widget defaults SHS service.
*
* @var \Drupal\shs\WidgetDefaults
*/
protected $widgetDefaults;
/**
* Constructs a new OptionsShsWidget object.
*
* @param string $plugin_id
* Plugin id.
* @param mixed $plugin_definition
* Plugin definition.
* @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
* Field definition.
* @param array $settings
* Field settings.
* @param array $third_party_settings
* Third party settings.
* @param \Drupal\shs\WidgetDefaults $widget_defaults
* The widget defaults SHS service.
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, WidgetDefaults $widget_defaults) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
$this->widgetDefaults = $widget_defaults;
// Set translation context.
$this->translationContext = 'shs:options_widget';
}
/**
* {@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('shs.widget_defaults'));
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
$settings_default = [
'display_node_count' => FALSE,
'create_new_items' => FALSE,
'create_new_levels' => FALSE,
'force_deepest' => FALSE,
];
return $settings_default + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$field_name = $this->fieldDefinition
->getName();
$element['create_new_items'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Allow creating new items'),
'#default_value' => $this
->getSetting('create_new_items'),
'#description' => $this
->t('Allow users to create new items of the source bundle.'),
'#disabled' => TRUE,
];
$element['create_new_levels'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Allow creating new levels'),
'#default_value' => $this
->getSetting('create_new_levels'),
'#description' => $this
->t('Allow users to create new children for items which do not have any children yet.'),
'#states' => [
'visible' => [
':input[name="fields[' . $field_name . '][settings_edit_form][settings][create_new_items]"]' => [
'checked' => TRUE,
],
],
],
'#disabled' => TRUE,
];
$element['force_deepest'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Force selection of deepest level'),
'#default_value' => $this
->getSetting('force_deepest'),
'#description' => $this
->t('Force users to select terms from the deepest level.'),
];
return $element;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = parent::settingsSummary();
if ($this
->getSetting('create_new_items')) {
$summary[] = $this
->t('Allow creation of new items');
if ($this
->getSetting('create_new_levels')) {
$summary[] = $this
->t('Allow creation of new levels');
}
else {
$summary[] = $this
->t('Do not allow creation of new levels');
}
}
else {
$summary[] = $this
->t('Do not allow creation of new items');
}
if ($this
->getSetting('force_deepest')) {
$summary[] = $this
->t('Force selection of deepest level');
}
else {
$summary[] = $this
->t('Do not force selection of deepest level');
}
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);
if (isset($form_state
->getBuildInfo()['base_form_id']) && 'field_config_form' === $form_state
->getBuildInfo()['base_form_id']) {
// Do not display the shs widget in the field config.
return $element;
}
// Rewrite element to use a simple textfield.
$element['#type'] = 'textfield';
unset($element['#options']);
if (!$element['#default_value']) {
$element['#default_value'] = '';
}
$field_name = $this->fieldDefinition
->getName();
$default_value = $element['#default_value'] ?: NULL;
$user_input = $form_state
->getUserInput();
if (!empty($element['#field_parents'])) {
$field_parents = $element['#field_parents'];
$field_parents[] = $field_name;
$value = NestedArray::getValue($user_input, $field_parents);
$default_value = $value ?: $default_value;
}
elseif (isset($user_input[$field_name])) {
$default_value = $user_input[$field_name];
}
if (is_array($default_value) && count($default_value) === 1 && empty($default_value[0])) {
// Sometimes we get a list of empty default values which equals to no
// value at all.
$default_value = NULL;
}
$target_bundles = $this
->getFieldSetting('handler_settings')['target_bundles'];
$settings_additional = [
'required' => $this->required,
'multiple' => $this->multiple,
'anyLabel' => $this
->getEmptyLabel() ?: $this
->t('- None -'),
'anyValue' => '_none',
'addNewLabel' => $this
->t('Add another item'),
];
$bundle = reset($target_bundles);
/** @var \Drupal\taxonomy\VocabularyInterface $vocabulary */
$vocabulary = \Drupal::entityTypeManager()
->getStorage('taxonomy_vocabulary')
->load($bundle);
$cardinality = $this->fieldDefinition
->getFieldStorageDefinition()
->getCardinality();
// Define default parents for the widget.
$parents = $this->widgetDefaults
->getInitialParentDefaults($settings_additional['anyValue'], $cardinality);
if ($default_value) {
$parents = $this->widgetDefaults
->getParentDefaults($default_value, $settings_additional['anyValue'], $this->fieldDefinition
->getItemDefinition()
->getSetting('target_type'), $cardinality);
}
$settings_shs = [
'settings' => $this
->getSettings() + $settings_additional,
'bundle' => $bundle,
'bundleLabel' => $vocabulary
->label(),
'baseUrl' => 'shs-term-data',
'cardinality' => $cardinality,
'parents' => $parents,
'defaultValue' => $default_value,
];
$hooks = [
'shs_js_settings',
"shs_{$field_name}_js_settings",
];
// Allow other modules to override the settings.
\Drupal::moduleHandler()
->alter($hooks, $settings_shs, $bundle, $field_name);
$element += [
'#shs' => $settings_shs,
];
if (empty($element['#attributes'])) {
$element['#attributes'] = [];
}
$element['#attributes'] = array_merge($element['#attributes'], [
'class' => [
'shs-enabled',
],
]);
if (empty($element['#attached'])) {
$element['#attached'] = [];
}
$element['#attached'] = array_merge($element['#attached'], [
'library' => [
'shs/shs.form',
],
]);
return $element;
}
/**
* {@inheritdoc}
*/
public static function afterBuild(array $element, FormStateInterface $form_state) {
$element = parent::afterBuild($element, $form_state);
if (empty($element['#shs'])) {
// Simply return the unaltered element if there is no information attached
// about SHS (i.e. on field config forms).
return $element;
}
$context = [
'settings' => empty($element['#shs']['settings']) ? [] : $element['#shs']['settings'],
];
// Create unique key for field.
$element_key = Html::getUniqueId(sprintf('shs-%s', $element['#field_name']));
$element['#attributes'] = array_merge($element['#attributes'], [
'data-shs-selector' => $element_key,
]);
$element['#shs'] += [
'classes' => shs_get_class_definitions($element['#field_name'], $context),
];
$element['#attached'] = $element['#attached'] ?: [];
$element['#attached'] = array_merge($element['#attached'], [
'drupalSettings' => [
'shs' => [
$element_key => $element['#shs'],
],
],
]);
return $element;
}
/**
* {@inheritDoc}
*/
protected function getSelectedOptions(FieldItemListInterface $items) {
$selected_options = [];
foreach ($items as $item) {
$selected_options[] = $item->target_id;
}
return $selected_options;
}
/**
* {@inheritDoc}
*/
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
if (isset($values[0]['target_id']) && strpos($values[0]['target_id'], ',') !== FALSE) {
$exploded_values = explode(',', $values[0]['target_id']);
$values = [];
foreach ($exploded_values as $value) {
$values[]['target_id'] = $value;
}
}
return $values;
}
/**
* {@inheritdoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition) {
// The widget currently only works for taxonomy terms.
if ($field_definition
->getSetting('target_type') !== 'taxonomy_term') {
return FALSE;
}
// The widget only works with fields having one target bundle as source.
$handler_settings = $field_definition
->getSetting('handler_settings');
return isset($handler_settings['target_bundles']) && count($handler_settings['target_bundles']) === 1;
}
/**
* {@inheritdoc}
*/
public static function validateElement(array $element, FormStateInterface $form_state) {
parent::validateElement($element, $form_state);
if (empty($element['#shs']['settings']['force_deepest']) || $form_state
->hasAnyErrors()) {
return;
}
$value = $element['#value'];
if (!is_array($value)) {
$value = [
$value,
];
}
if ($element['#shs']['settings']['anyValue'] === reset($value)) {
if (!$element['#required']) {
return;
}
elseif (count($element['#options']) > 1) {
$form_state
->setError($element, $this
->t('You need to select a term from the deepest level in field @name.', [
'@name' => $element['#title'],
]));
return;
}
}
foreach ($value as $element_value) {
if (shs_term_has_children($element_value)) {
$form_state
->setError($element, $this
->t('You need to select a term from the deepest level in field @name.', [
'@name' => $element['#title'],
]));
return;
}
}
}
/**
* {@inheritdoc}
*/
protected function supportsGroups() {
// We do not support optgroups.
return FALSE;
}
/**
* Return string representation of a setting.
*
* @param string $key
* Name of the setting.
*
* @return string
* Value of the setting. If boolean, the value is "translated" to 'true' or
* 'false'.
*/
protected function settingToString($key) {
$options = [
FALSE => $this
->t('false'),
TRUE => $this
->t('true'),
];
$value = $this
->getSetting($key);
if (!is_bool($value)) {
return $value;
}
return $options[$value];
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
public | function | 2 | |
DependencySerializationTrait:: |
public | function | 2 | |
MessengerTrait:: |
protected | property | The messenger. | 27 |
MessengerTrait:: |
public | function | Gets the messenger. | 27 |
MessengerTrait:: |
public | function | Sets the messenger. | |
OptionsSelectWidget:: |
protected | function |
Returns the empty option label to add to the list of options, if any. Overrides OptionsWidgetBase:: |
|
OptionsSelectWidget:: |
protected | function |
Sanitizes a string label to display as an option. Overrides OptionsWidgetBase:: |
|
OptionsShsWidget:: |
protected | property | The widget defaults SHS service. | |
OptionsShsWidget:: |
public static | function |
After-build handler for field elements in a form. Overrides WidgetBase:: |
|
OptionsShsWidget:: |
public static | function |
Creates an instance of the plugin. Overrides WidgetBase:: |
|
OptionsShsWidget:: |
public static | function |
Defines the default settings for this plugin. Overrides PluginSettingsBase:: |
1 |
OptionsShsWidget:: |
public | function |
Returns the form for a single field widget. Overrides OptionsSelectWidget:: |
1 |
OptionsShsWidget:: |
protected | function |
Determines selected options from the incoming field values. Overrides OptionsWidgetBase:: |
|
OptionsShsWidget:: |
public static | function |
Returns if the widget can be used for the provided field. Overrides WidgetBase:: |
|
OptionsShsWidget:: |
public | function |
Massages the form values into the format expected for field values. Overrides WidgetBase:: |
|
OptionsShsWidget:: |
public | function |
Returns a form to configure settings for the widget. Overrides WidgetBase:: |
1 |
OptionsShsWidget:: |
public | function |
Returns a short summary for the current widget settings. Overrides WidgetBase:: |
1 |
OptionsShsWidget:: |
protected | function | Return string representation of a setting. | |
OptionsShsWidget:: |
protected | function |
Indicates whether the widgets support optgroups. Overrides OptionsSelectWidget:: |
|
OptionsShsWidget:: |
public static | function |
Form validation handler for widget elements. Overrides OptionsWidgetBase:: |
|
OptionsShsWidget:: |
public | function |
Constructs a new OptionsShsWidget object. Overrides OptionsWidgetBase:: |
|
OptionsWidgetBase:: |
protected | property | Abstract over the actual field columns, to allow different field types to reuse those widgets. | |
OptionsWidgetBase:: |
protected | function | Returns the array of options for the widget. | |
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:: |
2 |
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. | 4 |
StringTranslationTrait:: |
protected | property | Default string translation context. | |
StringTranslationTrait:: |
protected | function | ||
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. Aliased as: formatPluralCore | |
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 | ||
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. Aliased as: tCore | |
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 | 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:: |
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:: |