Как анонимным пользователям разрешено публиковать сообщения, сохраняя целостность контента?

8

Немного предыстории: Как вы видите на http://charlotte.ebayclassifieds.com , если вы нажмете «опубликовать объявление», а затем выберете категорию, вы можете заполнить форму и отправить контент без необходимости регистрации. Все это делается и управляется путем отправки проверочных писем в поле адреса электронной почты, которые при нажатии позволяют пользователю манипулировать своим контентом.

Может ли подобная функциональность быть достигнута в Drupal. Я не против написать модуль, но прежде чем я это сделаю, я хочу убедиться, что я не изобретаю велосипед заново.

У меня есть местный сайт объявлений Drupal для моего сообщества по адресу http://www.gastonia.com . Сайт растет в анонимном трафике, но мало кто подписывается на пост. После пары обратной связи с сообществом, почти все говорят, что единственным препятствием для входа является регистрация аккаунта, проверка электронной почты, проверка, выяснение того, как перемещаться, чтобы опубликовать объявление и т. Д. - действительно, есть 7 шагов необходимо пройти, прежде чем объявление действительно будет опубликовано. Это слишком много..

Мы переработали архитектуру, чтобы иметь возможность сократить ее до двух кликов - нажмите, чтобы опубликовать, затем нажмите, чтобы сохранить. В частности, пользователь нажимает «Добавить контент», и появляется форма «узел / добавить» (теперь в новой архитектуре только один тип контента); Затем, когда они сделаны, они нажимают сохранить.

Первоначально я думал о модуле Inline Registration , но он все еще находится в DEV, и логика действительно не для поддержки, если пользователь снова возвращается, чтобы публиковать сообщения с тем же адресом электронной почты (без входа в систему). Я мог бы изменить это, но потом мы вернулись к написанию модуля.

Я также подумал о правилах - могут ли правила обрабатывать те же функции, что и сайт ebayclassifieds, или что я пытаюсь сделать? Все это будет основано на электронной почте, поданной в форме узла / добавления (функциональность CRUD).

Какое направление или рецепт вы бы предложили для достижения функциональности? Конечно, конечная цель здесь - разрешить пользователям размещать сообщения; создать аккаунт за кулисами для будущего использования; разрешить использование анонимной формы даже для пользователей с электронными письмами, у которых уже есть учетные записи (и назначать контент соответствующим образом), при сохранении безопасности (от спама, ботов), которая обеспечивается тем, что пользователь регистрирует и аутентифицирует учетную запись.

РЕДАКТИРОВАТЬ: 01.04.2013 Gisle Hannemyr возродил модуль Anonymous Publishing, который очень близок к достижению целей, описанных здесь и в других публикациях. Пожалуйста, примите участие в обсуждении, чтобы предоставить сообществу обратную связь о том, как сделать модуль свободным от ошибок и улучшить его: http://drupal.org/node/1957644

blue928
источник
Я задал похожий вопрос некоторое время назад: drupal.stackexchange.com/questions/25194/…
paul-m
Будет ли OAuth / OpenID слишком много для ваших пользователей? Janrain делает это легко войти.
Capi Etheriel
Я никогда не слышал о Janrain, но мне нравится идея людей, использующих другие учетные записи для входа в систему. Как здесь, на DSE, я всегда использую свой аккаунт Google. Так просто?
blue928

Ответы:

7

Я не думаю, что это возможно только с помощью правил.

Вам нужно изменить форму отправки, чтобы получить адрес электронной почты для подтверждения, а также вам нужна логика для запрета спамеров и распознавания возвращающихся посетителей.

Я поддерживаю проект под названием Anonymous Publishing . Похоже, что этот модуль делает то, что вы хотите.

Он все еще находится в разработке, но версия Drupal 7 использовалась на нескольких моих производственных сайтах без каких-либо проблем. Пожалуйста, проверьте это.

Вы также можете посмотреть ответы на этот вопрос .

Свободный радикал
источник
Спасибо за это, потратим некоторое время на проверку кода!
blue928 25.12.12
Я создал ветку по адресу 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-е поле, поле имени пользователя, более точные предупреждения и т. Д. Чем больше ограничений, тем дольше процесс, поэтому об этом следует помнить.

Чарли Шлиссер
источник
2

Есть много способов снизить «барьер регистрации»:

  • использовать Facebook Connect, чтобы разрешить вход в систему с учетной записью Facebook (я использую и как модуль fboauth )
  • Существуют и другие модули входа в систему, которые поддерживают Google, PayPal, Yahoo, OpenID и т. д.
  • Вы можете изменить опцию регистрации, чтобы не требовать подтверждения по электронной почте.

Чтобы ответить на ваш последний вопрос:

Какое направление или рецепт вы бы предложили для достижения функциональности? Конечно, конечная цель здесь - разрешить пользователям размещать сообщения; создать аккаунт за кулисами для будущего использования; разрешить использование анонимной формы даже для пользователей с электронными письмами, у которых уже есть учетные записи (и назначать контент соответствующим образом), при сохранении безопасности (от спама, ботов), которая обеспечивается тем, что пользователь регистрирует и аутентифицирует учетную запись.

Я предлагаю использовать функцию «регистрация анонимного узла» (я могу поделиться кодом, если хотите). Я добавляю поля «имя» и «адрес электронной почты» в форму «Добавить узел».

Если электронная почта еще не существует, она создаст новую учетную запись пользователя. Он использует имя для создания имени пользователя и добавляет числа, если необходимо, чтобы сделать его уникальным.

Пароль устанавливается случайным образом и отображается пользователю после отправки узла со ссылкой для смены пароля.

Кроме того, подтверждение по электронной почте не будет препятствовать регистрации спам-ботов. Я настоятельно рекомендую модуль spambot .

Уве
источник
2
Вы упомянули код, которым можете поделиться. Тогда вы уже написали модуль для собственного использования? Я хотел бы взглянуть на это, если вы хотите разместить его где-нибудь в Интернете. Спасибо!
blue928 24.12.12