View source
<?php
namespace Drupal\field_validation\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\field_validation\ConfigurableFieldValidationRuleInterface;
use Drupal\field_validation\FieldValidationRuleSetInterface;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Drupal\Core\Entity\FieldStorageConfig;
abstract class FieldValidationRuleFormBase extends FormBase {
protected $fieldValidationRuleSet;
protected $fieldValidationRule;
public function getFormId() {
return 'field_validation_rule_form';
}
public function buildForm(array $form, FormStateInterface $form_state, FieldValidationRuleSetInterface $field_validation_rule_set = NULL, $field_validation_rule = NULL, $field_name = '') {
$this->fieldValidationRuleSet = $field_validation_rule_set;
try {
$this->fieldValidationRule = $this
->prepareFieldValidationRule($field_validation_rule);
} catch (PluginNotFoundException $e) {
throw new NotFoundHttpException("Invalid field_validation_rule id: '{$field_validation_rule}'.");
}
$request = $this
->getRequest();
if (!$this->fieldValidationRule instanceof ConfigurableFieldValidationRuleInterface) {
throw new NotFoundHttpException();
}
$form['uuid'] = [
'#type' => 'hidden',
'#value' => $this->fieldValidationRule
->getUuid(),
];
$form['id'] = [
'#type' => 'hidden',
'#value' => $this->fieldValidationRule
->getPluginId(),
];
$form['title'] = [
'#type' => 'textfield',
'#title' => $this
->t('Field Validation Rule title'),
'#default_value' => $this->fieldValidationRule
->getTitle(),
'#required' => TRUE,
];
$entity_type_id = $this->fieldValidationRuleSet
->getAttachedEntityType();
$bundle = $this->fieldValidationRuleSet
->getAttachedBundle();
$field_options = array(
'' => $this
->t('- Select -'),
);
$baseFieldDefinitions = \Drupal::service('entity_field.manager')
->getBaseFieldDefinitions($entity_type_id);
foreach ($baseFieldDefinitions as $base_field_name => $base_field_definition) {
$field_options[$base_field_name] = $base_field_definition
->getLabel();
}
$fieldDefinitions = \Drupal::service('entity_field.manager')
->getFieldDefinitions($entity_type_id, $bundle);
foreach ($fieldDefinitions as $fieldname => $field_definition) {
if (!empty($field_definition
->getTargetBundle())) {
$field_options[$fieldname] = $field_definition
->getLabel();
}
}
$default_field_name = $this->fieldValidationRule
->getFieldName();
if (!empty($field_name)) {
$default_field_name = $field_name;
}
$user_input = $form_state
->getUserInput();
$default_field_name = isset($user_input['field_name']) ? $user_input['field_name'] : $default_field_name;
$form['field_name'] = [
'#type' => 'select',
'#title' => $this
->t('Field name'),
'#options' => $field_options,
'#default_value' => $default_field_name,
'#required' => TRUE,
'#ajax' => [
'callback' => [
$this,
'updateColumn',
],
'wrapper' => 'edit-field-name-wrapper',
'event' => 'change',
],
];
$default_column = $this->fieldValidationRule
->getColumn();
$default_column = isset($user_input['column']) ? $user_input['column'] : $default_column;
$column_options = $this
->findColumn($default_field_name);
if (!in_array($default_column, $column_options)) {
$default_column = "";
}
$form['column'] = [
'#type' => 'select',
'#title' => $this
->t('Column of field'),
'#options' => $column_options,
'#default_value' => $default_column,
'#required' => TRUE,
'#prefix' => '<div id="edit-field-name-wrapper">',
'#suffix' => '</div>',
'#validated' => TRUE,
];
$form['data'] = $this->fieldValidationRule
->buildConfigurationForm([], $form_state);
$form['error_message'] = [
'#type' => 'textfield',
'#title' => $this
->t('Error message'),
'#default_value' => $this->fieldValidationRule
->getErrorMessage(),
'#required' => TRUE,
'#maxlength' => 255,
];
$form['data']['#tree'] = TRUE;
$form['weight'] = [
'#type' => 'hidden',
'#value' => $request->query
->has('weight') ? (int) $request->query
->get('weight') : $this->fieldValidationRule
->getWeight(),
];
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#button_type' => 'primary',
];
$form['actions']['cancel'] = [
'#type' => 'link',
'#title' => $this
->t('Cancel'),
'#url' => $this->fieldValidationRuleSet
->toUrl('edit-form'),
'#attributes' => [
'class' => [
'button',
],
],
];
return $form;
}
public function updateColumn($form, FormStateInterface $form_state) {
return $form['column'];
}
protected function findColumn($field_name) {
$column_options = [
'' => $this
->t('- Select -'),
];
if (empty($field_name)) {
return $column_options;
}
$entity_type_id = $this->fieldValidationRuleSet
->getAttachedEntityType();
$baseFieldDefinitions = \Drupal::service('entity_field.manager')
->getBaseFieldDefinitions($entity_type_id);
$schema = [];
if (isset($baseFieldDefinitions[$field_name])) {
$field_info = $baseFieldDefinitions[$field_name];
$schema = $field_info
->getSchema();
}
else {
$field_info = \Drupal\field\Entity\FieldStorageConfig::loadByName($entity_type_id, $field_name);
$schema = $field_info
->getSchema();
}
if (!empty($schema['columns'])) {
$columns = $schema['columns'];
foreach ($columns as $key => $value) {
$column_options[$key] = $key;
}
}
return $column_options;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$data = $form_state
->getValue('data');
if (empty($data)) {
$data = [];
}
$field_validation_rule_data = (new FormState())
->setValues($data);
$this->fieldValidationRule
->validateConfigurationForm($form, $field_validation_rule_data);
$form_state
->setValue('data', $field_validation_rule_data
->getValues());
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_state
->cleanValues();
$field_validation_rule_data = (new FormState())
->setValues($form_state
->getValue('data'));
$this->fieldValidationRule
->submitConfigurationForm($form, $field_validation_rule_data);
$form_state
->setValue('data', $field_validation_rule_data
->getValues());
$this->fieldValidationRule
->setTitle($form_state
->getValue('title'));
$this->fieldValidationRule
->setWeight($form_state
->getValue('weight'));
$this->fieldValidationRule
->setFieldName($form_state
->getValue('field_name'));
$this->fieldValidationRule
->setColumn($form_state
->getValue('column'));
$this->fieldValidationRule
->setErrorMessage($form_state
->getValue('error_message'));
if (!$this->fieldValidationRule
->getUuid()) {
$this->fieldValidationRuleSet
->addFieldValidationRule($this->fieldValidationRule
->getConfiguration());
}
else {
$this->fieldValidationRuleSet
->deleteFieldValidationRule($this->fieldValidationRule);
$this->fieldValidationRuleSet
->addFieldValidationRule($this->fieldValidationRule
->getConfiguration());
}
$this->fieldValidationRuleSet
->save();
$this
->messenger()
->addMessage($this
->t('The rule was successfully applied.'));
$form_state
->setRedirectUrl($this->fieldValidationRuleSet
->toUrl('edit-form'));
}
protected abstract function prepareFieldValidationRule($field_validation_rule);
}