Bättre validering på formulär?

Events happening in the community are now at Drupal community events on www.drupal.org.
ChristianP's picture

Tjena, jag har ett litet problem. Jag har gjort ett kontaktformulär med hjälp av CCK (och skickar det med Rules). Problemet är att jag skulle vilja ha bättre validering på fälten som finns uppskrivna, just nu har jag de vanliga:

Namn, Epost, Telefonnummer och Godkänd Villkor.

Alla är obligatoriska, men eftersom jag kör att fälten har ett "pre-populerat" värde och använder jquery för att få bort texten när man markerar textfälten så valideras det ju att det något redan är ifyllt - och man får ingen indikation att t.ex. "Du måste fylla i Namn".

Det bästa vore väl om man kunde ha någon slags if-sats som säger "If textfield value == "Namn", don't send" nämen, ni förstår. Tyvärr kan jag ingen programmering, någon som vet nån bra modul för mitt ändamål? Hmm, vid närmare eftertanke så kanske man kan fixa detta med Rules? :O Men kan man få en "error-class" dårå så man kan styla den röd?

Comments

Webform?

adamevertsson's picture

Kan inte Rules så bra så att jag kan säga att det går att lösa det med den modulen, men jag undrar om det finns någon orsak till att du inte använder Webform. Där kan du ju ställa in det mesta när det gäller mejlskickning.




✄-----------------------------------------------------
Adam Evertsson - Came for the code, stayed for the community!

Det är för att jag använder

ChristianP's picture

Det är för att jag använder taxonomier, och det fungerar inte med Webform, för det går inte att ha t.ex. CCK (Content Taxonomy). Men jag löste det med en egenskriven modul som checkar efter värdet. Dock vet jag inte hur jag kollar så att man måste skriva "@" i E-postfältet, provade t.ex.:

<?php
if($form_state['values']['field_epost'][0]["value"] == "Ange e-post" || "")
{
     
form_set_error('field_epost', t('Skriv en giltig e-post.'));
   }
else if (
$form_state['values']['field_epost'][0]["value"] != "@")
    {
     
form_set_error('field_epost', t('Skriv en giltig e-post.'));
   }
?>

Men fältet blir rött då om jag skriver t.ex. hej@hotmail.com skumt nog... :/ Och nej, jag är inte duktig på PHP, så har säkert gjort fel.

Lite beroende på vad du vill

Cristobal Wetzig's picture

Lite beroende på vad du vill göra kan du använda

<?php
valid_email_address
($mail)
?>

men då kontrollerar du tex inte att mailet redan finns i databasen.

Då vill du göra något i denna stil:

<?php
  $mail
= trim($form_state['values']['mail']);
 
form_set_value($form['mail'], $mail, $form_state);

 
// Validate the e-mail address, and check if it is taken by an existing user.
 
if ($error = user_validate_mail($form_state['values']['mail'])) {
   
form_set_error('mail', $error);
  }
  elseif ((bool)
         
db_select('users')->
         
fields('users', array('uid'))->
         
condition('mail', db_like($form_state['values']['mail']), 'LIKE')->
         
range(0, 1)->
         
execute()->
         
fetchField()) {
   
form_set_error('mail', t('The e-mail address %email is already taken.', array('%email' => $form_state['values']['mail'])));
  }
?>

Nah, jag behöver inte kolla

ChristianP's picture

Nah, jag behöver inte kolla om adressen redan finns då detta är bara ett kontaktformulär, ingen registreringsprocess. Men jag vill helst inte att mailet ska kunna skickas om inte E-postfältet innehåller ett snabel-a. I annat fall får jag väl tanka modulen E-mail field och lägga in i stället, men det känns så mycket jobb när jag bara kanske kan lägga in en till rad av PHP så är problemet löst.

Det kan du! använd bara en

Cristobal Wetzig's picture

Det kan du! använd bara en del av koden ovan:

I ditt fall blir det

<?php
if ($error = user_validate_mail($form_state['values']['field_epost'][0]["value"])) {
   
form_set_error('mail', $error);
  }
?>

Nice, det fungerade. Enda

ChristianP's picture

Nice, det fungerade. Enda problemet var att den ger ingen "error"-class så fältet blir inte rött, och jag vill helst inte köra $messages-variabeln, passar inte i formuläret. Kan man sätta dit någon slags "set_class" eller nåt, det sker ju automatiskt med "form_set_error" antar jag? Konstigt.

jag var lite slarvig, testa

Cristobal Wetzig's picture

jag var lite slarvig, testa detta

<?php
if ($error = user_validate_mail($form_state['values']['field_epost'][0]["value"])) {
   
form_set_error('field_epost', $error);
  }
?>

Mycket bättre! Tackar. Är det

ChristianP's picture

Mycket bättre! Tackar. Är det "user_validate_mail" som fixar någon preg_match med alla olika tecken? Typ att man måste ha @ och sen en .(com, se,net)