File
View source
<?php
use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\WidgetInterface;
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_field_widget_third_party_settings_form().
*/
function autofill_fields_field_widget_third_party_settings_form(WidgetInterface $plugin, FieldDefinitionInterface $field_definition, $form_mode, $form, FormStateInterface $form_state) {
// Skip some fields.
if (in_array($field_definition->getName(), [
'authored_by',
'authored_on',
'title',
'path',
'comment',
])) {
return [];
}
$element = [
'autofill' => [
'#type' => 'checkbox',
'#title' => t('Autofill field'),
'#description' => t('Autofill field for new entities with last used value.'),
'#default_value' => $plugin->getThirdPartySetting('autofill_fields', 'autofill', FALSE),
],
];
return $element;
}
/**
* Implements hook_field_widget_settings_summary_alter().
*/
function autofill_fields_field_widget_settings_summary_alter(&$summary, $context) {
if ($context['widget']->getThirdPartySetting('autofill_fields', 'autofill')) {
$summary[] = t('Autofill enabled.');
}
}
/**
* Implements hook_field_widget_form_alter().
*/
function autofill_fields_field_widget_form_alter(&$element, FormStateInterface $form_state, $context) {
// Only run for logged in users.
if (!($user_id = \Drupal::currentUser()->id())) {
return;
}
$entity = $form_state->getFormObject()
->getEntity();
// Only run for new entities; we don't want to overwrite desired data.
if (!$entity->isNew()) {
return;
}
$plugin = $context['widget'];
// Check that it is enabled for this field.
if (!$plugin->getThirdPartySetting('autofill_fields', 'autofill')) {
return;
}
$field_definition = $context['items']->getFieldDefinition();
$type = $field_definition->getType();
$plugin_id = $plugin->getPluginId();
$values = $plugin->getThirdPartySetting('autofill_fields', 'stored', []);
if (isset($values[$user_id])) {
$entity_type_manager = \Drupal::service('entity_type.manager');
if ($type == 'text_with_summary') {
$element['#default_value'] = $values[$user_id][0]['value'];
$element['#format'] = $values[$user_id][0]['format'];
$element['summary']['#default_value'] = $values[$user_id][0]['summary'];
}
elseif ($type == 'entity_reference') {
$value = isset($values[$user_id]['target_id']) ? $values[$user_id]['target_id'] : $values[$user_id];
if ($plugin_id == 'options_select' || $plugin_id == 'options_buttons') {
$element['#default_value'] = [];
foreach ($value as $reference) {
$element['#default_value'][] = $reference['target_id'];
}
}
elseif ($plugin_id == 'entity_reference_autocomplete') {
if (!$value[$element['target_id']['#delta']]['target_id']) {
return;
}
$element['target_id']['#default_value'] = $entity_type_manager->getStorage($element['target_id']['#target_type'])
->load($value[$element['target_id']['#delta']]['target_id']);
}
elseif ($plugin_id == 'entity_reference_autocomplete_tags') {
$element['target_id']['#default_value'] = [];
foreach ($value as $reference) {
$element['target_id']['#default_value'][] = $entity_type_manager->getStorage($element['target_id']['#target_type'])
->load($reference['target_id']);
}
}
}
elseif ($type == 'decimal') {
if ($plugin_id == 'number') {
$element['value']['#default_value'] = $values[$user_id][$element['value']['#delta']]['value'];
}
}
elseif ($type == 'datetime') {
if ($plugin_id == 'datetime_default') {
$element['value']['#default_value'] = new DrupalDateTime($values[$user_id]);
}
}
else {
var_dump($type);
var_dump($values[$user_id]);
var_dump($element);
}
}
}
/**
* Implements hook_form_alter().
*/
function autofill_fields_form_alter(&$form, FormStateInterface $form_state, $form_id) {
$info = $form_state->getBuildInfo();
if (isset($info['base_form_id']) && in_array($info['base_form_id'], [
'node_form',
'media_form',
])) {
if (isset($form['actions']['publish'])) {
$form['actions']['publish']['#submit'][] = 'autofill_fields_submit';
}
else {
$form['actions']['submit']['#submit'][] = 'autofill_fields_submit';
}
}
}
/**
* Submit function to save field values per entity create/edit action.
*/
function autofill_fields_submit($form, FormStateInterface $form_state) {
if (!($user_id = \Drupal::currentUser()->id())) {
return;
}
// Ensure that the form entity is properly loaded.
if (!($entity = $form_state->getFormObject()
->getEntity())) {
return;
}
//TODO: get real form mode.
$form_mode = 'default';
$entity_form_display = EntityFormDisplay::load($entity->getEntityTypeId() . '.' . $entity->getType() . '.' . $form_mode);
foreach ($entity_form_display->getComponents() as $name => $component) {
if (empty($component['third_party_settings']['autofill_fields']['autofill'])) {
continue;
}
if (!isset($component['third_party_settings']['autofill_fields']['stored'])) {
$component['third_party_settings']['autofill_fields']['stored'] = [];
}
$component['third_party_settings']['autofill_fields']['stored'][$user_id] = $form_state->getValue($name);
if ($component['type'] == 'datetime_default') {
$value = $form_state->getValue($name)[0]['value']
->format('c');
}
else {
$value = $form_state->getValue($name);
}
$component['third_party_settings']['autofill_fields']['stored'][$user_id] = $value;
$entity_form_display->setComponent($name, $component);
}
$entity_form_display->save();
}
Functions
Title | Deprecated | Summary |
---|---|---|
autofill_fields_field_widget_form_alter | Implements hook_field_widget_form_alter(). | |
autofill_fields_field_widget_settings_summary_alter | Implements hook_field_widget_settings_summary_alter(). | |
autofill_fields_field_widget_third_party_settings_form | Implements hook_field_widget_third_party_settings_form(). | |
autofill_fields_form_alter | Implements hook_form_alter(). | |
autofill_fields_submit | Submit function to save field values per entity create/edit action. |