web-dev-qa-db-ja.com

ユーザーがアクティベーションメールの再送信をリクエストできるようにする

ユーザーがアクティベーションメールを再送信するようにリクエストする方法をコーディングしたいと思います。これを実行するform-submitフック内から呼び出すことができる関数はありますか?

(Drupal 7を使用)

3
Damon

まず、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は、使用したモジュールの名前です。好きなように変更できます。

3
Aboodred1

以前の答えは機能しません。 _ 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'];
}
0
AdamG