SimplesamlphpCustomAttributesEditForm.php in SimpleSAMLphp Custom Attribute Mapping 8
File
src/Form/SimplesamlphpCustomAttributesEditForm.php
View source
<?php
namespace Drupal\simplesamlphp_custom_attributes\Form;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class SimplesamlphpCustomAttributesEditForm extends FormBase {
protected $mappingConfig;
protected $entityFieldManager;
public function __construct(EntityFieldManagerInterface $entity_field_manager) {
$configFactory = $this
->configFactory();
$this->mappingConfig = $configFactory
->getEditable('simplesamlphp_custom_attributes.mappings');
$this->entityFieldManager = $entity_field_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_field.manager'));
}
public function getFormId() {
return 'simplesamlphp_custom_attributes_edit_form';
}
public function buildForm(array $form, FormStateInterface $form_state, $mapping = NULL) {
$saml_attribute = '';
$field_name = '';
if ($mapping !== NULL) {
$mappings = $this->mappingConfig
->get('mappings');
$saml_attribute = $mappings[$mapping]['attribute_name'];
$field_name = $mappings[$mapping]['field_name'];
}
$options = [
'custom' => $this
->t('Custom'),
];
$fields = $this->entityFieldManager
->getFieldDefinitions('user', 'user');
foreach ($fields as $name => $field) {
if ($field
->getFieldStorageDefinition()
->getProvider() != 'user') {
$options[$name] = $field
->getLabel();
}
}
$form['attribute_name'] = [
'#type' => 'textfield',
'#title' => $this
->t('SAML Attribute'),
'#description' => $this
->t('The name of the SAML attribute you want to sync to the user profile.'),
'#required' => TRUE,
'#default_value' => $saml_attribute,
];
$form['field_name'] = [
'#type' => 'select',
'#title' => $this
->t('User Field'),
'#description' => $this
->t('The user field you want to sync this attribute to.'),
'#required' => TRUE,
'#options' => $options,
'#default_value' => $field_name,
];
$form['mapping_id'] = [
'#type' => 'hidden',
'#value' => $mapping,
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Submit'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$mappings = $this->mappingConfig
->get('mappings');
if ($mappings && !$form_state
->getValue('mapping_id')) {
foreach ($mappings as $mapping) {
if ($mapping['attribute_name'] === $form_state
->getValue('attribute_name') && $mapping['field_name'] === $form_state
->getValue('field_name')) {
$form_state
->setErrorByName('field_name', $this
->t('This SAML attribute has already been mapped to this field.'));
}
}
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$mappings = $this->mappingConfig
->get('mappings');
$mapping = [
'attribute_name' => $form_state
->getValue('attribute_name'),
'field_name' => $form_state
->getValue('field_name'),
];
$mapping_id = $form_state
->getValue('mapping_id');
if (is_numeric($mapping_id)) {
$mappings[$mapping_id] = $mapping;
}
else {
$mappings[] = $mapping;
}
$this->mappingConfig
->set('mappings', $mappings)
->save();
$form_state
->setRedirect('simplesamlphp_custom_attributes.list');
}
}