0

1 つのページを作成するカスタム モジュールを作成しました。そのページで、新しいコンテンツを作成するための既存のフォームを読み込み、パスワード フィールドも追加します。読み込まれたフォームには、メール フィールドがあります。フォームを送信する前に、ユーザー名を持つユーザーが存在するかどうかを確認したいと思います。ユーザー名は、電子メール フィールドで見つかった値と、パスワード フィールドで提供されたパスワードです。ここに 3 つのシナリオがあります。

  1. ユーザーが存在しない場合は、メールとパスワードを取得してアカウントを作成し、コンテンツを作成します
  2. ユーザーが存在し、パスワードが正しい場合、コンテンツを作成します
  3. ユーザーは存在するがパスワードが正しくない場合、フォームの送信を停止します

私の問題は、フォームの送信を停止する方法がわからないことです (シナリオ番号 3 を参照しています)。どんな提案も最も高く評価されています

ページ関数のコールバックは次のとおりです。

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;
}

パスワードフィールドを挿入するための変更機能:

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.');
  }
}

アップデート

3 番目のシナリオをテストするとどうなるかを説明するのを忘れていました。コンテンツが作成され、ページがそのコンテンツ ページにジャンプし、そこにエラー メッセージが表示されます

更新 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));
}

ありがとう、クリスティ

4

2 に答える 2

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.'));
    }
  }
}

注: 検証機能でユーザーを作成しようとしないでください。フォーム送信機能でそれを行います。失敗する可能性のある他のバリデーターが存在する可能性があるため、フォームが検証のために送信される回数がわからない場合があります。

于 2014-07-22T15:21:57.537 に答える