christiansalazar avatar christiansalazar committed cbca2c9

interfaz de login remoto agregada y funcionando

Comments (0)

Files changed (4)

components/CrugeFactory.php

 			throw new CrugeException(__METHOD__." ruta de clase es invalida. ver log.");
 		}
 	}
+
+	/**
+	 * getICrugeStoredUserByUsername 
+	 *  busca un usuario por su username exclusivamente. 
+	 * @param mixed $username 
+	 * @access public
+	 * @return CrugeStoredUser instancia
+	 */
+	public function getICrugeStoredUserByUsername($username){
+		return CrugeStoredUser::loadModel($username,'username');
+	}	
 }

components/CrugeUserManager.php

 		return null;
 	}
 
-	
+
+	/**
+	 * remoteLoginInterface 
+	 *	es una interfaz para iniciar sesion o registrar a un usuario de forma
+	 *  automatizada.
+	 *
+	 * $fieldmap: que campos de Cruge estan relacionados
+	 * con cuales campos que nos ha enviado facebook o google.
+	 * por ejemplo: array('email'=>'contact/email'),
+	 *	 	
+	 * $values se espera que sea un array indexado, cuyo
+	 * indice sea un campo de facebook o google:
+	 * por ejemplo:  array('contact/email'=>'juanperez@abc.com'),
+	 *	
+	 * $modality:  la modalidad de registro de un usuario, puede ser una de:
+	 *
+	 * 	'auto'		: registra al usuario de inmediato y le inicia la sesion
+	 *	'manual'	: lo envia a la pantalla de registro con datos precargados.
+	 *	'none'		: si el usuario no esta registrado no procede.
+	 * 
+	 * @param array $fieldmap 
+	 * @param array $values 
+	 * @param string $modality 'auto', 'manual' , 'none'
+	 * @param string $errorResult (out) error result string
+	 * @access public
+	 * @return false o una URL (array o string) para ir a ella.
+	 */
+	public function remoteLoginInterface(
+			$fieldmap, $_values, $modality, &$errorResult, $debug=false){
+		
+		$values = '';
+		if(is_string($_values))
+		{
+			$values = CJSON::decode($_values);
+		}
+		else
+		{
+			$values = $_values;
+		}
+
+		// para depurar:
+		//
+		// die(CJSON::encode(array('fieldmap'=>$fieldmap,'values'=>$values)));
+		//
+		
+		// se genera un array con datos que cruge entienda a partir
+		// de los valores y fieldmap entregados:
+		//
+		// cada par del array contendrá a la salida:  
+		//	array('username'=>'csalazar', 'email'=>'csalazar@abc.com'
+		//		, 'nombre'=>'christian','apellido'=>'salazar')
+		$mapped_values = array();
+		foreach($fieldmap as $localfield=>$remotefield){
+			$mapped_values[$localfield] = '';
+			if(isset($values[$remotefield]))
+				$mapped_values[$localfield] =  $values[$remotefield];
+		}
+
+		// para depurar:
+		//
+		if($debug == true){
+			echo CJSON::encode(array('fieldmap'=>$fieldmap,'values'=>$values));
+			die("<hr/>".CJSON::encode($mapped_values));
+		}
+
+		$email = '';
+		if(isset($mapped_values['email']))
+			$email = $mapped_values['email'];
+		if(empty($email)){
+			// hay algun problema con los valores entregados
+			$errorResult = 'El email no esta presente en los datos entregados';
+			return false;
+		}
+
+		// primero pedirle a cruge que inicie sesion
+		// con el 'email' detectado. (si el caso es google, solo vendra email,
+		// si el caso es facebook vendra username e email, por eso usamos 
+		// email como base).
+		$crugeUser = $this->loginUser($email);
+
+		// PASO 4. Quiza el usuario no exista y haya que registrarlo, por 
+		// tanto aplicariamos una logica de negocio propia de tu aplicacion.
+		// si el usuario ya estaba registrado loginUser retornara ese usuario.
+		$logged_on = false;
+		if($crugeUser == null){
+			// usuario no registrado en Cruge, segun tu decision, podemos
+			// aplicar ciertas modalidades:
+			//	'auto', 'manual' o 'none'
+			
+			$modalidad = 'auto';
+
+			if($modalidad == 'auto'){
+				// automaticamente registra al usuario y le inicia sesion
+				//
+				$crugeUser = $this->createNewUser($mapped_values);
+				if($crugeUser == null){
+					$errorResult = 'No se pudo crear el usuario';
+					return false;
+				}
+				$crugeUser = $this->loginUser(
+						$mapped_values['email']);
+				if($crugeUser != null){
+					$logged_on = true;
+				}
+				else{
+					$errorResult = 'No se pudo iniciar sesion.';
+					return false;
+				}
+			}elseif($modalidad == 'manual'){
+				// le pone algunos campos prefijados obtenidos de facebook
+				// o google, pero el usuario debe continuar su proceso
+				// de registro manualmente
+				
+				// el actionRegistration de cruge ofrece una ventaja:
+				// se le puede dar un nombre de variable de sesion en la cual
+				// se almacenan datos para que inicialize el usuario antes
+				// de presentar el form de registro.
+				$s = new CHttpSession();
+				$s->open();
+				$s['_crugeregistration_'] = $mapped_values;
+				$s->close();
+
+				// nos vamos al action de registro de Cruge pasandole
+				// como argumento esta variable de sesion:
+				$errorResult = 'registration';
+				return array(
+					'/cruge/registration','datakey'=>'_crugeregistration_');
+			}elseif($modalidad == 'none'){
+				// no esta permitido el registro por facebook o google:
+				$errorResult = 'Debe registrarse manualmente.';
+				return false;
+			}
+		}
+		else{
+			$logged_on = true;
+		}
+
+		if($logged_on == true){
+			// el usuario ya estaba registrado en Cruge
+			// lo llevamos a la pagina de usuario bienvenido de cruge
+			//
+			// returnUrl fue establecido automaticamente por:
+			//		cruge.models.filters.CrugeDefaultSession::onLogin
+			//	al valor de tu configuracion:  'afterLoginUrl'
+			return Yii::app()->user->returnUrl;
+		}
+		else{
+			$errorResult = 'No se pudo iniciar sesion con su cuenta.';
+			return false;
+		}
+		
+	}
 }

