2014-07-22 43 views
0

我已經創建了一個自定義模塊,用於創建一個頁面。在該頁面中,我加載用於創建新內容的現有表單並添加密碼字段。在我的加載形式中,我有一個電子郵件字段。我希望在提交表單之前檢查是否存在一個用戶,該用戶的用戶名是在電子郵件字段中找到的值以及密碼字段提供的密碼。在這裏,我有3個場景:如何在drupal中插入表單提交

  1. 如果用戶不存在,我拿的電子郵件和密碼,並創建一個帳戶,然後創建內容
  2. 該用戶是否存在,密碼是否正確,我創建的內容
  3. 如果用戶存在,但密碼不正確,我停止表單提交

我的問題是我不知道如何停止的形式提交(我指的情景3號)。任何建議都最aprerciated

這裏有翻頁功能回調:

function add_new_article_simple_page() { 
    module_load_include('inc', 'node', 'node.pages'); 
    $node_form = new stdClass; 
    $node_form->type = 'announcement'; 
    $node_form->language = LANGUAGE_NONE; 
    $form = drupal_get_form('announcement_node_form', $node_form); 
    return $form; 
} 

的ALTER功能的嵌入式密碼字段:

function add_new_article_form_alter(&$form, &$form_state, $form_id){ 
    if($form_id=='announcement_node_form') 
    { 
    $form['#after_build'][] = 'add_new_article_after_build'; 
    $form['account_password'] = array(
     '#title' => 'Parola', 
     '#type' => 'password', 
     '#required' => TRUE, 
    ); 
    $form['#submit'][] = 'add_new_article_form_submit'; 

    return $form; 
    } 
} 

和形式提交功能

function add_new_article_form_submit($form, &$form_state){ 
    $email=$form_state['values']['field_email']['und'][0]['value']; 
    $password=$form_state['values']['account_password']; 
    //check if the email even exists 
    if(!db_query("SELECT COUNT(*) FROM {users} WHERE name = '".$email."';")->fetchField()) 
    //create the new account 
    {  
    $edit = array(
     'name' => $email, 
     'pass' => $password, 
     'mail' => $email, 
     'init' => $email, 
     'roles' => array('4' => 'standard user'), 
     'status' => 0, 
     'access' => REQUEST_TIME, 
    ); 
    $loc_var=user_save(drupal_anonymous_user(), $edit); 
    $GLOBALS['new_user']=$loc_var->uid;  
    } 
    else 
    { 
    //check if username + password are valid combination 
    if($uid = user_authenticate($email,$password)) 
     //log in user after account creation 
    else 
     //this is where I want to interrupt the submission of the form 
     form_set_error('account_password', 'Parola nu este buna pentru acest email.'); 
    } 
} 

UPDATE

我不好,我忘了解釋當我測試第三種情況時會發生什麼。在創建內容,頁面跳轉到該頁面內容,這是出現的錯誤消息,其中

更新2 我按照D34dman建議,並寫了一個簡單的驗證功能應該始終給出一個錯誤。問題在於內容仍然受到限制和保存。它似乎並不甚至稱hook_form_validate ..下面是函數:

function add_new_article_form_validate($form, &$form_state) 
{ 
    $email=$form_state['values']['field_email']['und'][0]['value']; 
    $password=$form_state['values']['account_password']; 
    form_set_error('account_password',t('The form is being validated.'.$email.' and '.$password)); 
} 

謝謝 克里斯提

+0

從技術上講,您無法「停止」表單提交。在PHP實際執行代碼的時候,表單已經提交給服務器並完全處理成$ _POST/$ _ GET/etc ... –

+0

Ooooook,所以我應該嘗試在hook_form_validate中設置它? – Cristi

回答

1

這不是一個好的做法,以防止從形式提交。而應該像下面那樣使用hook_form_validate。

/** 
* Implements hook_form_validate(). 
*/ 
function add_new_article_form_validate(&$form, &$form_state) { 
    // Validate email address. 
    $mail = $form_state['values']['personal']['email_address']; 
    $password=$form_state['values']['account_password']; 
    if (!valid_email_address($mail)) { 
    form_set_error('personal][email_address', t('The email address appears to be invalid.')); 
    } 
    else if (user_load_by_mail($mail)) { 
    if($uid = user_authenticate($email,$password)) { 
     $account = user_load($uid); 
     // Check if the user would have permission to create content after login!!! 
     // not asked by OP, but just a suggestion. 
     if (!user_access($string, $account)) { 
     form_set_error('personal][email_address', t('You donot have sufficient priviledge to create the content.')); 
     } 
    } 
    else { 
     form_set_error('personal][email_address', t('Email or password incorrect.')); 
    } 
    } 
} 

注意:請不要嘗試在驗證函數中創建用戶。在表單提交功能中做到這一點。由於可能有其他驗證器可能會失敗,因此您可能不確定您的表單有多少次會提交驗證。

+0

hook_form_validate是否也適用於導入的表單?我的意思是,如果驗證失敗,加載的表單也不會通過驗證? – Cristi

+0

通過導入的形式,你的意思是使用hook_form_alter?改變的形式,如果是的話,那麼你可以在'$ form ['#validate'] [] =「your_validate_callback_name」;'在你的hook_form_alter中添加額外的驗證函數。 (就像你在其他答案中提到的那樣)。 – D34dman

+0

是的,那正是這種情況。無論如何感謝您的幫助,建議非常有用 – Cristi

0

終於找到了!我忘了添加

$form["#validate"][] = 'add_new_article_form_validate'; 

我的hook_form_alter函數。感謝您對hook_form_validate提供的幫助和建議:)