it-swarm.com.de

Wie kann ich die Standardüberprüfungsfunktionen eines Formulars deaktivieren?

Ich habe meinen eigenen Validierungshandler erstellt:

/**
 * Validate handler.
 */
function my_module_validate($form, &$form_state) {
  $values = $form_state['values'];
  if ($values['type'] == 'line') {
    form_set_error('type', t('MY VALIDATION.'));
  }
}

welches von einem Schaltflächenelement aufgerufen wird:

'preview' => array(
  '#type' => 'button',
  '#value' => t('Preview'),
  '#validate' => array('my_module_validate'),
  '#weight' => 8,
),

welches dieses Ergebnis beim Einreichen eines leeren Formulars erzeugt:

enter image description here

Die einzige Validierungsfunktion, die ich ausführen möchte, ist meine eigene, von meinem eigenen Handler - die letzte Fehlermeldung -, aber alle Standardvalidierungsfunktionen werden auch ausgeführt. Wie deaktiviere ich diese?

Vielen Dank.


PDATE :

Die von @superdrupal bereitgestellte Lösung sieht "korrekt" aus, aber ich kann sie nicht zum Laufen bringen. Hier ist mein Code:

'map' => array(
  '#type' => 'select',
  '#title' => t('Map'),
  '#required' => TRUE,
  '#options' => array(
    'map1' => t('Map 1'),
    'map2' => t('Map 2'),
  ),
  '#element_validate' => array('my_module_map_validate'),
),

...

// Buttons/link.
'preview' => array(
  '#type' => 'button',
  '#value' => t('Preview'),
  '#limit_validation_errors' => array(array('map')),
),

...

/**
 * Map validate handler.
 */
function my_module_map_validate($element, &$form_state, $form) {
  drupal_set_message('Hello world!');
  if (empty($element['#value'])) {
    form_error($element, t('xyz'));
  }
}

anstatt den Fehler 'xyz' bei der Untertreibung eines leeren Formulars auszulösen, wird folgendes Ergebnis erzielt:

enter image description here

3
dbj44

Gemäß Funktion form_set_error : "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)." Ihre Vorschau-Schaltfläche sollte also lauten:

'preview' => array(
  '#type' => 'button',
  '#value' => t('Preview'),
  '#limit_validation_errors' => array(array('map')),
  '#submit' => array(),
),
4
Colin Shipton

Mit dem FAPI können Sie dies tun, ohne das Array $ _SESSION messages mit # limit_validation_errors zu ändern.

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'my_form_id') {
    $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#title' => t('Some title'),
      '#required' => TRUE,
      '#element_validate' => array('my_element_validate'),
    );
    $form['preview'] = array(
      '#type' => 'button',
      '#value' => t('Preview'),
      '#limit_validation_errors' => array(array('my_textfield')),
    );
  }
}

/**
 * My textfield element validate handler.
 */
function my_element_validate($element, &$form_state, $form) {
  // Check the value here.
  if ($element['#value'] == '123') {
    form_error($element, t('123 not allowed!'));
  }
}
2
superdrupal

Ich habe einen Weg gefunden, der funktioniert:

$form_required_marker = array('#theme' => 'form_required_marker');
$required = ' ' . drupal_render($form_required_marker);

'map' => array(
  '#type' => 'select',
  '#title' => t('Map') . $required,
  // '#required' => TRUE,
  '#options' => array(
    '' => t('- Select -'),
    'map1' => t('Map 1'),
    'map2' => t('Map 2'),
  ),
),

... geben Sie dann mit #validate einen benutzerdefinierten Validierungshandler an.

1
dbj44

Sie sehen einen anderen Validierungsfehler, da Ihr Validierungsrückruf nach dem Auftreten des Fehlers aufgerufen wird. Eine Lösung besteht darin, form_clear_error() aufzurufen, um frühere Fehler zu löschen und den neuen zu setzen. Oder deaktivieren Sie einen bestimmten Elementvalidierungsfehler in Ihrem Elementvalidierungsrückruf, z.

/**
 * Implements callback for #element_validate Form API.
 */
function my_module_map_validate($element, &$form_state, $form) {
  if (empty($element['#value'])) {
    // Clear previous validation error for this element.
    $errors = &drupal_static('form_set_error', array());
    $err_key = $element['#field_name'] . '][' . LANGUAGE_NONE;
    if (array_key_exists($err_key, $errors)) {
      unset($errors[$err_key]);
    }
    form_error($element, t('xyz'));
    return;
  }
}
1
kenorb

In der Funktion hook_form_alter () können Sie die Standardvalidierungsregeln deaktivieren und dann Ihre Validierungsfunktion als Validierungshandler angeben

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'YOUR FORM ID') {
    unset($form['#validate']);
    $form['#validate'] = array('my_module_validate');
  }
}

Bitte beachten Sie, dass durch diese Änderung die Formularvalidierungen vollständig aus allen Feldern entfernt werden und Sie die Validierung aller Felder einzeln durchführen müssen.

0
Gouli Mahesh

Ich habe das Problem teilweise mit diesem benutzerdefinierte Funktion gelöst - aber es ist nicht perfekt.

Es funktioniert perfekt beim ersten Validierungsfehler. Wenn ich jedoch einen weiteren Validierungsfehler erstelle, wird eine leere Fehlermeldung und dann der folgende Fehler angezeigt:

Hinweis: Undefinierter Offset: 0 in theme_status_messages ().

Code:

/**
 * Validate handler.
 */
function my_module_validate($form, &$form_state) {
  if ($type = $form_state['values']['type']) {
    switch ($type) {
      case 'map':
        $names = array(
          'line_sub_type',
          'margin_top',
          'margin_right',
          'margin_bottom',
          'margin_left',
          'x_axis_label',
          'y_axis_label',
          'date_time_format',
        );
        break;
      case 'line':
        $names = array(
          'map',
          'land_color',
          'boundary_width',
          'color_key',
          'lighter_end',
          'darker_end',
          'units_format',
        );
        break;
      }  
    foreach ($names as $name) {
      my_module_form_unset_error($name);
    }
  }
}

/**
 * Clear a form element error.
 */
function my_module_form_unset_error($name) {
  $errors = &drupal_static('form_set_error', array());
  $removed_messages = array();
  if (isset($errors[$name])) {
    $removed_messages[] = $errors[$name];
    unset($errors[$name]);
  }
  $_SESSION['messages']['error'] = array_diff($_SESSION['messages']['error'], $removed_messages);
  if (empty($_SESSION['messages']['error'])) {
    unset ($_SESSION['messages']['error']);
  }
}
0
dbj44