controllers/UiController.php

 		}
 		$this->render("usermanagementcreate",array('model'=>$model));
 	}
-	public function actionRegistration(){
+	public function actionRegistration($datakey=''){
 
 		$this->layout = CrugeUtil::config()->registrationLayout;
 
 
 		// para que cargue los campos del usuario
 		Yii::app()->user->um->loadUserFields($model);
+
+		// 'datakey' es el nombre de una variable de sesion
+		// establecida por alguna parte que invoque a actionRegistration
+		// y que se le pasa a este action para de ahi se lean datos.
+		//
+		// el dato esperado alli es un array indexado ('attribuye'=>'value')
+		// tales valores deberan usarse para inicializar el formulario
+		// del usuario como se indica aqui:
+		//
+		// ejemplo de array en sesion:
+		//	array('username'=>'csalazar','email'=>'micorreo@x.com'
+		//	,'nombre'=>'christian', 'apellido'=>'salazar')
+		//
+		// siendo: "nombre" y "apellido" los nombre de campos personalizados
+		//	que inmediantamente tras registro seran inicializados.
+		//
+		if($datakey != null){
+			// leo la data de la varibale de sesion
+			$s = new CHttpSession();
+			$s->open();
+			$values = $s[$datakey];
+			$s->close();
+			// asumo que es un array, asi que aqui vamos
+			// 
+			$model->username = $values['username'];
+			$model->email = $values['email'];
+			// ahora, procesa los campos personalizados,
+			// rellenando aquellos mapeados contra los campos existentes:
+			foreach($model->getFields() as $f)
+				if(isset($values[$f->fieldname]))
+					$f->setFieldValue($values[$f->fieldname]);
+		}
+
 		if(isset($_POST[CrugeUtil::config()->postNameMappings['CrugeStoredUser']]))
 		{
 			$model->attributes=$_POST[CrugeUtil::config()->postNameMappings['CrugeStoredUser']];

models/data/CrugeStoredUser.php

 	public function rules()
 	{
 		return array(
-			array('username','match','pattern'=>'/^[a-z0-9_-]{3,15}$/'
+			array('username','match','pattern'=>'/^[a-zA-Z0-9\_\-\.]{3,45}$/'
 				, 'message'=>CrugeTranslator::t("nombre de usuario no es valido")),
 			array('username,email', 'required'),
 			
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.