В Drupal 7, как я могу изменить содержимое отправленной формы перед проверкой значений? - PullRequest
0 голосов
/ 10 ноября 2011

Я хотел бы сделать что-то примерно аналогичное (но не совсем идентичное) следующему: я хочу создать тип контента Person, который имеет поле SSN.Я хотел бы сохранить поле SSN как целое число, но разрешить пользователю вводить число как 123-45-6789.Это означает, что перед началом проверки правильности, заявив, что «123-45-6789» является неверным вводом, я хотел бы удалить тире и трактовать это как целое число.

Я пытался использовать оба #value_callbackфункция, а также функция проверки не по умолчанию.Проблема в том, что, хотя я могу принудительно проверить значение, неизменное значение - это то, что передается в БД для вставки, что не удается.Например, это означает, что, хотя я могу заставить Drupal распознавать «123-45-6789» как «123456789», базе данных все еще передается «123-45-6789», что, конечно, не удается.

Единственным очевидным решением было бы изменить это через клиентский JavaScript, прежде чем значение будет отправлено на веб-сервер.Я бы предпочел избежать этого маршрута.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Извините, если я неправильно понял, но вы должны просто сделать что-то вроде этого:

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

Затем вы присоедините эту функцию проверки с помощью $form['#validate'][] = 'my_validation_handler' либо к вашей сборке формы, либо к функции form_alter.

Надеюсь, что поможет

1 голос
/ 11 ноября 2011

вы должны использовать hook_node_presave().Это позволяет вам изменять значения различных полей, прежде чем они будут вставлены в базу данных.Вот официальная документация:

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

Надеюсь, это поможет:)

...