Incam_PROFIND_Web/www/protected/controllers/RegistroUsuarioController.php
david 8afe5926dc - Tarea #1113 -> Poder dar de baja la cuenta de usuario
- Limpieza de ficheros
- Cambiados ficheros de configuración para poner en el apartado de YiiMail la ruta de las plantillas de correo

git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_PROFIND_Web/trunk@50 3fe1ab16-cfe0-e34b-8c9f-7d8c168d430d
2012-10-02 19:36:18 +00:00

322 lines
14 KiB
PHP

<?php
/**
* Sirve para realizar el proceso de registro de un usuario nuevo.
*/
class RegistroUsuarioController extends Controller {
public $defaultAction = 'registrar';
public $layout = '//layouts/error';
public function filters() {
return array('accessControl');
}
public function accessRules() {
return array(
array('allow',
'actions' => array('registrar', 'registrarAgente', 'activar', 'cancelar'),
'users' => array('*')
),
array('deny'),
);
}
/**
* 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.
*/
public function actionRegistrar() {
$formulario = new FormularioRegistro;
$resultado = array();
// if it is ajax validation request
if (isset($_POST['ajax']) && $_POST['ajax'] === 'registro-form') {
$formulario->email = $_POST['FormularioRegistro_email'];
$formulario->password = $_POST['FormularioRegistro_password'];
$formulario->password2 = $_POST['FormularioRegistro_password2'];
if (!$formulario->validate()) {
foreach ($formulario->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
$nuevo_usuario = new Usuario('registrar');
$nuevo_usuario->tipo = Usuario::TIPO_USUARIO_COORDINADOR;
$nuevo_usuario->email = $formulario->email;
$nuevo_usuario->password = $nuevo_usuario->encrypt($formulario->password);
$nuevo_usuario->estado = Usuario::ESTADO_NOACTIVO;
$nuevo_usuario->clave_seguridad = $nuevo_usuario->encrypt(microtime() . $nuevo_usuario->password);
if (!$nuevo_usuario->save()) {
foreach ($nuevo_usuario->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
// Crear la empresa
$nueva_empresa = new Empresa('registrar');
if (!$nueva_empresa->save()) {
foreach ($nueva_empresa->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
$nuevo_usuario->id_empresa = $nueva_empresa->id;
if (!$nuevo_usuario->save()) {
foreach ($nuevo_usuario->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
// Crear la subscripción
$nueva_subscripcion = new Subscripcion('registrar');
$nueva_subscripcion->estado = Subscripcion::ESTADO_ACTIVO;
$nueva_subscripcion->id_usuario = $nuevo_usuario->id;
$nueva_subscripcion->id_producto = 1;
if (!$nueva_subscripcion->save()) {
foreach ($nueva_subscripcion->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
if ($this->enviarMailRegistro($nuevo_usuario)) {
$resultado['status'] = '200';
$resultado['titulo'] = Yii::t('profind', 'Gracias por registrarse en PRODIND');
$resultado['texto'] = Yii::t('profind', 'Su cuenta ha sido creada. En unos momentos recibirá un email con un enlace para completar su registro.');
} else {
$resultado['status'] = '200';
$resultado['titulo'] = Yii::t('profind', 'Error en el registro');
$resultado['texto'] = Yii::t('profind', 'No se ha podido enviar el correo de registro a la dirección indicada.');
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
$this->redirect(Yii::app()->params['frontpage']);
}
public function actionRegistrarAgente() {
$formulario = new FormularioRegistroAgente;
$resultado = array();
if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-ext') {
$formulario->key = $_POST['FormularioActivarAgente_key'];
$formulario->email = $_POST['FormularioActivarAgente_email'];
$formulario->password = $_POST['FormularioActivarAgente_password'];
$formulario->passwordRepetida = $_POST['FormularioActivarAgente_password_repetida'];
if ($formulario->validate()) {
$usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
$usuario->estado = Usuario::ESTADO_ACTIVO;
$usuario->save();
if ($this->_cambiarPassword($usuario->id, $formulario->password)) {
$this->enviarMailConfirmacionActivacion($usuario);
$resultado['status'] = '200';
$resultado['titulo'] = Yii::t('profind', 'Cuenta de agente activada');
$resultado['texto'] = Yii::t('profind', 'Se ha activado su cuenta y se ha establecido su nueva password en PROFIND.');
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
} else {
foreach ($formulario->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
} else {
foreach ($formulario->getErrors() as $campo => $error) {
$resultado[$campo] = $error;
}
echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
Yii::app()->end();
}
}
$this->redirect(Yii::app()->params['frontpage']);
}
private function _cambiarPassword($id, $nueva_password) {
$usuario = Usuario::model()->findByPk($id);
if (!isset($usuario))
throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.'));
$usuario->password = $usuario->encrypt($nueva_password);
$usuario->clave_seguridad = $usuario->encrypt(microtime() . $usuario->password);
if ($usuario->save()) {
return true;
} else
return false;
}
/**
* Activa la cuenta del usuario a partir de la URL de activación
* que se le ha enviado a través de un email.
*/
public function actionActivar() {
$email = $_GET['email'];
$clave_seguridad = $_GET['key'];
if ($email && $clave_seguridad) {
$usuario = Usuario::model()->findByAttributes(array('email' => $email));
// Comprobamos si se ha encontrado un usuario con ese email
if (!isset($usuario)) {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Error de activación'),
'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.<br>La URL de activación es incorrecta.'),
));
} elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Cuenta ya activada'),
'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.<br>La cuenta ya estaba activada.'),
));
} elseif ($usuario->estado == Usuario::ESTADO_DENEGADO) {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Cuenta bloqueada'),
'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.<br>Contacte con el administrador del sitio para obtener más información.'),
));
} elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) {
// Hay que activar el usuario
$usuario->estado = Usuario::ESTADO_ACTIVO;
$usuario->clave_seguridad = $usuario->encrypt(microtime() . $usuario->password);
$usuario->save();
$this->enviarMailConfirmacionActivacion($usuario);
$this->layout = '//layouts/mensaje';
$this->render('confirmacion_usuario', array());
} else {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Error de activación'),
'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.<br>La URL de activación es incorrecta.'),
));
}
} else {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Error de activación'),
'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.<br>La URL de activación es incorrecta.'),
));
}
}
public function actionCancelar() {
$email = $_GET['email'];
$clave_seguridad = $_GET['key'];
if ($email && $clave_seguridad) {
$usuario = Usuario::model()->findByAttributes(array('email' => $email));
// Comprobamos si se ha encontrado un usuario con ese email
if (!isset($usuario)) {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Error de cancelación'),
'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.<br>La URL de cancelación es incorrecta.'),
));
} elseif ($usuario->estado == Usuario::ESTADO_NOACTIVO) {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Cuenta ya cancelada'),
'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.<br>La cuenta ya estaba cancelada.'),
));
} elseif ($usuario->estado == Usuario::ESTADO_DENEGADO) {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Cuenta bloqueada'),
'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.<br>Contacte con el administrador del sitio para obtener más información.'),
));
} elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) {
// Hay que desactivar el usuario
$usuario->estado = Usuario::ESTADO_NOACTIVO;
$usuario->clave_seguridad = $usuario->encrypt(microtime() . $usuario->password);
$usuario->save();
$this->enviarMailConfirmacionCancelacion($usuario);
$this->layout = '//layouts/mensaje';
$this->render('confirmacion_cancelacion_usuario', array());
} else {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Error de cancelación'),
'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.<br>La URL de cancelación es incorrecta.'),
));
}
} else {
$this->render('//site/error', array(
'titulo' => Yii::t('profind', 'Error de cancelación'),
'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.<br>La URL de cancelación es incorrecta.'),
));
}
}
/**
* Envía un mail de registro a un usuario
* con una URL de confirmación.
* @param Usuario $usuario Usuario al que se le enviará el mail de registro
*/
private function enviarMailRegistro($usuario) {
Yii::import('ext.yii-mail.YiiMailMessage');
$url_activacion = $this->createAbsoluteUrl('registroUsuario/activar', array("key" => $usuario->clave_seguridad, "email" => $usuario->email));
$mensaje = new YiiMailMessage;
$mensaje->from = Yii::app()->params['email_remitente'];
$mensaje->setTo($usuario->email);
$mensaje->subject = Yii::t('profind', 'Complete su registro en PROFIND');
$mensaje->view = 'registro_usuario';
$mensaje->setBody(array(
'url' => $url_activacion,
'email' => $usuario->email
), 'text/html'
);
return Yii::app()->mail->send($mensaje);
}
/**
* Envía un mail de confirmación de su cuenta al usuario.
* @param Usuario $usuario Usuario al que se le enviará el mail de registro
*/
private function enviarMailConfirmacionActivacion($usuario) {
Yii::import('ext.yii-mail.YiiMailMessage');
$mensaje = new YiiMailMessage;
$mensaje->from = Yii::app()->params['email_remitente'];
$mensaje->setTo($usuario->email);
$mensaje->subject = Yii::t('profind', 'Gracias por registrarse en PROFIND.');
$mensaje->view = 'confirmacion_usuario';
$mensaje->setBody(array(
'email' => $usuario->email
), 'text/html'
);
return Yii::app()->mail->send($mensaje);
}
private function enviarMailConfirmacionCancelacion($usuario) {
Yii::import('ext.yii-mail.YiiMailMessage');
$mensaje = new YiiMailMessage;
$mensaje->from = Yii::app()->params['email_remitente'];
$mensaje->setTo($usuario->email);
$mensaje->subject = Yii::t('profind', 'Confirmación de cancelación de su cuenta en PROFIND');
$mensaje->view = 'confirmacion_cancelacion_usuario';
$mensaje->setBody(array('email' => $usuario->email), 'text/html');
return Yii::app()->mail->send($mensaje);
}
}