web-dev-qa-db-ja.com

コンテンツの整合性を維持しながら、匿名ユーザーが投稿できるようにするにはどうすればよいですか?

簡単な背景: http://charlotte.ebayclassifieds.com でわかるように、[広告を投稿]をクリックしてカテゴリを選択すると、フォームに入力してコンテンツを送信できます。サインアップします。これはすべて、電子メールアドレスフィールドに検証メールを送信することによって行われ、管理されます。クリックすると、ユーザーがコンテンツを操作できるようになります。

Drupalで同様の機能を実現できますか?モジュールを書いてもかまわないが、その前に、ホイールを再発明していないことを確認したい。

Drupalコミュニティのローカルクラシファイドサイト http://www.gastonia.com に基づいています。サイトは匿名トラフィックで増加していますが、ユーザーはほとんどいません投稿するためにサインアップします。コミュニティでいくつかのフィードバックがループした後、ほとんどすべての人が、アカウントへのサインアップ、電子メールのチェック、検証、広告を投稿するためのナビゲート方法の理解などがエントリの1つの障壁であると言っています-実際、広告が実際に公開される前に実行する必要がある7つのステップがあります。

アーキテクチャを再構築して、2回のクリックまでそれを取得できるようにしました。クリックして投稿し、クリックして保存します。より具体的には、ユーザーが「コンテンツの追加」をクリックすると、ノード/追加フォームがポップアップ表示されます(新しいアーキテクチャーにはコンテンツタイプが1つしかありません)。次に、完了したら、[保存]をクリックします。

元々私は インライン登録 モジュールについて考えましたが、それはまだDEVにあり、ユーザーが同じメールアドレスで(ログインせずに)再度投稿する場合、ロジックは実際にはサポートしていません。変更することもできますが、モジュールの作成に戻ります。

ルールについても考えました-ルールはebayclassifiedsサイトと同様の機能を処理できますか?それはすべて、node/addフォーム(CRUD機能)に提出された電子メールに基づいています。

機能を実現するためにどの方向またはレシピを提案しますか?もちろん、ここでの最終的な目標は、anonユーザーが投稿できるようにすることです。将来使用するために舞台裏でアカウントを作成します。ユーザーがサインアップしてアカウントを認証することで得られるセキュリティ(スパム、ボットから)を維持しながら、既にアカウントを持っている(そしてそれに応じてコンテンツを割り当てる)メールを持つユーザーに対しても、匿名フォームの使用を許可します。

編集:2013年4月1日、Gisle Hannemyrが 匿名の公開モジュール を復活させました。スレッドに参加して、モジュールのバグを無料で改善する方法に関するコミュニティフィードバックを提供してください: http://drupal.org/node/1957644

8
blue928

これはルールだけでは可能ではないと思います。

確認メールアドレスを取得するために送信フォームを変更する必要があります。また、スパマーを禁止し、リピーターを認識するためのロジックも必要です。

私は Anonymous Publishing という名前のプロジェクトのメンテナーです。このモジュールはあなたが望んでいるように見えます。

まだ開発中ですが、いくつかのプロダクションサイトでDrupal 7バージョンが問題なく使用されています。確認してください。

この質問 で回答を確認することもできます。

7
Free Radical

「登録のハードル」を下げるには、さまざまな方法があります。

  • facebook接続を使用してFacebookアカウントでのログインを許可します(私は fboauth モジュールを使用しています)
  • google、Paypal、yahoo、openidなどをサポートする他のソーシャルログインモジュールがあります。
  • 登録オプションを変更して、確認メールを要求しないようにすることができます。

最後の質問に答えるには:

機能を実現するためにどの方向またはレシピを提案しますか?もちろん、ここでの最終的な目標は、anonユーザーが投稿できるようにすることです。将来使用するために舞台裏でアカウントを作成します。ユーザーがサインアップしてアカウントを認証することで得られるセキュリティ(スパム、ボットから)を維持しながら、既にアカウントを持っている(そしてそれに応じてコンテンツを割り当てる)メールを持つユーザーに対しても、匿名フォームの使用を許可します。

「匿名ノード登録」機能を使用することをお勧めします(必要に応じてコードを共有できます)。 「ノード追加」フォームに「名前」と「メールアドレス」フィールドを追加します。

メールがまだ存在しない場合は、新しいユーザーアカウントが作成されます。名を使用してユーザー名を作成し、必要に応じて番号を追加して一意にします。

パスワードはランダムに設定され、パスワードを変更するためのリンクをノードに送信した後にユーザーに表示されます。

また、確認メールを送信しても、スパムボットの登録が妨げられることはありません。 spambot モジュールを強くお勧めします。

2
uwe

このモジュールもあります: 作成して登録

2
cdmo

新しいメニューコールバックを作成することで、最近のプロジェクトでこれと同様のことを達成しました。example.com/anon_userなどのように、ログインと登録フォームを兼ねるフォームを提供します。これにより、ユーザーは非常に迅速に登録プロセスを実行できますORログインせずに多くのアクションを実行させる必要はありません。実際、かなりよく受信されています。

これを示すための簡単なコードを次に示します。

function example_form($form, &$form_state) {
  // Don't let authenticated users use this form.
  global $user;
  if ($user->uid != 0) {
    return MENU_ACCESS_DENIED;
  }

  // Let the user know what they can do.
  $form['intro']['#markup'] = "Already have an account? Login here. Don't have an account? Enter your email address and create a password and we'll setup an account for you.");

  $form['login'] = array(
    '#type' => 'fieldset',
    'user_email' => array(
      '#type' => 'textfield',
      '#required' => TRUE,
      '#title' => t('E-mail Address'),
    ),
    'user_pass' => array(
      '#type' => 'password',
      '#required' => TRUE,
      '#title' => t('Password'),
    ),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Continue',
  );

  return $form;
}

必要なものを検証します。

function example_form_validate(&$form, &$form_state) {
  if (!valid_email_address($form_state['values']['user_email'])) {
    form_set_error('user_email', 'You entered an invalid email address.');
  }
}

送信ハンドラで、このメールが既に存在するかどうかを確認して、ログインを試みる必要があります。存在しない場合は、それらのアカウントを作成してみてください。

function example_form_submit(&$form, &$form_state) {
  global $user;

  // Does this account already exist?
  if ($user_name = db_query("SELECT name FROM {users} WHERE mail = :mail", array(':mail' => $form_state['values']['user_email']))->fetchField()) {
    // Attempt to log them in.
    if ($account_id = user_authenticate($user_name, $form_state['values']['user_pass'])) {
      drupal_set_message('You have been logged in.');
      $user = user_load($account_id);
    } else {
      drupal_set_message('You have an account here, but you entered the wrong password.', 'error');
    }
  } 

  // Create the account.
  else {
    // Use their email address as their username. Or handle this with a more complex login form.
    $account_name = str_replace('@', '_', $form_state['values']['user_email']);
    $account = user_save(null, array(
      'name' => $account_name,
      'pass' => $form_state['values']['user_pass'],
      'mail' => $form_state['values']['user_email'],
      'init' => $form_state['values']['user_email'],
      'status' => 1,
      'access' => REQUEST_TIME,
    ));
    // Log 'em in to their new account.
    drupal_set_message('Your account has been created and you have been successfully logged in!');
    );
    $user = user_load(user_authenticate($account->name, $form_state['values']['user_pass']));
  }
}

これはかなり単純な例です。パスワード要件、2番目のフィールドによるパスワードの確認、ユーザー名フィールド、より適切な警告などを追加できます。制限が多いほどプロセスが長くなるため、注意が必要です。

2