Implements hook_field_widget_form_alter().

File

./autofill_fields.module, line 40

Code

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);
        }
    }
}