it-swarm.com.de

Wie beschränke ich Validierungsfehler auf Übermittlungsschaltflächen?

Mit hook_form_alter habe ich versucht, der Schaltfläche zum Senden von Workflows Fehler bei der Limit-Validierung hinzuzufügen.

In form alter erhalte ich zwei form_id, eine ist normaler Knoten add form_id und eine andere ist Workflow-Status form_id.

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

Ich habe genau das Gleiche getan, aber wir haben uns bei der Verwendung von #limit_validation_errors geirrt.

Der Grund, warum dies fehlschlägt, ist, dass wir #limit_validation_errors nicht richtig verwenden. Dieses Problem hat nichts mit dem Workflow zu tun.

Wenn während der Formularvalidierung diese Eigenschaft festgelegt ist (Validierungsfehler sind begrenzt), entfernt Drupal Core entfernt alle nicht validierten Formularwerte aus dem Formularstatus, sodass nur Werte übrig bleiben, für die die Validierung bestanden wurde Rückrufe einreichen.

Für Drupal 8: http://cgit.drupalcode.org/drupal/tree/core/lib/Drupal/Core/Form/FormValidator.php#n147

Für Drupal 7: http://cgit.drupalcode.org/drupal/tree/includes/form.inc?h=7.x#n119

Meine Lösung bestand darin, eine benutzerdefinierte Validierung hinzuzufügen, die am Ende aller Validierungen ausgeführt wird, und dort alle formularbezogenen Fehler zu entfernen:

/**
 * 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

Wenn #limit_validation_errors für eine angeklickte Schaltfläche festgelegt ist, muss die Schaltfläche auch eine # submit-Eigenschaft definieren (kann auf ein leeres Array festgelegt werden).

Bitte beziehen Sie sich auf den Link https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Form!FormState.php/function/FormState%3A%3AsetErrorByName/8.2.x

1
developer