View source
<?php
namespace Drupal\subscriptions\Form;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
class IntervalsForm extends ConfigFormBase {
public function getFormId() {
return 'subscriptions_intervals';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this
->config('subscriptions.settings');
$form['intervals'] = [
'#type' => 'textarea',
'#title' => $this
->t('Intervals'),
'#description' => $this
->t('Each interval is defined by a single line in the format
<em>seconds|label</em>. Adding a new interval is simple, but removing an
interval that is already in use is not recommended.'),
'#placeholder' => "1|As soon as possible\n900|Every 15 minutes",
'#default_value' => $config
->get('intervals'),
'#element_validate' => [
[
$this,
'validateIntervals',
],
],
];
return parent::buildForm($form, $form_state);
}
public function validateIntervals($element, FormStateInterface $form_state, $form) {
$intervals = explode("\n", $form_state
->cleanValues()
->getValue('intervals', ''));
$intervals = array_filter($intervals);
$pattern = '/^([0-9]+)\\|(.+)$/';
$errors = [];
foreach ($intervals as &$interval) {
$interval = trim($interval);
if (empty($interval)) {
continue;
}
$match = preg_match($pattern, $interval);
if ($match != TRUE) {
$errors[] = $interval;
}
}
if (!empty($errors)) {
$error_message = $this
->formatPlural(count($errors), 'Invalid format: @interval', 'Invalid formats: @interval', [
'@interval' => implode(', ', $errors),
]);
$form_state
->setError($element, $error_message);
}
$intervals = array_values(array_filter($intervals));
$form_state
->setValueForElement($element, implode("\n", $intervals));
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$form_state
->cleanValues();
$config = $this
->config('subscriptions.settings');
$config
->set('intervals', $form_state
->getValue('intervals', []));
$config
->save();
}
protected function getEditableConfigNames() {
return [
'subscriptions.settings',
];
}
}