2010-03-04 23 views
13

Ich versuche, einige Drupal 6 Form Code zu ändern und einige native Form Validierung zu integrieren. Der Code sieht so aus, aber die Validierung funktioniert nicht. Ich komme nie in Funktion thisFormName_form_validate. Irgendwelche Drupalianer haben einige gute Ideen?Drupal Formular Validierung funktioniert nicht für mich

function thisFormName_form_alter(&$form, $form_state, $form_id) { 
    $form['email_address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Enter your email address (optional)'), 
    '#default_value' => $object['email_address'], 
    '#weight' => 4, 
    '#size' => 60, 
    '#maxlength' => 128, 
    '#description' => t('Enter email address.'), 
); 


function thisFormName_form_validate($node, &$form) { 
    if ($form_state['values']['email_address'] == '') 
    { 
    form_set_error('', t('Email must be valid format if entered.')); 

    } 
} 

Antwort

13

Da Sie mit dem Formular ändern, so dass Sie das Formular nicht selbst erstellen, sollten Sie die Validierung Handler selbst hinzufügen:

function myModule_form_alter(&$form, $form_state, $form_id) { 
    $form['email_address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Enter your email address (optional)'), 
    '#default_value' => $object['email_address'], 
    '#weight' => 4, 
    '#size' => 60, 
    '#maxlength' => 128, 
    '#description' => t('Enter email address.'), 
); 
    $form['#validate'][] = 'my_validation_function'; 
} 


function my_validation_function(&$form, &$form_state) { 
    if ($form_state['values']['email_address'] == '') { 
    form_set_error('', t('Email must be valid format if entered.')); 
    } 
} 

Drupal wird standardmäßig nur verwenden, um die Validierung, die definiert ist wie die form_name + _validate. Dies ist nicht der Fall, da Sie hook_form_alter verwenden.

+3

+1 - Haben Sie nicht bemerkt hatte bereits beantwortet - sorry für redundante Entsendung von ähnlichen Antwort. –

5

EDIT: Grundsätzlich die gleiche Antwort wie googletorps. Habe es nicht bemerkt, während ich meine gepostet habe. Ich lasse es hier für die alternative Erklärung, aber seine ist richtig und war zuerst (+1).


Es ist etwas faul an Ihrer Funktion Namensgebung:

  • Wie bei allen Haken Implementierungen Ihre hook_form_alter Funktion soll nach dem benutzerdefinierten Modul genannt wird, nicht nach der Form (zB yourModule_form_alter), in In diesem Fall würde es für alle Formen auslösen. Wenn (wie es aussieht) Sie nur in ein bestimmtes Formular einhaken möchten, verwenden Sie hook_form_FORM_ID_alter, ersetzen Sie "Hook" mit Ihrem Modulnamen und "FORM_ID" mit der ID (Name) des Formulars, das Sie bearbeiten möchten.

  • Die Rückmeldungsfunktionsrückrufe für ein Formular werden als Array von Funktionsnamen in $form['#validate'] aufgelistet. Es ist nur eine bequeme Verknüpfung für Formulare von Ihnen generiert, die Sie nicht explizit hinzufügen müssen, aber verwenden Sie eine Funktion nach dem Formular benannt, ein '_validate' am Ende hinzufügen. In Ihrem Fall ändern Sie ein Formular, das von einem anderen Modul kommt. Daher müssen Sie die Validierungsfunktion explizit hinzufügen.

So sollte der Code wie folgt aussehen:

function yourModuleName_theFormID_form_alter(&$form, $form_state, $form_id) { 
    $form['email_address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Enter your email address (optional)'), 
    '#default_value' => $object['email_address'], 
    '#weight' => 4, 
    '#size' => 60, 
    '#maxlength' => 128, 
    '#description' => t('Enter email address.'), 
); 
    // Add custom validation callback 
    $form['#validate'][] = 'yourModuleName_theFormID_validate'; 


function yourModuleName_theFormID_validate(&$form, &$form_state) { 
    if ($form_state['values']['email_address'] == '') { 
    form_set_error('', t('Email must be valid format if entered.')); 
    } 
} 
Verwandte Themen