View source
<?php
namespace Drupal\typed_data_widget_test;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\typed_data\Form\SubformState;
use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\State\StateInterface;
use Drupal\Core\TypedData\TypedDataTrait;
use Drupal\typed_data\Widget\FormWidgetManagerTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
class FormWidgetExampleForm extends FormBase {
use FormWidgetManagerTrait;
use TypedDataTrait;
protected $state;
public function __construct(StateInterface $state) {
$this->state = $state;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('state'));
}
public function getFormId() {
return 'typed_data_widget_test_form';
}
public function getExampleContextDefinition($widget_id) {
switch ($widget_id) {
default:
case 'text_input':
return ContextDefinition::create('string')
->setLabel('Example string')
->setDescription('Some example string with max. 8 characters.')
->setDefaultValue('default')
->addConstraint('Length', [
'max' => 8,
]);
case 'textarea':
return ContextDefinition::create('text')
->setLabel('Example text area')
->setDefaultValue("default line one\nline two")
->setDescription('This is the long textarea example description.');
case 'select':
return ContextDefinition::create('filter_format')
->setLabel('Filter format')
->setDescription('Some example selection.');
case 'datetime':
return ContextDefinition::create('datetime_iso8601')
->setLabel('Example datetime')
->setDescription('Some example datetime.');
case 'datetime_range':
return ContextDefinition::create('any')
->setLabel('Example datetime range')
->setDescription('Some example datetime range.');
case 'broken':
return ContextDefinition::create('string')
->setLabel('Example string');
}
}
public function buildForm(array $form, FormStateInterface $form_state, $widget_id = NULL) {
$widget = $this
->getFormWidgetManager()
->createInstance($widget_id);
$context_definition = $this->state
->get('typed_data_widgets.definition');
$context_definition = $context_definition ?: $this
->getExampleContextDefinition($widget_id);
$form_state
->set('widget_id', $widget_id);
$form_state
->set('context_definition', $context_definition);
$data = $this
->getTypedDataManager()
->create($context_definition
->getDataDefinition());
$value = $this->state
->get('typed_data_widgets.' . $widget_id);
$value = isset($value) ? $value : $context_definition
->getDefaultValue();
$data
->setValue($value);
$subform_state = SubformState::createWithParents([
'data',
], $form, $form_state);
$form['data'] = $widget
->form($data, $subform_state);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => 'Submit',
];
$form['actions']['reset'] = [
'#type' => 'submit',
'#value' => 'Reset',
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$context_definition = $form_state
->get('context_definition');
$widget_id = $form_state
->get('widget_id');
$widget = $this
->getFormWidgetManager()
->createInstance($widget_id);
$subform_state = SubformState::createWithParents([
'data',
], $form, $form_state);
$data = $this
->getTypedDataManager()
->create($context_definition
->getDataDefinition());
$widget
->extractFormValues($data, $subform_state);
$violations = $data
->validate();
$widget
->flagViolations($data, $violations, $subform_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$context_definition = $form_state
->get('context_definition');
$widget_id = $form_state
->get('widget_id');
$widget = $this
->getFormWidgetManager()
->createInstance($widget_id);
if (($triggering_element = $form_state
->getTriggeringElement()) && $triggering_element['#id'] == 'edit-reset') {
$this->state
->set('typed_data_widgets.' . $widget_id, NULL);
$this
->messenger()
->addMessage($this
->t('Value reset to default'));
}
else {
$subform_state = SubformState::createWithParents([
'data',
], $form, $form_state);
$data = $this
->getTypedDataManager()
->create($context_definition
->getDataDefinition());
$widget
->extractFormValues($data, $subform_state);
$this->state
->set('typed_data_widgets.' . $widget_id, $data
->getValue());
$this
->messenger()
->addMessage($this
->t('Value saved: %value', [
'%value' => print_r($data
->getValue(), TRUE),
]));
}
}
}