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