This repository has been archived on 2024-12-01. You can view files and clone it, but cannot push or open issues or pull requests.
factuges_web/www/protected/modules/usuario/controllers/RegistroController.php
david e93adbdd4e - Importación inicial
- 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
2013-06-13 16:04:48 +00:00

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