The defineOptions()
method returns the view field options, not the options to use in one of the form elements returned from the buildOptionsForm()
method.
If you look at an existing defineOptions()
implementation, for example Date::defineOptions()
or Custom::defineOptions()
, you will notice the returned array follows a specific format.
protected function defineOptions() {
$options = parent::defineOptions();
$options['date_format'] = [
'default' => 'small',
];
$options['custom_date_format'] = [
'default' => '',
];
$options['timezone'] = [
'default' => '',
];
return $options;
}
protected function defineOptions() {
$options = parent::defineOptions();
// Override the alter text option to always alter the text.
$options['alter']['contains']['alter_text'] = [
'default' => TRUE,
];
$options['hide_alter_empty'] = [
'default' => FALSE,
];
return $options;
}
The buildOptionsForm()
method then uses the $this->options
array to set the default values of the form elements it shows. (See Date::buildOptionsForm()
.)
public function buildOptionsForm(&$form, FormStateInterface $form_state) {
$date_formats = [];
foreach ($this->dateFormatStorage->loadMultiple() as $machine_name => $value) {
$date_formats[$machine_name] = $this->t('@name format: @date', [
'@name' => $value
->label(),
'@date' => $this->dateFormatter->format(REQUEST_TIME, $machine_name),
]);
}
$form['date_format'] = [
'#type' => 'select',
'#title' => $this
->t('Date format'),
'#options' => $date_formats + [
'custom' => $this->t('Custom'),
'raw time ago' => $this->t('Time ago'),
'time ago' => $this->t('Time ago (with "ago" appended)'),
'raw time hence' => $this->t('Time hence'),
'time hence' => $this->t('Time hence (with "hence" appended)'),
'raw time span' => $this->t('Time span (future dates have "-" prepended)'),
'inverse time span' => $this->t('Time span (past dates have "-" prepended)'),
'time span' => $this->t('Time span (with "ago/hence" appended)'),
],
'#default_value' => isset($this->options['date_format']) ? $this->options['date_format'] : 'small',
];
$form['custom_date_format'] = [
'#type' => 'textfield',
'#title' => $this->t('Custom date format'),
'#description' => $this->t('If "Custom", see <a href="http://us.php.net/manual/en/function.date.php" target="_blank">the PHP docs</a> for date formats. Otherwise, enter the number of different time units to display, which defaults to 2.'),
'#default_value' => isset($this->options['custom_date_format']) ? $this->options['custom_date_format'] : '',
];
// Setup #states for all possible date_formats on the custom_date_format form element.
foreach ([
'custom',
'raw time ago',
'time ago',
'raw time hence',
'time hence',
'raw time span',
'time span',
'raw time span',
'inverse time span',
'time span',
] as $custom_date_possible) {
$form['custom_date_format']['#states']['visible'][] = [
':input[name="options[date_format]"]' => [
'value' => $custom_date_possible,
],
];
}
$form['timezone'] = [
'#type' => 'select',
'#title' => $this->t('Timezone'),
'#description' => $this->t('Timezone to be used for date output.'),
'#options' => [
'' => $this->t('- Default site/user timezone -'),
] + system_time_zones(FALSE, TRUE),
'#default_value' => $this->options['timezone'],
];
foreach (array_merge([
'custom',
], array_keys($date_formats)) as $timezone_date_formats) {
$form['timezone']['#states']['visible'][] = [
':input[name="options[date_format]"]' => [
'value' => $timezone_date_formats,
],
];
}
parent::buildOptionsForm($form, $form_state);
}
In your case, the array returned from defineOptions()
doesn't have the expected values (default or contains) and this is causing the issue you noticed.