¿Cómo se puede permitir a los usuarios anónimos publicar mientras se mantiene la integridad del contenido?

8

Un poco de historia: como puede ver en http://charlotte.ebayclassifieds.com , si hace clic en "publicar un anuncio" y luego elige una categoría, puede completar el formulario y enviar contenido sin tener que registrarse. Todo esto se hace y se administra mediante el envío de correos electrónicos de validación al campo de dirección de correo electrónico que, cuando se hace clic, permite a un usuario manipular su contenido.

¿Se puede lograr una funcionalidad similar en Drupal? No me importa escribir un módulo, pero antes de hacerlo, quiero asegurarme de no reinventar la rueda.

Tengo un sitio de anuncios locales basado en Drupal para mi comunidad en http://www.gastonia.com . El sitio está creciendo en tráfico anónimo, pero pocos usuarios se están registrando para publicar. Después de un par de bucles de retroalimentación con la comunidad, casi todos dicen que la única barrera para ingresar es tener que registrarse para obtener una cuenta, consultar el correo electrónico, validar, descubrir cómo navegar para publicar un anuncio, etc. De hecho, hay 7 pasos necesario pasar antes de que se publique un anuncio. Es demasiado..

Hemos reelaborado la arquitectura para poder reducirla a dos clics: haga clic para publicar y luego haga clic para guardar. Más específicamente, un usuario hace clic en 'Agregar contenido' y aparece el formulario nodo / agregar (ahora solo hay un tipo de contenido en la nueva arquitectura); Luego, cuando terminan, hacen clic en guardar.

Originalmente pensé en el módulo de registro en línea , pero todavía está en DEV y la lógica realmente no está ahí para admitir si el usuario vuelve a publicar con la misma dirección de correo electrónico (sin iniciar sesión). Podría alterarlo, pero luego volvemos a escribir un módulo.

También pensé en las reglas: ¿podrían las reglas manejar una funcionalidad similar a la del sitio ebayclassifieds o lo que estoy tratando de hacer? Todo se basaría en un correo electrónico archivado en el nodo / formulario de adición (funcionalidad CRUD).

¿Qué dirección o receta sugeriría para lograr la funcionalidad? Por supuesto, el objetivo final aquí es permitir que los usuarios anon publiquen; crear una cuenta detrás de escena para uso futuro; permita el uso del formulario anon incluso para usuarios con correos electrónicos que ya tienen cuentas (y asigne contenido en consecuencia), todo mientras mantiene la seguridad (contra spam, bots) que se obtiene al hacer que un usuario se registre y autentique una cuenta.

EDIT: 4/1/2013 Gisle Hannemyr ha revivido el módulo de publicación anónima que está muy cerca de lograr los objetivos descritos aquí y en otras publicaciones. Participe en el hilo para proporcionar comentarios de la comunidad sobre cómo hacer que el módulo esté libre de errores y mejor: http://drupal.org/node/1957644

blue928
fuente
Hice una pregunta similar hace un tiempo: drupal.stackexchange.com/questions/25194/…
paul-m
¿OAuth / OpenID sería demasiado para sus usuarios? Janrain hace que iniciar sesión sea muy fácil.
Capi Etheriel
Nunca he oído hablar de Janrain, pero me gusta la idea de que las personas usen otras cuentas para iniciar sesión. Como aquí en DSE, siempre uso mi cuenta de Google. ¿Tan simple como eso?
blue928

Respuestas:

7

No creo que esto sea posible solo con reglas.

Debe modificar el formulario de envío para capturar la dirección de correo electrónico de verificación, y también necesita algo de lógica para prohibir los spammers y reconocer a los visitantes que regresan.

Soy el encargado de mantener un proyecto llamado Anonymous Publishing . Parece que este módulo hace lo que quieres.

Todavía está en desarrollo, pero se ha usado una versión de Drupal 7 en varios de mis sitios de producción sin ningún problema. Por favor, míralo.

También es posible que desee ver las respuestas a esta pregunta .

Radicales libres
fuente
Gracias por eso, ¡pasaré algún tiempo revisando el código!
blue928
Creé un hilo en drupal.org/node/1957644 para ver si no podemos tener una discusión activa sobre ese módulo. Gracias por revivir eso.
blue928
2

Logré algo similar a esto en un proyecto reciente al crear una nueva devolución de llamada de menú, algo así example.com/anon_user, que proporciona un formulario que funciona como un formulario de inicio de sesión y registro. Esto permite al usuario pasar rápidamente por el proceso de registro O iniciar sesión sin hacer que realice demasiadas acciones. En realidad se ha recibido bastante bien.

Aquí hay un código simplificado para demostrar esto:

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;
}

Valídalo como necesites:

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.');
  }
}

En el controlador de envío, debemos averiguar si este correo electrónico ya existe e intentar iniciar sesión. Si no existe, intente crear una cuenta para ellos.

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']));
  }
}

Este es un ejemplo bastante simple. Puede agregar requisitos de contraseña, confirmación de contraseña a través de un segundo campo, un campo de nombre de usuario, mejores advertencias, etc. Cuantas más restricciones, más largo es el proceso, por lo que es algo a tener en cuenta.

Charlie Schliesser
fuente
2

Hay muchas maneras de reducir el "obstáculo de registro":

  • uso Facebook connect para permitir iniciar sesión con una cuenta de Facebook (uso y me gusta el módulo fboauth )
  • Hay otros módulos de inicio de sesión social que admiten google, paypal, yahoo, openid, etc.
  • puede cambiar la opción de registro para no requerir confirmaciones por correo electrónico.

Para responder a tu última pregunta:

¿Qué dirección o receta sugeriría para lograr la funcionalidad? Por supuesto, el objetivo final aquí es permitir que los usuarios anon publiquen; crear una cuenta detrás de escena para uso futuro; permita el uso del formulario anon incluso para usuarios con correos electrónicos que ya tienen cuentas (y asigne contenido en consecuencia), todo mientras mantiene la seguridad (contra spam, bots) que se obtiene al hacer que un usuario se registre y autentique una cuenta.

Sugiero usar una función de "registro de nodo anónimo" (puedo compartir el código si lo desea). Agrego los campos "nombre" y "dirección de correo electrónico" a un formulario "agregar nodo".

Si el correo electrónico aún no existe, creará una nueva cuenta de usuario. Utiliza el nombre para crear el nombre de usuario y agrega números si es necesario para hacerlo único.

La contraseña se establece aleatoriamente y se muestra al usuario después de enviar el nodo con un enlace para cambiar la contraseña.

Además, las confirmaciones por correo electrónico no impedirán que los bots de spam se registren. Recomiendo encarecidamente el módulo de spambot .

uwe
fuente
2
Mencionaste el código que podrías compartir. ¿Entonces ya escribiste un módulo para tu propio uso? Me gustaría echarle un vistazo si desea ponerlo en línea en algún lugar. ¡Gracias!
blue928