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


8

背景: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は、ここと他の投稿で説明されている目標を達成するのに非常に近いAnonymous Publishingモジュールを復活させました。スレッドに参加して、モジュールのバグを無料で改善する方法に関するコミュニティフィードバックを提供してください。http//drupal.org/node/1957644


:私はしばらく前に同様の質問aを尋ねdrupal.stackexchange.com/questions/25194/...
ポール・メートル

ユーザーにとってOAuth / OpenIDは多すぎますか?Janrainを使用すると、ログインが簡単になります。
Capi Etheriel 2012

Janrainについては聞いたことがありませんが、他のアカウントを使用してログインするという考え方は気に入っています。ここDSEのように、私は常に私のgoogleアカウントを使用しています。そんなに簡単?
blue928 2012

回答:


7

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

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

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

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

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


そのおかげで、コードのチェックに時間を費やします!
blue928 2012

drupal.org/node/1957644にスレッドを作成して、そのモジュールについて活発な議論ができないかどうかを確認しました。それを復活させてくれてありがとう。
blue928 2013

2

私は最近のプロジェクトでこれと同様のことexample.com/anon_userを、ログインと登録フォームを兼ねたフォームを提供するような、新しいメニューコールバックを作成することで実現しました。これにより、ユーザーは非常にすばやく登録プロセスを実行したり、あまりにも多くのアクションを実行せずにログインしたりできます。かなり好評です。

これを示すいくつかの簡略化したコードを次に示します。

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

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

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

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

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

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

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

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

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


2
共有できるコードについて言及しました。次に、自分で使用するためのモジュールをすでに作成しましたか?どこかでオンラインにしたい場合は、ぜひご覧ください。ありがとう!
blue928

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.