web-dev-qa-db-ja.com

検証エラーを送信ボタンに制限するにはどうすればよいですか?

Hook_form_alterを使用して、ワークフロー送信ボタンに検証の制限エラーを追加しようとしました。

フォームの変更では、2つのform_idを取得しています。1つは通常のノード追加form_idで、もう1つはワークフロー状態form_idです。

$form['actions']['workflow_course_status_save_as_draft']['#limit_validation_errors'] > = array(array('field_sample_course'));
5
Sri Harsha

私もまったく同じことをしましたが、#limit_validation_errorsの使い方が間違っていました。

これが失敗する理由は、#limit_validation_errorsを適切に使用していないためです。この問題はワークフローとは関係ありません。

フォームの検証中に、このプロパティが設定されている場合(検証エラーは制限されています)、Drupalコアはフォームの状態から検証されていないフォームの値を削除するため、検証に合格した値のみが残ります。コールバックを送信します。

Drupal 8: http://cgit.drupalcode.org/drupal/tree/core/lib/Drupal/Core/Form/FormValidator.php#n147 の場合

Drupal 7: http://cgit.drupalcode.org/drupal/tree/includes/form.inc?h=7.x#n119 の場合

私の解決策は、すべての検証の最後に実行されるカスタム検証を追加し、フォーム関連のすべてのエラーを削除することでした。

/**
 * Removes all validation errors that could happen when saving a draft
 *
 * @param $form
 * @param $form_state
 */
function my_custom_draft_validation($form, &$form_state) {
  $errors = form_get_errors();

  if (!empty($errors)) {
    $messages = drupal_get_messages('error', TRUE);

    // Remove error messages originated during the form validation
    foreach ($messages['error'] as $error) {
      if (!in_array($error, $errors)) {
        drupal_set_message('error', $error);
      }
    }

    // Remove all form errors
    form_clear_error();
  }
}
3
Nico

#limit_validation_errorsがクリックされたボタンに設定されている場合、ボタンは#submitプロパティも定義する必要があります(空の配列に設定される場合があります)。

リンクを参照してください https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Form!FormState.php/function/FormState%3A%3AsetErrorByName/8.2.x

1
developer