rybosome
rybosome

Reputation: 5136

In Drupal 7, how can I alter the contents of a submitted form before the values are validated?

I would like to do something roughly analogous (but not exactly identical) to the following: I want to create a Person content type, which has an SSN field. I would like to store the SSN field as an integer, but allow the user to input the number as 123-45-6789. This means that before validation triggers, stating that "123-45-6789" is invalid input, I would like to remove the dashes and treat this as an integer.

I've tried to use both a #value_callback function, as well as a non-default validation function. The problem then is that although I can force the value to be validated, the unchanged value is what is passed to the db for insertion, which fails. In example, this means that although I can force "123-45-6789" to be recognized by Drupal as "123456789", the database is still being passed "123-45-6789", which of course fails.

The one obvious solution would be altering this via client side javascript, before the value is even submitted to the webserver. I would strongly prefer to avoid this route.

Upvotes: 0

Views: 3450

Answers (2)

Marius Ilie
Marius Ilie

Reputation: 3323

you should use hook_node_presave(). It allows you to change the values of different fields before they are inserted to the database. Here's the official documentation:

http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_node_presave/7

Hope this can help :)

Upvotes: 1

Clive
Clive

Reputation: 36955

Apologies if I've misunderstood but you should just be able to do something like this:

function my_validation_handler(&$form, &$form_state) {
  if (passes_ssn_validation($form_state['values']['SSN'])) {
    // Changing the value in $form_state here will carry on over to the submission function
    $form_state['values']['SSN'] = convert_to_db_format($form_state['values']['SSN']);
  }
  else {
    form_set_error('SSN', 'The SSN was invalid');
  }
}

Then you'd attach that validation function using $form['#validate'][] = 'my_validation_handler' in either your form build or form_alter function.

Hope that helps

Upvotes: 3

Related Questions