ユーザーがアクティベーションメールを再送信するようにリクエストする方法をコーディングしたいと思います。これを実行するform-submitフック内から呼び出すことができる関数はありますか?
(Drupal 7を使用)
まず、hook_menu()
を使用してカスタムフォームページを作成し、ユーザーがメールを入力できるようにする必要があります。
/**
* Implements hook_menu().
*/
function custom_user_menu() {
$items = array();
$items['user/trouble'] = array(
'title' => 'trouble logging in',
'page callback' => 'drupal_get_form',
'page arguments' => array('custom_user_trouble_logging_in_form'),
'access callback' => TRUE,
);
return $items;
}
次に、フォーム構造を作成する必要があります
function custom_user_trouble_logging_in_form($form, &$form_state) {
$form['mail'] = array(
'#type' => 'textfield',
'#title' => t('E-Mail address'),
'#size' => 60,
'#required' => TRUE,
);
$form['actions'] = array('#type' => 'actions');
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Resend activation email'),
);
return $form;
}
3番目に、検証手順(ユーザーの電子メールが既に登録されているかどうかを確認します)
/*
* Validation function
*/
function custom_user_trouble_logging_in_form_validate($form, &$form_state) {
$account = user_load_by_mail($form_state['values']['mail']);
if(!$account) {
form_error($form['mail'], t('Invalid user email'));
}
}
4番目に、フォームの送信時にユーザーアクティベーションメールを再送信します。
/*
* Submit function for the 'Re-send welcome message'.
*/
function custom_user_trouble_logging_in_form_submit($form, &$form_state) {
global $language;
$destination = array();
if (isset($_GET['destination'])) {
$destination = drupal_get_destination();
unset($_GET['destination']);
}
$account = user_load_by_mail($form_state['values']['mail']);
$user_register = variable_get('user_register', 2);
switch ($user_register) {
case 0:
$op = 'register_admin_created';
break;
case 1:
$op = 'register_no_approval_required';
break;
case 2:
$op = 'register_pending_approval';
break;
}
$mail = _user_mail_notify($op, $account, $language);
if (!empty($mail)) {
watchdog('user', 'Welcome message has been re-sent to %name at %email.', array('%name' => isset($account->realname)? $account->realname : $account->name, '%email' => $account->mail));
drupal_set_message(t('Welcome message has been re-sent to %name at %email', array('%name' => isset($account->realname)? $account->realname : $account->name, '%email' => $account->mail)));
} else {
watchdog('user', 'There was an error re-sending welcome message to %name at %email', array('%name' => isset($account->realname)? $account->realname : $account->name, '%email' => $account->mail));
drupal_set_message(t('There was an error re-sending welcome message to %name at %email', array('%name' => isset($account->realname)? $account->realname : $account->name, '%email' => $account->mail)), 'error');
}
$form_state['redirect'] = $destination;
}
注:custom_user
は、使用したモジュールの名前です。好きなように変更できます。
以前の答えは機能しません。 _ user_mail_notify は、「デフォルトでは、キャンセルおよびブロックされたものを除いて、常に通知する」と述べています。
ユーザーがログインしようとしたときにユーザーに通知し、そのときにカスタムのuser_mail_notifyを使用して別のメールを送信する実装は次のとおりです。 「cgps_my_misc」はカスタムモジュールの名前です。
<?php
function cgps_my_misc_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'user_login_block':
$form['#validate'][] = 'cgps_my_misc_user_login_name_validate';
break;
}
}
function cgps_my_misc_user_login_name_validate($form, &$form_state) {
if (!empty($form_state['values']['name']) && user_is_blocked($form_state['values']['name'])) {
drupal_get_messages('error'); //Purges drupal core error message so we can set out own
form_set_error('cgps_my_name', t('The account %name has not been activated.', array('%name' => $form_state['values']['name'])));
$user = user_load_by_name($form_state['values']['name']);
$mail = cgps_my_misc_user_mail_notify('register_no_approval_required', $user);
if (!empty($mail)) {
watchdog('user', 'Welcome message has been re-sent to %name at %email.', array('%name' => isset($user->realname)? $user->realname : $user->name, '%email' => $user->mail));
drupal_set_message(t('Welcome message has been re-sent to %name at %email', array('%name' => isset($user->realname)? $user->realname : $user->name, '%email' => $user->mail)));
} else {
watchdog('user', 'There was an error re-sending welcome message to %name at %email', array('%name' => isset($user->realname)? $user->realname : $user->name, '%email' => $user->mail));
drupal_set_message(t('There was an error re-sending welcome message to %name at %email', array('%name' => isset($user->realname)? $user->realname : $user->name, '%email' => $user->mail)), 'error');
}
}
}
function cgps_my_misc_user_mail_notify($op, $account, $language = NULL) {
$params['account'] = $account;
$language = $language ? $language : user_preferred_language($account);
$mail = drupal_mail('user', $op, $account->mail, $language, $params);
return empty($mail) ? NULL : $mail['result'];
}