在保持内容完整性的同时,如何允许匿名用户发帖?


8

简要背景:如您在http://charlotte.ebayclassifieds.com上看到的,如果您单击“发布广告”,然后选择一个类别,则可以填写表格并提交内容,而无需注册。通过向电子邮件地址字段发送验证电子邮件来完成和管理所有操作,单击该电子邮件时,允许用户操纵其内容。

可以在Drupal中实现类似的功能。我不介意编写模块,但是在执行此操作之前,我想确保我没有重新发明轮子。

我在http://www.gastonia.com上为我的社区提供了一个基于Drupal的本地分类站点。该网站的匿名流量正在增长,但是很少有用户注册发布。在社区反馈之后,几乎每个人都说进入门槛是必须注册一个帐户,检查电子邮件,验证,弄清楚如何导航以发布广告等-确实有7个步骤在广告实际发布之前必须经历的过程。太多了..

我们对架构进行了重新设计,使其能够降低到两次单击-单击以发布,然后单击以保存。更具体地说,用户单击“添加内容”,然后弹出节点/添加表单(新架构中现在只有一种内容类型);然后,完成后,单击“保存”。

最初,我曾考虑过Inline Registration模块,但是它仍然存在于DEV中,如果用户再次使用相同的电子邮件地址(没有登录)再次发帖,则该逻辑确实不存在。我可以更改它,但是然后我们回到编写模块。

我还考虑过规则-规则可以处理与ebayclassifieds网站类似的功能或我要做什么?所有这些都将基于以节点/添加形式(CRUD功能)提交的电子邮件。

您建议采用什么方向或配方来实现该功能?当然,这里的最终目标是允许匿名用户发布信息。在后台创建一个帐户以备将来使用;甚至允许已拥有帐户(并相应分配内容)的电子邮件用户使用anon表单,同时保持由用户注册和验证帐户所提供的安全性(来自垃圾邮件,僵尸程序)。

编辑:2013年4月1日,吉斯勒·汉内米尔(Gisle Hannemyr)恢复了“ 匿名发布”模块,该模块非常接近实现此处和其他帖子中所述的目标。请参与该线程,以提供一些社区反馈,以帮助您了解如何使模块错误更自由,更好:http : //drupal.org/node/1957644



OAuth / OpenID对您的用户而言是否过多?Janrain使登录变得轻而易举。
Capi Etheriel

我从未听说过Janrain,但我喜欢人们使用其他帐户登录的想法。就像在DSE上一样,我总是使用我的Google帐户。就如此容易?
blue928

Answers:


7

我认为仅凭规则不可能做到这一点。

您需要更改提交表单才能捕获验证电子邮件地址,并且还需要一些逻辑来禁止垃圾邮件发送者并识别回访者。

我是一个名为Anonymous Publishing的项目的维护者。看起来好像该模块完成了您想要的。

它仍在开发中,但是Drupal 7版本已在我的多个生产站点中使用,没有任何问题。请检查一下。

您可能还需要查看此问题下的答案。


谢谢您,将花费一些时间检查代码!
blue928

我在drupal.org/node/1957644创建了一个线程,以查看是否无法就该模块进行积极的讨论。感谢您的恢复。
blue928

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

您可以采用多种方法来降低“注册障碍”:

  • 使用Facebook connect允许使用Facebook帐户登录(我使用fboauth模块,就像fboauth模块一样)
  • 还有其他支持Google,PayPal,Yahoo,Openid等的社交登录模块。
  • 您可以将注册选项更改为不需要电子邮件确认。

要回答您的最后一个问题:

您建议采用什么方向或配方来实现该功能?当然,这里的最终目标是允许匿名用户发布信息。在后台创建一个帐户以备将来使用;甚至允许已拥有帐户(并相应分配内容)的电子邮件用户使用anon表单,同时保持由用户注册和验证帐户所提供的安全性(来自垃圾邮件,僵尸程序)。

我建议使用“匿名节点注册”功能(如果您愿意,我可以共享代码)。我将“名称”和“电子邮件地址”字段添加到“节点添加”表单中。

如果电子邮件不存在,它将创建一个新的用户帐户。它使用名字来创建用户名,并在必要时添加数字以使其唯一。

提交带有更改密码链接的节点后,密码将随机设置并显示给用户。

此外,电子邮件确认不会阻止垃圾邮件机器人注册。我强烈推荐spambot模块。


2
您提到了可以共享的代码。然后您已经编写了一个供自己使用的模块?如果您想将它放在网上某个地方,我想看看。谢谢!
blue928

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.