- Registro, activación y entrada de usuarios git-svn-id: https://192.168.0.254/svn/Rodax.factuges_web/trunk@2 e455b18d-f7fe-5245-9c43-e2c35af70a32
211 lines
12 KiB
PHP
211 lines
12 KiB
PHP
<?php
|
|
|
|
class RegistroController extends Controller {
|
|
|
|
public $defaultAction = 'registrar';
|
|
|
|
/**
|
|
* Declares class-based actions.
|
|
*/
|
|
public function actions() {
|
|
return array(
|
|
'captcha' => array(
|
|
'class' => 'CCaptchaAction',
|
|
'backColor' => 0xFFFFFF,
|
|
),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @brief Realiza el registro de un usuario a partir de los datos introducidos
|
|
* en el formulario de la página de entrada.
|
|
* También envía un email al usuario para que confirme su cuenta si 'enviarMailActivacion' es 'true'.
|
|
*/
|
|
public function actionRegistrar() {
|
|
Yii::trace('Registrando un nuevo usuario', 'application.modules.usuario.RegistroController');
|
|
|
|
Perfil::$regMode = true;
|
|
|
|
$usuario = new FormularioRegistroUsuario;
|
|
$perfil = new Perfil;
|
|
|
|
// ajax validator
|
|
if (isset($_POST['ajax']) && $_POST['ajax'] === 'formulario-registro-usuario') {
|
|
echo CActiveForm::validate(array($usuario, $perfil));
|
|
Yii::app()->end();
|
|
}
|
|
|
|
if (Yii::app()->user->id) {
|
|
$this->redirect(Yii::app()->controller->module->urlPerfil);
|
|
} else {
|
|
if (isset($_POST['FormularioRegistroUsuario'])) {
|
|
$usuario->attributes = $_POST['FormularioRegistroUsuario'];
|
|
$perfil->attributes = ((isset($_POST['Perfil']) ? $_POST['Perfil'] : array()));
|
|
|
|
if ($usuario->validate() && $perfil->validate()) {
|
|
$passwordOriginal = $usuario->password;
|
|
|
|
// Rellenar los campos necesarios
|
|
$usuario->clave_activacion = UsuarioModule::cifrar(microtime() . $usuario->password);
|
|
$usuario->password = UsuarioModule::cifrar($usuario->password);
|
|
$usuario->confirmacion_password = UsuarioModule::cifrar($usuario->confirmacion_password);
|
|
$usuario->superusuario = 0;
|
|
$usuario->estado = ((Yii::app()->controller->module->activeAfterRegister) ? Usuario::ESTADO_ACTIVO : Usuario::ESTADO_NOACTIVO);
|
|
|
|
// Guardar el usuario y el perfil
|
|
$transaccion = Yii::app()->db->beginTransaction();
|
|
try {
|
|
Yii::trace('Guardando el nuevo usuario', 'application.modules.usuario.RegistroController');
|
|
if (!$usuario->save())
|
|
throw new CException('Error al guardar el usuario');
|
|
|
|
Yii::trace('Guardando el perfil del usuario', 'application.modules.usuario.RegistroController');
|
|
$perfil->usuario_id = $usuario->id;
|
|
if (!$perfil->save())
|
|
throw new CException('Error al guardar el perfil');
|
|
|
|
$transaccion->commit();
|
|
Yii::trace('Nuevo usuario dado de alta', 'application.modules.usuario.RegistroController');
|
|
} catch (Exception $e) {
|
|
Yii::trace($e->getMessage(), 'application.modules.usuario.RegistroController');
|
|
|
|
$transaccion->rollBack();
|
|
$errores = array_merge($usuario->getErrors(), $perfil->getErrors());
|
|
foreach ($errores as $campo => $mensaje)
|
|
$resultado[$campo] = $mensaje;
|
|
Yii::trace(CVarDumper::dumpAsString($resultado), 'application.modules.usuario.RegistroController');
|
|
|
|
//echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
|
|
Yii::app()->end();
|
|
}
|
|
|
|
if (Yii::app()->controller->module->enviarMailActivacion) {
|
|
Yii::trace('Hay que enviar un correo de activación al usuario', 'application.modules.usuario.RegistroController');
|
|
if (EMail::enviarBienvenidaUsuario($usuario->email, $usuario->clave_activacion)) {
|
|
Yii::trace('Correo para activar el usuario enviado', 'application.modules.usuario.RegistroController');
|
|
} else {
|
|
Yii::trace('Error al enviar el correo para activar el usuario', 'application.modules.usuario.RegistroController');
|
|
}
|
|
}
|
|
|
|
if ((Yii::app()->controller->module->loginSinActivacion || (Yii::app()->controller->module->activarAutomaticamente && Yii::app()->controller->module->enviarMailActivacion == false)) && Yii::app()->controller->module->autoLogin) {
|
|
Yii::trace('Entrar directamente sin esperar a la activación', 'application.modules.usuario.RegistroController');
|
|
$identity = new UserIdentity($usuario->username, $passwordOriginal);
|
|
$identity->authenticate();
|
|
Yii::app()->user->login($identity, 0);
|
|
$this->redirect(Yii::app()->homeUrl);
|
|
} else {
|
|
if (!Yii::app()->controller->module->activarAutomaticamente && !Yii::app()->controller->module->enviarMailActivacion) {
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Contact Admin to activate your account."));
|
|
} elseif (Yii::app()->controller->module->activarAutomaticamente && Yii::app()->controller->module->enviarMailActivacion == false) {
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please {{login}}.", array('{{login}}' => CHtml::link(UsuarioModule::t('Login'), Yii::app()->controller->module->urlLogin))));
|
|
} elseif (Yii::app()->controller->module->loginSinActivacion) {
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please check your email or login."));
|
|
} else {
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("Thank you for your registration. Please check your email."));
|
|
}
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
$perfil->validate();
|
|
}
|
|
$this->render('registro', array('model' => $usuario, 'perfil' => $perfil));
|
|
}
|
|
|
|
/**
|
|
* @brief Activa la cuenta del usuarios a partir de la URL de activación
|
|
* que se le ha enviado a través del email generado en el proceso de
|
|
* registro.
|
|
*/
|
|
public function actionActivar() {
|
|
Yii::trace('Activando usuario', 'application.modules.usuario.RegistroController');
|
|
|
|
$email = Yii::app()->request->getQuery('email');
|
|
$clave_activacion = Yii::app()->request->getQuery('key');
|
|
|
|
if ($email && $clave_activacion) {
|
|
$usuario = Usuario::model()->notsafe()->findByAttributes(array('email' => $email));
|
|
|
|
// Comprobamos si se ha encontrado un usuario con ese email
|
|
if (!isset($usuario)) {
|
|
Yii::trace('No existe el email', 'application.modules.usuario.RegistroController');
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. La URL de activación es incorrecta."));
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
} elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) {
|
|
Yii::trace('El usuario ya está activo', 'application.modules.usuario.RegistroController');
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("No se ha realizado ningún cambio. La cuenta ya estaba activada."));
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
} elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) {
|
|
Yii::trace('El usuario está bloqueado', 'application.modules.usuario.RegistroController');
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("La cuenta ha sido bloqueada. Contacte con el administrador del sitio para obtener más información."));
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
} elseif (isset($usuario->clave_activacion) && ($usuario->clave_activacion === $clave_activacion)) {
|
|
Yii::trace('Guardando el usuario', 'application.modules.usuario.RegistroController');
|
|
|
|
// Hay que activar el usuario
|
|
$usuario->estado = Usuario::ESTADO_ACTIVO;
|
|
$usuario->clave_activacion = UsuarioModule::cifrar(microtime() . $usuario->password);
|
|
$usuario->save();
|
|
Yii::trace('Usuario activado', 'application.modules.usuario.RegistroController');
|
|
|
|
EMail::enviarConfirmacionActivacion($usuario->email);
|
|
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("Gracias por registrarse en FactuGES. Su cuenta ha sido confirmada."));
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
} else {
|
|
Yii::trace('Clave de seguridad no válida', 'application.modules.usuario.RegistroController');
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. El enlace de activación es incorrecto."));
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
}
|
|
} else {
|
|
Yii::trace('URL de activación no válida', 'application.modules.usuario.RegistroController');
|
|
Yii::app()->user->setFlash('registro', UsuarioModule::t("No se puede activar la cuenta. El enlace de activación es incorrecto."));
|
|
$this->redirect(Yii::app()->createAbsoluteUrl(Yii::app()->controller->module->urlLogin));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Realiza la recuperación de la contraseña de un usuario.
|
|
*/
|
|
public function actionRecuperar() {
|
|
Yii::trace('Recuperar la cuenta del usuario', 'application.modules.usuario.RegistroController');
|
|
|
|
$formulario = new FormularioRecuperarUsuario;
|
|
|
|
if (Yii::app()->user->id) {
|
|
$this->redirect(Yii::app()->controller->module->returnUrl);
|
|
} else {
|
|
if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form-entrada') {
|
|
$formulario->email = $_POST['FormularioRecuperar_email'];
|
|
|
|
if (!$formulario->validate())
|
|
$this->performAjaxValidationMessage($formulario);
|
|
|
|
$usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
|
|
if ($usuario) {
|
|
if (EMail::enviarRecuperacion($usuario->email, $usuario->clave_seguridad)) {
|
|
Yii::trace('Correo para recuperar la cuenta enviado', 'application.modules.usuario.RegistroController');
|
|
$this->performAjaxStatusMessage('success', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en FactuGES.')
|
|
);
|
|
} else {
|
|
Yii::trace('Error al enviar el correo para recuperar la cuenta', 'application.modules.usuario.RegistroController');
|
|
$this->performAjaxStatusMessage('success', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'No se ha podido enviar el correo para recuperar su cuenta a la dirección indicada.')
|
|
);
|
|
}
|
|
} else {
|
|
Yii::trace('No se encontrado un usuario con el email indicado', 'application.modules.usuario.RegistroController');
|
|
$this->performAjaxStatusMessage('failure', Yii::t('factuges', 'Recuperación de su cuenta en FactuGES'), Yii::t('factuges', 'No se encontrado un usuario con el email indicado.')
|
|
);
|
|
}
|
|
}
|
|
$this->redirect(Yii::app()->params['frontpage']);
|
|
}
|
|
|
|
$this->render('recovery', array('form' => $form));
|
|
}
|
|
|
|
}
|
|
|