class CategorizedOptionsbuttonsWidget in Open Social 10.1.x
Same name and namespace in other branches
- 8.9 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 8.3 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 8.4 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 8.5 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 8.6 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 8.7 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 8.8 modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 10.3.x modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 10.0.x modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- 10.2.x modules/social_features/social_profile/src/Plugin/Field/FieldWidget/CategorizedOptionsbuttonsWidget.php \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
Plugin implementation of the 'categorized_options_buttons' widget.
@todo Handle submit to add categories also as tags on user profile.
Plugin annotation
@FieldWidget(
id = "categorized_options_buttons",
label = @Translation("Categorized check boxes/radio buttons"),
field_types = {
"boolean",
"entity_reference",
"list_integer",
"list_float",
"list_string",
},
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\OptionsButtonsWidget
- class \Drupal\social_profile\Plugin\Field\FieldWidget\CategorizedOptionsbuttonsWidget
- class \Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget
- 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 CategorizedOptionsbuttonsWidget
File
- modules/
social_features/ social_profile/ src/ Plugin/ Field/ FieldWidget/ CategorizedOptionsbuttonsWidget.php, line 27
Namespace
Drupal\social_profile\Plugin\Field\FieldWidgetView source
class CategorizedOptionsbuttonsWidget extends OptionsButtonsWidget {
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
// We can only overwrite the default behaviour if the user is allowed to
// select multiple elements and we have something to choose from.
// Otherwise we just default back to default behaviour.
if ($this->fieldDefinition
->getFieldStorageDefinition()
->isMultiple() && !empty($element['#options'])) {
$grouped_options = $this
->getGroupedOptions($element['#options'], $element['#default_value']);
// Change the parent type.
$element['#type'] = 'container';
$element['#attributes']['class'][] = 'checkboxes--nested';
unset($element['#options']);
unset($element['#default_value']);
// Used to ensure that we don't need to alter the submit handler too much.
$element['#checkbox_categories'] = [];
$field_name = $this->fieldDefinition
->getName();
foreach ($grouped_options as $tid => $option) {
// If this is a top level element without children then we just treat it
// normally.
if (empty($option['children'])) {
$element += [
'label' => [
'#type' => 'label',
'#title' => $element['#title'],
],
'checkboxes' => [
'#type' => 'checkboxes',
'#default_value' => [],
'#options' => [],
],
];
$element['checkboxes']['#options'][$tid] = $option['label'];
if ($option['selected']) {
$element['checkboxes']['#default_value'][] = $tid;
}
}
else {
$children = $this
->getTaxonomyChildren($option);
$element['#checkbox_categories'][] = $tid;
$element[$tid] = [
'#type' => 'container',
'label' => [
'#type' => 'label',
'#title' => $option['label'],
'#attributes' => [
'class' => [
'checkboxes__label',
],
],
],
'checkboxes' => [
'#type' => 'checkboxes',
'#default_value' => $children['selected'],
'#options' => $children['children'],
],
];
}
}
}
return $element;
}
/**
* {@inheritdoc}
*/
public static function validateElement(array $element, FormStateInterface $form_state) {
// Only pre-process the validation if this is a categorized checkbox
// element.
if (isset($element['#checkbox_categories'])) {
// This turns the tree back into a single checkbox element that our parent
// widget can handle. We didn't disable value tree submission because it
// gives us issues in FormValidator::performRequiredValidation.
$element['#value'] = [];
$element['#options'] = [];
if (isset($element['checkboxes'])) {
$element['#value'] += $element['checkboxes']['#value'];
$element['#options'] += $element['checkboxes']['#options'];
}
foreach ($element['#checkbox_categories'] as $tid) {
// If a value in a category was checked then those selections are added
// but we also select the category itself.
if (!empty($element[$tid]['checkboxes']['#value'])) {
$element['#value'] += [
$tid => $tid,
];
$element['#options'] += [
$tid => $tid,
];
$element['#value'] += $element[$tid]['checkboxes']['#value'];
$element['#options'] += $element[$tid]['checkboxes']['#options'];
}
}
}
parent::validateElement($element, $form_state);
}
/**
* Group the options with their parent taxonomy terms.
*
* This makes it easier to arrange them for display later. Relies on a proper
* ordering of parent > child from the taxonomy validation.
*
* @param array $options
* The options to group.
* @param array $selected
* The currently selected options.
*
* @return array
* A tree structure with labels and selection status as leaf values.
*/
protected function getGroupedOptions(array $options, array $selected) {
$grouped_options = [];
foreach ($options as $tid => $label) {
// Start at the top for the current element.
$group =& $grouped_options;
// Find the position for this element based on its parent group. If it
// contains a dash (-) then it's a child and we find its parent.
while (strpos($label, '-') === 0) {
// Remove the dash denoting this is a child.
$label = substr($label, 1);
// Move into the last parent added.
end($group);
$group =& $group[key($group)]['children'];
}
// This is now a new child to the currently selected parent.
$group[$tid] = [
'label' => $label,
'selected' => in_array($tid, $selected),
];
}
return $grouped_options;
}
/**
* Reaches into all children and flattens the taxonomy.
*
* This method is private for a reason. We don't handle extra nesting yet but
* could want to do this in the future. Do not rely on this method existing
* in the future.
*
* @param array $parent
* The parent whose children to recurse through.
* @param int $hyphens
* The number of hyphens to use as a label prefix.
*
* @return array[]
* A flattened array of children.
*/
private function getTaxonomyChildren(array $parent, $hyphens = 0) {
$children = [];
$selected = [];
foreach ($parent['children'] as $tid => $child) {
$children[$tid] = str_repeat('-', $hyphens) . $child['label'];
if ($child['selected']) {
$selected[] = $tid;
}
if (!empty($child['children'])) {
$result = $this
->getTaxonomyChildren($child, $hyphens + 1);
$children += $result['children'];
$selected += $result['selected'];
}
}
return [
'children' => $children,
'selected' => $selected,
];
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
CategorizedOptionsbuttonsWidget:: |
public | function |
Returns the form for a single field widget. Overrides OptionsButtonsWidget:: |
|
CategorizedOptionsbuttonsWidget:: |
protected | function | Group the options with their parent taxonomy terms. | |
CategorizedOptionsbuttonsWidget:: |
private | function | Reaches into all children and flattens the taxonomy. | |
CategorizedOptionsbuttonsWidget:: |
public static | function |
Form validation handler for widget elements. Overrides OptionsWidgetBase:: |
|
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. | |
OptionsButtonsWidget:: |
protected | function |
Returns the empty option label to add to the list of options, if any. 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. | |
OptionsWidgetBase:: |
protected | function | Determines selected options from the incoming field values. | |
OptionsWidgetBase:: |
protected | function | Sanitizes a string label to display as an option. | 1 |
OptionsWidgetBase:: |
protected | function | Indicates whether the widgets support optgroups. | 1 |
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:: |
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 static | function |
Defines the default settings for this plugin. Overrides PluginSettingsInterface:: |
42 |
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 | 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 |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
5 |
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 | function |
Returns a form to configure settings for the widget. Overrides WidgetInterface:: |
16 |
WidgetBase:: |
public | function |
Returns a short summary for the current widget settings. Overrides WidgetInterface:: |
15 |
WidgetBase:: |
public static | function |
Stores processing information about the widget in $form_state. Overrides WidgetBaseInterface:: |