I am trying to do a simple update to a form element in my field widget,
I have a start and a end dates in the field widget and I need the start date to be the min date of the end date,
so I call an ajax call back function to edit the $form array and return the element updated but it’s not working or updating the widget elements
can someone help me
use DrupalCoreFieldFieldItemListInterface;
use DrupalCoreFieldWidgetBase;
use DrupalCoreFormFormStateInterface;
use DrupalCoreDatetimeDrupalDateTime;
use DrupalComponentUtilityNestedArray;
/**
* Plugin implementation of the 'work_slot_widget' widget.
*
* @FieldWidget(
* id = "work_slot_widget",
* module = "gag_work_slot",
* label = @Translation("Work slot widget"),
* field_types = {
* "work_slot_field"
* }
* )
*/
class WorkSlotWidget extends WidgetBase
{
/**
* {@inheritdoc}
*/
public static function defaultSettings()
{
return (
'increment' => '15',
'date_order' => 'DMY',
'time_order' => '24',
) + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state)
{
$element = parent::settingsForm($form, $form_state);
$element('date_order') = (
'#type' => 'select',
'#title' => t('Date part order'),
'#default_value' => $this->getSetting('date_order'),
'#options' => ('MDY' => t('Month/Day/Year'), 'DMY' => t('Day/Month/Year'), 'YMD' => t('Year/Month/Day')),
);
$element('time_order') = (
'#type' => 'select',
'#title' => t('Time type'),
'#default_value' => $this->getSetting('time_order'),
'#options' => ('24' => t('24 hour time'), '12' => t('12 hour time')),
);
$element('increment') = (
'#type' => 'select',
'#title' => t('Time increments'),
'#default_value' => $this->getSetting('increment'),
'#options' => (
1 => t('1 minute'),
5 => t('5 minute'),
10 => t('10 minute'),
15 => t('15 minute'),
30 => t('30 minute'),
),
);
return $element;
}
/**
* {@inheritdoc}
*/
public function settingsSummary()
{
$summary = ();
$summary() = t('Date part order: @order', ('@order' => $this->getSetting('date_order')));
$summary() = t('Time order: @time_order', ('@time_order' => $this->getSetting('time_order')));
$summary() = t('Time increments: @increment', ('@increment' => $this->getSetting('increment')));
return $summary;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state)
{
$field_name = $this->fieldDefinition->getName();
$field_values = $form_state->getValue($field_name);
$element('#theme_wrappers')() = 'fieldset';
$element('work_slot_type') = (
'#type' => 'select',
'#title' => t('Work slot type'),
'#description' => t('Select whether the work slot is single day or on going job'),
'#default_value' => isset($field_values($delta)('work_slot_type')) ? $field_values($delta)('work_slot_type') : '',
'#options' => (
'' => t('Please select type of work slot'),
'Single day' => t('Single day'),
'On going' => t('On going job')
),
);
$date_order = $this->getSetting('date_order');
$time_order = $this->getSetting('time_order');
$increment = $this->getSetting('increment');
// Set up the date part order array.
switch ($date_order) {
case 'YMD':
$date_format = ('year', 'month', 'day');
break;
case 'MDY':
$date_format = ('month', 'day', 'year');
break;
case 'DMY':
$date_format = ('day', 'month', 'year');
break;
}
switch ($time_order) {
case '24':
$time_format = ('hour', 'minute');
break;
case '12':
$time_format = ('hour', 'minute', 'ampm');
break;
case 'none':
break;
}
$min_date = new DrupalDateTime('now');
$min_date_str = $min_date->format('Y-m-d');
$max_date = new DrupalDateTime('now');
$max_date->modify('+1 year');
$max_date_str = $max_date->format('Y-m-d');
$element('start_date') = (
'#type' => 'date',
'#title' => t('Start date'),
'#date_date_format' => $date_format,
'#date_date_element' => 'date',
'#date_date_callbacks' => (),
'#ajax' => (
'callback' => ($this, 'startDateCallback'),
'disable-refocus' => FALSE,
'event' => 'change',
'wrapper' => 'edit-start-dates',
'progress' => (
'type' => 'throbber',
'message' => $this->t('updating...'),
),
),
'#attributes' => ('min' => $min_date_str, 'max' => $max_date_str),
'#states' => (
'visible' =>
(':input(name="field_work_slot(' . $delta . ')(work_slot_type)")' => ('!value' => ''),)
),
);
$end_min_date_str = (isset($field_values($delta)('start_date'))) ? $field_values($delta)('start_date') : $min_date_str;
$element('end_date') = (
'#type' => 'date',
'#title' => t('End date'),
'#date_date_format' => $date_format,
'#date_date_element' => 'date',
'#date_date_callbacks' => (),
'#attributes' => ('min' => $end_min_date_str, 'max' => $max_date_str),
'#states' => (
'visible' =>
(
':input(name="field_work_slot(' . $delta . ')(work_slot_type)")' => ('value' => 'On going'),
'and',
':input(name="field_work_slot(' . $delta . ')(start_date)")' => ('!value' => '')
)
)
);
$element('times_container') = (
'#type' => 'container',
'#attributes' => (
'id' => ('times_container'),
),
'#states' => (
'visible' =>
(':input(name="field_work_slot(' . $delta . ')(work_slot_type)")' => ('!value' => ''),)
),
);
$element('times_container')('start_time') = (
'#type' => 'datetime',
'#title' => t('Start time'),
'#date_date_element' => 'none',
'#date_time_format' => $time_format,
'#date_time_element' => 'time',
'#date_time_callbacks' => (),
'#states' => (
'visible' =>
(':input(name="field_work_slot(' . $delta . ')(work_slot_type)")' => ('!value' => ''),)
),
);
$element('times_container')('end_time') = (
'#type' => 'datetime',
'#title' => t('End time'),
'#date_date_element' => 'none',
'#date_time_format' => $time_format,
'#date_time_element' => 'time',
'#date_time_callbacks' => (),
'#states' => (
'visible' =>
(':input(name="field_work_slot(' . $delta . ')(work_slot_type)")' => ('!value' => ''),)
),
);
$element('working_days') = (
'#type' => 'select',
'#title' => t('Working Days'),
'#multiple' => TRUE,
'#default_value' => 'All',
'#states' => (
'visible' =>
(':input(name="field_work_slot(' . $delta . ')(work_slot_type)")' => ('value' => 'On going'),)
),
'#options' => (
'All' => t('All'),
'Monday' => t('Monday'),
'Tuesday' => t('Tuesday'),
'Wednesday' => t('Wednesday'),
'Thursday' => t('Thursday'),
'Friday' => t('Friday'),
'Saturday' => t('Saturday'),
'Sunday' => t('Sunday'),
),
);
return $element;
}
/**
* start date callback to set attributes for end date
*
* @param array $form
* @param FormStateInterface $form_state
* @return void
*/
public function startDateCallback(array $form, FormStateInterface $form_state)
{
$triggered = $form_state->getTriggeringElement();
$element = NestedArray::getValue($form, array_slice($triggered('#array_parents'), 0, -1));
$element('start_date')('#attributes')('max') = $element('start_date')('#value');
$element('end_date')('#attributes')('min') = $element('start_date')('#value');
$element('end_date')('#value') = $element('start_date')('#value');
return $element;
}