class OfficeHoursDefaultWidget in Office Hours 8
Plugin implementation of the 'office_hours_default' widget.
Plugin annotation
@FieldWidget(
id = "office_hours_default",
label = @Translation("Office hours (week)"),
field_types = {
"office_hours",
},
multiple_values = "FALSE",
)
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\office_hours\Plugin\Field\FieldWidget\OfficeHoursWidgetBase
- class \Drupal\office_hours\Plugin\Field\FieldWidget\OfficeHoursDefaultWidget
- class \Drupal\office_hours\Plugin\Field\FieldWidget\OfficeHoursWidgetBase
- 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 OfficeHoursDefaultWidget
File
- src/
Plugin/ Field/ FieldWidget/ OfficeHoursDefaultWidget.php, line 22
Namespace
Drupal\office_hours\Plugin\Field\FieldWidgetView source
class OfficeHoursDefaultWidget extends OfficeHoursWidgetBase {
/**
* Special handling to create form elements for multiple values.
*
* Removed the added generic features for multiple fields:
* - Number of widgets;
* - AHAH 'add more' button;
* - Table display and drag-n-drop value reordering.
* N.B. This is never called with Annotation: multiple_values = "FALSE".
*
* {@inheritdoc}
*/
protected function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
$field_cardinality = $this->fieldDefinition
->getFieldStorageDefinition()
->getCardinality();
if ($field_cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
$this->fieldDefinition
->getFieldStorageDefinition()
->setCardinality($this
->getFieldSetting('cardinality_per_day') * 7);
}
$elements = parent::formMultipleElements($items, $form, $form_state);
// Remove the 'drag-n-drop reordering' element.
$elements['#cardinality_multiple'] = FALSE;
// Remove the little 'Weight for row n' box.
unset($elements[0]['_weight']);
return $elements;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
// In D8, we have a (deliberate) anomaly in the widget.
// We prepare 1 widget for the whole week, but the field has unlimited cardinality.
// So with $delta = 0, we already show ALL values.
if ($delta > 0) {
return [];
}
$element = parent::formElement($items, $delta, $element, $form, $form_state);
// Create an indexed two level array of time slots.
// - First level are day numbers.
// - Second level contains field values arranged by $day_delta.
$indexed_items = array_fill_keys(range(0, 6), []);
foreach ($items as $index => $item) {
$value_of_item = $item
->getValue();
if ($item && !empty($value_of_item)) {
$indexed_items[(int) $value_of_item['day']][] = $item;
}
}
// Build elements, sorted by first_day_of_week.
$elements = [];
$days = OfficeHoursDateHelper::weekDaysOrdered(range(0, 6));
$day_names = OfficeHoursDateHelper::weekDays(FALSE);
$cardinality = $this
->getFieldSetting('cardinality_per_day');
foreach ($days as $day) {
// @todo The theme_function clears values above cardinality. Move it here.
for ($day_delta = 0; $day_delta < $cardinality; $day_delta++) {
$default_value = [
'day' => $day,
'day_delta' => $day_delta,
];
$default_value = isset($indexed_items[$day][$day_delta]) ? $indexed_items[$day][$day_delta]
->getValue() + $default_value : $default_value;
$elements[] = [
'#day' => $day,
'#daydelta' => $day_delta,
'#dayname' => $day_names[$day],
'#type' => 'office_hours_slot',
'#default_value' => $default_value,
'#field_settings' => $element['#field_settings'],
'#date_element_type' => $this
->getSetting('date_element_type'),
];
}
}
// Build multi element widget. Copy the description, etc. into the table.
$header = [
'title' => $this
->t($element['#title']),
'from' => $this
->t('From', [], [
'context' => 'A point in time',
]),
'to' => $this
->t('To', [], [
'context' => 'A point in time',
]),
];
if ($element['#field_settings']['comment']) {
$header['comment'] = $this
->t('Comment');
}
$header['operations'] = $this
->t('Operations');
$element['value'] = [
'#type' => 'office_hours_table',
'#header' => $header,
'#tableselect' => FALSE,
'#tabledrag' => FALSE,
] + $element['value'] + $elements;
// Wrap the table in a collapsible fieldset, which is th only way(?)
// to show the 'required' asterisk and the help text.
// The help text is now shown above the table, as requested by some users.
// N.B. For some reason, the title is shown in Capitals.
$element['#type'] = 'details';
// Controls the HTML5 'open' attribute. Defaults to FALSE.
$element['#open'] = TRUE;
// Remove field_name from first column.
$element['value']['#header']['title'] = NULL;
return $element;
}
/**
* {@inheritdoc}
*/
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
// See also function formElement(), formMultipleElements().
// Reformat the $values, before passing to database.
$multiple_values = $this
->getPluginDefinition()['multiple_values'];
if ($multiple_values == 'FALSE') {
// Below line works fine with Annotation: multiple_values = "FALSE".
$values = $values['value'];
}
elseif ($multiple_values == 'TRUE') {
// Below lines should work fine with Annotation: multiple_values = "TRUE".
$values = reset($values)['value'];
}
$values = parent::massageFormValues($values, $form, $form_state);
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. | |
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. | |
OfficeHoursDefaultWidget:: |
public | function |
Returns the form for a single field widget. Overrides OfficeHoursWidgetBase:: |
|
OfficeHoursDefaultWidget:: |
protected | function |
Special handling to create form elements for multiple values. Overrides WidgetBase:: |
|
OfficeHoursDefaultWidget:: |
public | function |
Massages the form values into the format expected for field values. Overrides OfficeHoursWidgetBase:: |
|
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 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. | 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 |
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 | 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 |
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:: |
|
WidgetBase:: |
public | function |
Constructs a WidgetBase object. Overrides PluginBase:: |
5 |