Commits

christiansalazar committed 6f5d113

caso cuando cruge_system no tiene registros, readme y fix de postgre sql

Comments (0)

Files changed (3)

 * Apache/2.0.58
 
 ##Que es Cruge ?
- 
+
  Cruge te permite administrar y controlar de forma muy eficiente y segura a tus usuarios y los roles que ellos deban tener en tu aplicacion.
- 
+
  Cruge tiene una alta Arquitectura OOP, basada en interfaces, lo que ayuda enormemente a usarla sin modificar en lo absoluto su propio core. Si necesitas cambiar de ORDBM, cruge lo permite.  Si necesitas extender el funcionamiento de autenticacion para admitir nuevos metodos tambien lo permite mediante la implantacion de filtros de autenticacion, incluso dispones ademas de filtros insertables para controlar el otorgamiento de una sesion a un usuario y finalmente para controlar los registros y actualizaciones de perfil de tus usuarios. Todo eso sin tocar en lo absoluto el core de Cruge.
- 
+
  Cruge es un API, que incluye una interfaz de usuario predeterminada con el objeto que puedas usar el sistema como viene ahorrandote mucho tiempo. Esta interfaz hace uso del API de forma estricta, es decir, no hay "dependencias espaguetti" las cuales son las primeras destructoras de todo software.
- 
+
  La arquitectura que tu usar�s en Cruge es asi:
- 
+
 	[Tu Aplicacion]--->[Yii::app()->user]			acceso a funciones muy basicas de autenticacion
 	[Tu Aplicacion]--->[Yii::app()->user->ui]		provee enlaces a funciones de la interfaz
 	[Tu Aplicacion]--->[Yii::app()->user->um]		provee acceso al control de los usuarios
 	[Tu Aplicacion]--->[Yii::app()->user->rbac]		provee acceso a las funciones de RBAC
-	
+
 internamente esta arquitectura dentro de Cruge es asi:
 
 	[Tu Aplicacion]--->[Cruge]--->[API]---->[Factory]---->[modelos]
- 
+
 esto significa, que aun dentro de Cruge las dependencias son estrictamente organizadas, es decir, no ver�s en ningun lado que el API vaya a instanciar a un modelo cualquiera, si eso fuera asi estariamos hablando de otra "extension" espaguetti, como aquellas que solo le funcionan a su creador, o que en el mejor de los casos, funcionan...pero manipulandoles el core.
- 
+
  Cruge es una extension en todo lo ancho de la palabra, realmente extiende las funciones basicas
  de manejo de usuario de Yii Framework, incorporando mas funciones en los paquetes originales.
- 
+
  La interfaz de usuario de Cruge es opcional, con esto quiero decirte que puedes usar Cruge en modo API, para lo cual debes conocer el modelo con detalles, aunque es muy intuitivo y de referencias cortas, para hacerlo entendible.
- 
- 
+
+
 ---
 
-##Instalaci�n 
+##Instalaci�n
 
-Primero voy a asumir que Cruge ha sido descargado a tu carpeta: 
+Primero voy a asumir que Cruge ha sido descargado a tu carpeta:
 
 	/protected/modules/cruge/
-	
+
 puedes descargar cruge directamente desde un ZIP, o mediante un comando GIT como: git clone [URL DE GIT].
 
 En el archivo de configuraci�n de tu aplicacion (config/main.php) deberas colocar lo siguiente:
- 
+
 	1.	dentro de 'import' agregar:
 			'application.modules.cruge.components.*',
 			'application.modules.cruge.extensions.crugemailer.*',
 				'availableAuthMethods'=>array('default'),
 				'availableAuthModes'=>array('username','email'),
 				'baseUrl'=>'http://coco.com/',
-				
+
 				 // NO OLVIDES PONER EN FALSE TRAS INSTALAR
 				 'debug'=>true,
 				 'rbacSetupEnabled'=>true,
 				 'allowUserAlways'=>true,
-				 
+
 				// MIENTRAS INSTALAS..PONLO EN: false
 				// lee mas abajo respecto a 'Encriptando las claves'
 				//
-				'useEncryptedPassword' => false,	
-				
-				
+				'useEncryptedPassword' => false,
+
+
 				// manejo del layout con cruge.
-				// 
+				//
 				'loginLayout'=>'//layouts/main',
 				'registrationLayout'=>'//layouts/main',
 				'activateAccountLayout'=>'//layouts/main',
 				'editProfileLayout'=>//puedes '//layouts/main',
-				// en la siguiente puedes especificar el valor "ui" o "column2" para que use el layout 
-				// de fabrica, es basico pero funcional.  si pones otro valor considera que cruge 
+				// en la siguiente puedes especificar el valor "ui" o "column2" para que use el layout
+				// de fabrica, es basico pero funcional.  si pones otro valor considera que cruge
 				// requerir� de un portlet para desplegar un menu con las opciones de administrador.
-				// 
-				'generalUserManagementLayout'=>'ui', 
+				//
+				'generalUserManagementLayout'=>'ui',
 			),
 
 	3.	dentro de 'components' agregar:
 			),
 
 	4.	crea las tablas requeridas en la base de datos de tu aplicacion, usa el script:
-		
+
 		<tuaplicacion>/protected/modules/cruge/data/cruge-data-model.sql
-		
+
 		aqui se va a crear automaticamente un usuario para que puedas comenzar, toma nota:
-		
+
 <div style='color: blue;'>
 usuario=<b>admin</b>
 clave=<b>admin</b>
 </div>
-	
-	5.  Configura el menu de tu aplicacion para que incopore a Cruge, para ello 
-	edita tu archivo: 
-		/protected/views/layouts/main.php 
-	y sustituye el componente CMenu por el que te doy a continuacion. 
+
+	5.  Configura el menu de tu aplicacion para que incopore a Cruge, para ello
+	edita tu archivo:
+		/protected/views/layouts/main.php
+	y sustituye el componente CMenu por el que te doy a continuacion.
 
 		<?php $this->widget('zii.widgets.CMenu',array(
 			'items'=>array(
 					, 'visible'=>!Yii::app()->user->isGuest),
 			),
 		)); ?>
-	
+
 ---
-		
+
 ##Uso b�sico de Cruge
- 
+
 ##Obtener un usuario:
- 
+
 	Con Yii::app()->user->um tienes acceso al API de usuarios de Cruge, la cual es:
 		cruge\components\CrugeUserManager.php
- 
+
 	ejemplos:
- 
-	 <?php 
+
+	 <?php
 		// POR SU USERNAME o EMAIL
 		$usuario = Yii::app()->user->um->loadUser('admin@gmail.com',true);
 		echo $usuario->username;
 		// por defecto es : false.
 	 ?>
 
-	 <?php 
+	 <?php
 		// POR SU ID
 		$usuario = Yii::app()->user->um->loadUserById(123,true);
 		echo $usuario->username;
 
 A veces es necesario crear un usuario desde nuestro sistema y no solo usando la interfaz de usuario que Cruge provee, por esto Cruge provee un simple metodo para crear un nuevo usuario:
 
-	<?php 
+	<?php
 		public function actionAjaxCrearUsuario(){
 			// asi se crea un usuario (una nueva instancia en memoria volatil)
-			$usuarioNuevo = Yii::app()->user->um->createBlankUser(); 
-			
+			$usuarioNuevo = Yii::app()->user->um->createBlankUser();
+
 			$usuarioNuevo->username = 'username1';
 			$usuarioNuevo->email = 'username1@gmail.com';
 			// la establece como "Activada"
 			Yii::app()->user->um->activateAccount($usuarioNuevo);
-			
+
 			// verifica para no duplicar
 			if(Yii::app()->user->um->loadUser($usuarioNuevo->username) != null)
 				{
 					echo "El usuario {$usuarioNuevo->username} ya ha sido creado.";
 					return;
 				}
-			
+
 			// ponerle una clave
 			Yii::app()->user->um->changePassword($usuarioNuevo,"123456");
-			
+
 			// guarda usando el API, la cual hace pasar al usuario por el sistema de filtros.
 			if(Yii::app()->user->um->save($usuarioNuevo)){
-			
+
 				echo "Usuario creado: id=".$usuarioNuevo->primaryKey;
 			}
 			else{
 				$errores = CHtml::errorSummary($usuarioNuevo);
-			
+
 				echo "no se pudo crear el usuario: ".$errores;
 			}
-		}	
+		}
 	?>
 
 ##Campos Personalizados:
 	<?php
 		echo "Su nombre es: ";
 		echo Yii::app()->user->getField('nombre');
-		
+
 		// en el caso del email use:
 		// (esto es porque cruge incopora el metodo getEmail a Yii::app()->user )
 		echo "Su email es:";
 		echo Yii::app()->user->email;
-		
+
 		// para acceder al objeto usuario (el CrugeStoredUser)
 		//
 		$usuario = Yii::app()->user->user;
-		
+
 		// para listar todos los campos personalizados del usuario indicado:
 		//
 		foreach(Yii::app()->user->user->fields as $campo)
 			echo "<p>campo: ".$campo->longname." es: ".$campo->fieldvalue;"</p>";
-		
+
 	?>
-	 
+
 ##Verificar un permiso de acceso:
 		aqui se pretende verificar si el usuario activo tiene asignado el rol 'admin':
-	
-		<?php 
-			if(Yii::app()->user->checkAccess('admin')){ 
-				... 
-			} 
+
+		<?php
+			if(Yii::app()->user->checkAccess('admin')){
+				...
+			}
 		?>
-	 
+
 ##Acceder a las variables del sistema:
 
-		<?php 
+		<?php
 			if(Yii::app()->user->um->getDefaultSystem()->getn('registerusingcaptcha')==1){
 				...
-			} 
+			}
 		?>
 
-##Acceder a la Interfaz de Usuario de Cruge (usando enlaces): 
+##Acceder a la Interfaz de Usuario de Cruge (usando enlaces):
 	Puedes invocar al API UI de Cruge para acceder a los enlaces:
 
 		<?php echo Yii::app()->user->ui->getLoginLink('iniciar sesion'); ?>
-	
+
 	o simplemente:
 
 		<?php echo Yii::app()->user->ui->loginLink; ?>
-	
+
 	La lista de enlaces disponibles es:
 
 	<?php echo Yii::app()->user->ui->loginLink; ?>
 	<?php echo Yii::app()->user->ui->passwordRecoveryLink; ?>
 	<?php echo Yii::app()->user->ui->userManagementAdminLink; ?>
 	<?php echo Yii::app()->user->ui->registrationLink; ?>
-	
+
 	**lo que no debes hacer es: hacer render de vistas internas de cruge, asi no funciona esto
 	porque le quitas la programacion cuando tu mismo renderizas las vistas**
-	
+
 ##Personalizando Cruge con el uso de Layouts
 
-Cruge te permite que su interfaz de usuario predeterminada pueda ajustarse a tu sitio web usando lo que en Yii se conoce como Layouts. 
+Cruge te permite que su interfaz de usuario predeterminada pueda ajustarse a tu sitio web usando lo que en Yii se conoce como Layouts.
 
 Por ejemplo, quieres que el formulario de registro de nuevo usuario se presente en un esquema de dise�o distinto al que yii trae por defecto, entonces tu podrias crear un nuevo layout que se ajuste a tus necesidades y luego indicarle a Cruge mediante la configuracion del componente cual seria ese layout a usar cuando un usuario quiera registrarse, asi:
 
 		),
 	?>
 
-Te cuidado especial con "generalUserManagementLayout": este es un layout especial, porque las funciones de administracion de usuarios requieren un Portlet para presentar las opciones administrativas, por defecto Cruge apunta este valor a: "ui", el cual es el nombre de un layout prefabricado que ya trae un Portlet, practicamente idendico al que Yii trae por defecto llamado //layouts/column2.  
+Te cuidado especial con "generalUserManagementLayout": este es un layout especial, porque las funciones de administracion de usuarios requieren un Portlet para presentar las opciones administrativas, por defecto Cruge apunta este valor a: "ui", el cual es el nombre de un layout prefabricado que ya trae un Portlet, practicamente idendico al que Yii trae por defecto llamado //layouts/column2.
 
-El Layout para UI de Cruge por defecto es: 
+El Layout para UI de Cruge por defecto es:
 
 		tuapp/protected/modules/cruge/views/layouts/ui.php
 
 Este menu ya viene listo en cruge, trae todos los items para que te evites el trabajo de ir
 a CrugeUi a ver cuales son los links.
 
-Para acceder al array de menu items lo haces desde: 
-	
+Para acceder al array de menu items lo haces desde:
+
 	<?php
 		$items = Yii::app()->user->ui->adminItems;
-		
+
 		// items sera una array listo para insertar en CMenu, BootNavbar o similares.
 	?>
-	
+
 Si usas bootstrap, puedes hacerlo asi:
 
 	<?php $this->widget('bootstrap.widgets.BootNavbar', array(
 			),
 		),
 	)); ?>
-	
-	
+
+
 ##Tras iniciar sesion quiero ir a una pantalla especifica. Como hacerlo ?
 
 Supongamos que quieres que tras iniciar sesion exitosamente con Cruge el usuario sea
-redirigido al actionBienvenido de siteController (index.php?r=site/bienvenido).  
+redirigido al actionBienvenido de siteController (index.php?r=site/bienvenido).
 
 Pues bien el metodo que aqui describo es algo estandar para Cruge o para Yii en general, no es nada nuevo.
 
-1. en siteController (en el controller de tu gusto) creas un action el cual desplegara la pagina 
+1. en siteController (en el controller de tu gusto) creas un action el cual desplegara la pagina
 que solo vera aquel usuario que haya iniciado sesion exitosamente.
 
-		<?php 
+		<?php
 			public function actionBienvenido(){
 				$this->render('bienvenido');
 			}
 		<?php
 			public function filters()
 			{
-				return array(	
-					'accessControl', 					
+				return array(
+					'accessControl',
 				);
 			}
 			public function accessRules()
 				);
 			}
 		?>
-	
+
 	con esto le estas diciendo a tu aplicacion que para el action "site/bienvenido" se requiere
-	que el usuario deba haber iniciado sesion exitosamente ( con cruge o con yii tradicional, 
-	ambos funcionan por la misma via de autenticacion, por eso y mas Cruge es una extension real y 
+	que el usuario deba haber iniciado sesion exitosamente ( con cruge o con yii tradicional,
+	ambos funcionan por la misma via de autenticacion, por eso y mas Cruge es una extension real y
 	no solo un monton de codigo raro ).
-	
+
 	de este modo, si un usuario invitado presiona el enlace "login" entonces tu lo envias
 	a site/bienvenido, si no ha iniciado sesion se le pediran credenciales y luego se le enviara
 	a la vista site/bienvenido. por tanto el paso 3 es requerido, a continuacion:
-	
-3. finalmente sustituye tu enlace a login por un enlace a site/bienvenido. 
+
+3. finalmente sustituye tu enlace a login por un enlace a site/bienvenido.
 
 
 Que sucedera ?
 (podriamos dibujar esto como un diagrama de secuencia en UML)
 
-a) Tu invitado visita tu website (no ha iniciado sesion aun por eso es un invitado) y 
+a) Tu invitado visita tu website (no ha iniciado sesion aun por eso es un invitado) y
 sigue el enlace 'login' o 'iniciar sesion' que tu has provisto (y que apunta a site/bienvenido como
 dice el paso 3).
 
 Como has visto Cruge es un sistema orquestado para trabajar en conjunto con el actual sistema
 estandar de autenticacion de Yii, por eso como dije antes es una extension: porque extiende la funcionalidad
 basica de Yii a un nivel mas alto.
-	
+
 ##Usando RBAC
 
 
 1. Consulta Manual de Permisos.
 Es basicamente el mismo mecanismo que provee Yii, pero en Cruge se ha ampliado un poco mas. Para usar este mecanismo: en cualquier parte de tu codigo fuente puedes poner lo siguiente:
 
-	<?php 
+	<?php
 		if(Yii::app()->user->checkAccess('puede_ver_menu_sistema')) { ...mostar menu sistema... }
 	?>
 
 
 	<?php
 		..cuerpo de tu controladora...
-		
+
 		public function filters()
 		{
 			return array(
-				array('CrugeAccessControlFilter'),	
+				array('CrugeAccessControlFilter'),
 			);
-		}	
-		
+		}
+
 		..cuerpo de tu controladora...
 	?>
 
 
 Ejemplo:
 
-	Un usuario cualquiera, incluso un invitado, intenta acceder a la siguiente URL: 
-		
+	Un usuario cualquiera, incluso un invitado, intenta acceder a la siguiente URL:
+
 		index.php?r=empleado/vernomina.
-	
+
 	pues bien, Cruge verificara dos cosas:
-	
+
 		a) el acceso a la controladora: 'Empleado'.
-		
+
 		b) el acceso al action 'Vernomina'.
-		
+
 	lo hara de esta forma:
-	
+
 		a) verifica si el usuario (aun invitado) tiene asignada la operacion: 'controller_empleado'
-		
+
 		b) verifica si el usuario (aun invitado) tiene asignada la operacion: 'action_empleado_vernomina'
-	
+
 	si ambas condiciones se cumplen (a y b) entonces tendr� acceso al action.
-	
-Si tu quieres denegar el total acceso a un controller simplemente no le asignas al usuario la operacion que tenga el nombre del controller antecedido de la palabra 'controller_'. 
 
-Si tu quieres denegar el acceso a un action de un controller simplemente no le asignas al usuario la operacion que tenga el nombre del action: 'action_nombrecontroller_nombreaction'. 
+Si tu quieres denegar el total acceso a un controller simplemente no le asignas al usuario la operacion que tenga el nombre del controller antecedido de la palabra 'controller_'.
+
+Si tu quieres denegar el acceso a un action de un controller simplemente no le asignas al usuario la operacion que tenga el nombre del action: 'action_nombrecontroller_nombreaction'.
 
 ##Programacion del RBAC: diferencias con otras extensiones.
 
-En el caso de Cruge, la programacion de RBAC no se hace "asumiendo que un usuario va pasar por ahi.." 
+En el caso de Cruge, la programacion de RBAC no se hace "asumiendo que un usuario va pasar por ahi.."
 (modo Yii Rights). En cambio en Cruge, debes "tratar de hacer pasar al usuario por donde quieres", este ultimo metodo, a mi juicio, es mas seguro porque te obliga a verificar que realmente el usuario pudo acceder o no a tal o cual parte.
 
 Cuando tu activas **'rbacSetupEnabled'=>true,** (ver tema siguiente) entonces causas que Cruge te mantenga informado de cuales operaciones, tareas o roles fallaron cuando se intento pasar por ellas(en otras palabras, cuales son requeridos), te lo ira informando al pie de la pagina.
 
 
 ##Modo de Programacion del RBAC
-	
+
 Para activarlo, en la configuracion de tu aplicacion debes considerar estos dos argumentos:
 
 **'rbacSetupEnabled'=>true,**
 		Permitira que las operaciones se vayan creando (valor true) a medida que vas probando el sistema, de lo
 		contrario deberas crear las operaciones a mano. Las operaciones que se crearan automaticamente
 		seran: 'controller_nombredetucontroller' y 'action_tucontroller_tuaction'.
-	
-		
-**'allowUserAlways'=>true,**		
+
+
+**'allowUserAlways'=>true,**
 
 		Permitira el paso (valor true) al usuario aunque este no tenga permiso. Cuando est�s
 		en produccion ponlo en 'false' lo que causara que el usuario reciba una excepcion.
 
 Para conocer que operaciones se requieren para un usuario especifico debes poner en tu layout principal la siguiente linea:
 
-	<?php 
-		echo Yii::app()->user->ui->displayErrorConsole(); 
+	<?php
+		echo Yii::app()->user->ui->displayErrorConsole();
 	?>
 
 	(no siempre se veran los mensajes de permisos requeridos, para ello usa el log, lee el item a continuacion)
-	
+
 ##Tips de Programacion del RBAC
 
 Cuando quieras programar el RBAC con cruge, usa dos navegadores: uno abierto con un usuario administrador, para que puedas ir activando las operaciones para un rol especifico a medida que sea necesario, y abre otro navegador con el usuario que tenga el rol que quieres programar. No olvides tener activado el flag: rbacSetupEnabled.
 Por ejemplo, quieres que el usuario 'juan' que tiene asignado el rol 'empleado_regular' tenga solo acceso
 solo a donde quieres, entonces en el segundo navegador inicia sesion con 'juan', y tratas de ir al menu u operacion requerida, cruge ira informando al pie de la pagina los permisos requieridos. Luego con el navegador que tiene abierto el usuario 'admin' entonces vas verificando los permisos y se los asignas al rol.
 
-Considera que cuando rbacSetupEnabled esta habilitado, entonces, asumiendo ademas que no hay ninguna operacion creada iras viendo que cruge creara las operaciones automaticamente de acuerdo a donde el usuario 'juan' vaya pasando, solo las crea si previamente no existen. 
+Considera que cuando rbacSetupEnabled esta habilitado, entonces, asumiendo ademas que no hay ninguna operacion creada iras viendo que cruge creara las operaciones automaticamente de acuerdo a donde el usuario 'juan' vaya pasando, solo las crea si previamente no existen.
 
 Ejemplo: no hay ninguna operacion creada, entonces el usuario juan quiere entrar a 'site/index', por tanto,
 si la controladora 'siteController' esta manejada con el filtro: 'CrugeAccessControlFilter' (ver tema mas arriba) entonces veras que se creara una operacion llamada 'site_controller' y otra 'action_site_index', deberas entonces asignarle estas dos operaciones al rol al cual 'juan' pertenece.
-	
-##Usando el LOG 	
-	
+
+##Usando el LOG
+
 Adicionalmente todos los errores de permiso que se generen seran reportados en el log bajo el key 'rbac', para poder visualizar los errores en protected/runtime/application.log deberas configurar tu config/main.php para indicar el key del log:
 
 	<?php
 			),
 		),
 	?>
-	
+
 eso causara que en:
 
 		protected/runtime/application.log
 		iduser=2
 		tipo:operacion
 		itemName:action_catalog_imageh
-	
-##El superUsuario	
+
+##El superUsuario
 
 Por defecto, cruge considera a un superusuario, para proposito de administracion, depuracion etc.
 Para que cruge considere a un usuario como un "superusuario" entonces este debera tener como username el mismo valor configurado en CrugeModule::superuserName. Por defecto este valor viene configurado como 'admin'.
 			'superuserName'=>'administrador', (suponiendo que no te gusta 'admin')
 			...
 		),
-	
+
 Como trata Cruge al superAdministrador ?
 
 Basica y unicamente en: cruge\components\CrugeWebUser.php, en el metodo: checkAccess, si es un superadmin, entonces siempre le dara permiso.
 
 Como saber si estamos ante un superAdministrador ?
 
-Consultando a: 
-	Yii::app()->user->getIsSuperAdmin() 
-mas corto: 
+Consultando a:
+	Yii::app()->user->getIsSuperAdmin()
+mas corto:
 	Yii::app()->user->isSuperAdmin
-	
+
 ##El usuario Invitado
 
-Cruge hace especial tratamiento al usuario invitado. Para esto CrugeModule contiene un atributo llamado **guestUserId** , el cual es usado para indicarle al sistema Cruge cual de sus usuarios existentes en la base de datos de usuarios es el invitado. 
+Cruge hace especial tratamiento al usuario invitado. Para esto CrugeModule contiene un atributo llamado **guestUserId** , el cual es usado para indicarle al sistema Cruge cual de sus usuarios existentes en la base de datos de usuarios es el invitado.
 
 Por defecto cuando Cruge es instalado desde el script de base de datos (protected/modules/cruge/data), se crean dos usuarios:
 
 
 2. Asignale a ese rol las operaciones necesarias, por ejemplo 'controller_site', 'action_site_index', 'action_site_contact', 'action_site_login' y otras que vayas viendo que se requieran (usa el LOG, ver tema anterior).
 
-3. Asigna este rol creado al usuario invitado. 
+3. Asigna este rol creado al usuario invitado.
 
 No necesariamente el rol del 'invitado' debe llamarse 'invitado'. Por conveniencia es sano que asi sea pero no es indispensable.
 
 **Como trata el sistema de usuarios al inviatdo**
 
-Por defecto en YII cuando tu llamas a **Yii::app()->user->id** esta devuelve 0 (cero) cuando un usuario es invitado.  
+Por defecto en YII cuando tu llamas a **Yii::app()->user->id** esta devuelve 0 (cero) cuando un usuario es invitado.
 
 En Cruge esta misma llamada a **Yii::app()->user->id** devolver� al valor de: CrugeModule::guestUserId, por defecto 2.
 
 permite saber si un usuario actualizo su perfil.
 protected\modules\cruge\models\filters\DefaultUserFilter.php
 
-Debido a lo extenso de Cruge no he tenido tiempo de documentar bien estos filtros, pero es bastante intuitivo. 
+Debido a lo extenso de Cruge no he tenido tiempo de documentar bien estos filtros, pero es bastante intuitivo.
+
+
+##Errores Frecuentes
+
+"no se pudo hallar el sistema de configuracion, quiza la tabla cruge_system esta vacia o ha indicado un identificador de sistema inexistente."
+este error es generado cuando se ha instalado cruge pero la tabla cruge_system no tienen ningun dato. por defecto cuando el script sql se instala por primera vez este trae datos para cruge_system.  Cruge_system es una fila que informa acerca
+de la variables de un sistema, pueden crearse varias configuraciones a las cuales se les hace referencia por su nombre, si en config/main hay una referencia a esta configuracion y esta no existe en cruge_system entonces este error aparecera.
 
 
 ##Traduccion
 
 
 
-[1]: https://bitbucket.org/christiansalazarh/cruge/downloads/screenshots.gif	
+[1]: https://bitbucket.org/christiansalazarh/cruge/downloads/screenshots.gif

components/CrugeFactory.php

-<?php 
+<?php
 /**	CrugeFactory
 
 	centraliza la creacion de instancias para lograr dar abstraccion al modelo OOP.
-	
+
 	es importante comprender que CrugeFactory es un punto para lograr la abstraccion
 	solo factory accede a los modelos especificos, es decir, en ninguna parte
 	se veran llamadas directas a clases del modelo, en cambio a interfaces si.
-	
+
 	dependencias:
-	
+
 		1. CrugeUtil
 		2. package cruge.models
 		3. package cruge.models
 
 	/** devuelve el identificador activo de sesion pero bajo interpretacion de una clase
 	que implemente a ICrugeSession
-	
+
 	*/
 	public function getICrugeSession($idsession) {
 		return CrugeSession::loadModel($idsession);
 	public function getICrugeSessionCreate($iduser,$durationMins) {
 		return CrugeSession::create($iduser,$durationMins);
 	}
-	
+
 	public function getICrugeSystemByName($systemName){
 		$system = CrugeSystem::findSystem($systemName);
 		if($system == null)
 				$sys->registerusingactivation = 0;
 				$sys->registerusingcaptcha=0;
 				$sys->registerusingterms=0;
-				
-				
+
+
 				if($sys->insert()){
 					return $sys;
 				}
 				}
 			}
 			else{
-				throw new CrugeException("no se pudo hallar el sistema de configuracion");
+				/*
+				  la causa mas comun de este error es que la tabla cruge_system esta vacia
+				*/
+				throw new CrugeException("no se pudo hallar el sistema de configuracion, quiza la tabla cruge_system esta vacia o ha indicado un identificador de sistema inexistente.");
 			}
 		}
 		else
 	public function getICrugeSystemList(){
 		return CrugeSystem::listModels();
 	}
-	
+
 	public function getICrugeStoredUserList($param=array()){
 		return CrugeStoredUser::listModels($param);
 	}
 	public function getICrugeFieldSortFieldNames(){
 		return CrugeField::getSortFieldNames();
 	}
-	
-	
+
+
 	/*
 		buscador multiproposito.  $id puede ser el iduser o el authkey, depende del flag boolean
 		de seleccion: $boolFindByKey
 	*/
-	public function getICrugeStoredUserLoadModel($id,$booleanThrowsExceptionIfNull=true	
+	public function getICrugeStoredUserLoadModel($id,$booleanThrowsExceptionIfNull=true
 		,$boolFindByKey=false){
 		if($boolFindByKey == false){
 			$model = CrugeStoredUser::loadModel($id);
 	}
 	/*  entrega la lista de campos, si se le da el usuario, va a pasar el valor del usuario
 		al fieldvalue del campo.
-	
+
 		@returns una lista (array) de instancias de ICrugeField
-		
+
 		si $userInst es una instancia entonces renderiza cada campo con el valor asignado
 		al usuario.  si $userInst es null solo se retorna la lista de campos sin renderizar valor
 	*/
 	public function getICrugeFieldListModels(/*ICrugeStoredUser*/ $userInst=null){
 		$fields = CrugeField::listModels();
-		
+
 		foreach($fields as $f)
 			$f->setFieldValue($f->predetvalue);
-			
+
 		// ahora, asocia cada campo con el valor del usuario seleccionado
 		if($userInst != null){
 
 			// busca los campos de este usuario
 			$fieldvalues = CrugeFieldValue::listModels($userInst->getPrimaryKey());
-			foreach($fields as $f)	
-				foreach($fieldvalues as $fv)	
+			foreach($fields as $f)
+				foreach($fieldvalues as $fv)
 					if($f->idfield == $fv->idfield){
 						$f->setFieldValue($fv->value==null ? "" : $fv->value);
 						break;
 					}
-				
+
 		}
 		return $fields;
 	}
 	/*
 		va a retornar un objeto que implementa a ICrugeFieldValue, el cual esta compuesto
 		de dos objetos: el usuario y el campo.
-		
-		importante: si el campo solicitado no es hallado entonces sera creado para asegurar 
+
+		importante: si el campo solicitado no es hallado entonces sera creado para asegurar
 		que siempre exista.
 	*/
 	public function getICrugeFieldValue(ICrugeStoredUser $user, ICrugeField $field){
 		$model = CrugeFieldValue::loadModelBy($user->getPrimaryKey(),$field->getPrimaryKey());
 		if($model == null)
-			{	
+			{
 				// lo crea
 				$model = new CrugeFieldValue();
 				$model->iduser = $user->getPrimaryKey();
 		$model->showinreports = false;
 		return $model;
 	}
-	
-	
+
+
 	/*
 		se trae un modulo de autenticacion hallado por su nombre (authName)
 		retorna una instancia de este, siempre, sino una excepcion
-		
+
 		@returns instancia de ICrugeAuth buscada por su nombre y configurada en el sistema
 	*/
 	public function getICrugeAuthByName($authName){
 	}
 	/** busca un ICrugeStoredUser en el almacen de datos que cumpla con el identificador solicitado
 		(usernameORemail) y que cumpla con la configuracion general del sistema
-		
+
 		@returns instancia que implementa a: ICrugeStoredUser o null
 	*/
 	public function getICrugeStoredUser($usernameORemail) {
 			}
 			return $model;
 		}
-	}	
+	}
 	public function isAuthMethodAvailable($authName){
 		foreach(CrugeUtil::config()->availableAuthMethods as $key=>$val){
 			if($key == $authName)
 	}
 
 
-	
+
 	/** entrega el filtro para procesar sesiones de usuario.
-		
+
 		si sessionfilter no es declarada en config, entonces se usa a _defaultSessionFilter.
-	
+
 		@returns instancia que implementa a ICrugeSessionFilter.
 	*/
 	public function getICrugeSessionFilter() {
-	
+
 		Yii::log(__CLASS__."\ngetICrugeSessionFilter\n","info");
-	
+
 		//$filterClass = $this->sessionfilter;
 		//if($filterClass == null || $filterClass=='')
 		$filterClass = CrugeUtil::config()->defaultSessionFilter;
 				return new $className();
 			}
 			else{
-				
+
 				Yii::log("clase no hallada.".$className,"error");
 				throw new CrugeException("clase no hallada. ver log.");
 			}
 	/*
 		este metodo prepara y entrega los metodos de autenticacion
 		normalmente, quien llama a este metodo es: CrugeUser en authenticate()
-		
+
 		las clases de autenticacion estan en models.auth y cada debe implementar
 		la interfaz components.ICrugeAuth y debe extender de CBaseUserIdentity
-		
+
 		@return Un array de instancias de cada clase de autenticacion, solo de aquellas existentes
 		en el paquete models.auth
 	*/
 	private function _getAuthModes(){
 		if(CrugeUtil::config()->_lazyAuthModes == null){
 			CrugeUtil::config()->_lazyAuthModes = array();
-			
+
 			// levantamos las clases directo del disco
 			$ruta = Yii::getPathOfAlias('cruge.models.auth');
 			Yii::log("levantando clases de autenticacion de:\n".$ruta."\n","info");
 				if(CrugeUtil::isPhpFile($f)){
 					$className = CrugeUtil::getClassNameFromPhp($f);
 					if(class_exists($className)){
-					
+
 						if(!is_subclass_of($className, 'CBaseUserIdentity')){
 							Yii::log("clase de autenticacion no es subclase de "
 								."CBaseUserIdentity. clase=".$className,"error");
 						// se asume que la clase provee la interfaz ICrugeAuth
 						// y crea la instancia:
 						$inst = new $className();
-						
+
 						if(self::isAuthMethodAvailable($inst->authName())==true){
 							CrugeUtil::config()->_lazyAuthModes[] = $inst;
 						}
 					}
 				}// endif isPhpFile
 			}
-				
+
 			if(count(CrugeUtil::config()->_lazyAuthModes) == 0){
-				// 
+				//
 				// si llegamos a este punto es porque no se ha configurado
 				// ningun metodo de autenticacion, o porque la carpeta models.auth esta vacia
 				// o ninguno de sus archivos cumple con lo necesario.
 				throw new CrugeException("ninguna clase de autenticacion instalada "
 					."cumplio requerimientos");
 			}
-				
+
 		}// endif lazy init
 		return CrugeUtil::config()->_lazyAuthModes;
 	}
-	
+
 	/* obtiene el ICrugeStoredUser desde una sesion ICrugeSession
-	
+
 		porque la pongo aqui y no como una relacion de ICrugeSession directamente: para evitar una dependencia.
-		
+
 		@returns ICrugeStoredUser o null
 	*/
 	public function getSessionUser(ICrugeSession $sesion){
 
 	/*
 		crea una instancia del filtro ICrugeUserFilter instalado en el modulo,
-		
+
 		este metodo es referenciado en CrugeUserManager::save()
-		
+
 		@returns instancia que implementa a ICrugeUserFilter
 	*/
 	public function getUserFilter(){
-		
+
 		$filterClass = CrugeUtil::config()->userFilter;
 
 		$filepath = Yii::getPathOfAlias($filterClass).".php";
 				return new $className();
 			}
 			else{
-				
+
 				Yii::log(__METHOD__." clase no hallada.".$className,"error");
 				throw new CrugeException("clase no hallada. ver log.");
 			}

data/cruge-data-model-postgres.sql

 	----------------
 
 	lista de tablas de Cruge.
-	
+
 	aqui van dos grupos:
-	
+
 		1. aquellas propias de Cruge.
-		
+
 		2. aquellas del paquete de autenticacion oficial del Yii, pero con una modificacion minima.
-		
-	tablas: 
+
+	tablas:
 		cruge_system, cruge_user, cruge_session, cruge_field, cruge_fieldvalue
 			@author: Christian Salazar H. <christiansalazarh@gmail.com> @bluyell
-	
+
 		cruge_authitem, cruge_authitemchild, cruge_authassignment
 			paquete original de Yii, pero con modificaciones en cruge_authassignment
 			para relacionarla con cruge_user (foregin key on delete cascade), ademas
   registerusingtermslabel VARCHAR(100) NULL ,
   PRIMARY KEY (idsystem) )
 ;
-
+delete from cruge_system;
+INSERT INTO cruge_system (idsystem,name,largename,sessionmaxdurationmins,sessionmaxsameipconnections,sessionreusesessions,sessionmaxsessionsperday,sessionmaxsessionsperuser,systemnonewsessions,systemdown,registerusingcaptcha,registerusingterms,terms,registerusingactivation,defaultroleforregistration,registerusingtermslabel) VALUES
+ (1,'default',NULL,30,10,1,-1,-1,0,0,0,0,'',0,'','');
 
 CREATE TABLE cruge_session (
   idsession serial,
   state integer NULL DEFAULT 0 ,
   totalsessioncounter integer NULL DEFAULT 0 ,
   currentsessioncounter integer NULL DEFAULT 0 ,
-  PRIMARY KEY (iduser) 
+  PRIMARY KEY (iduser)
   )
 ;
 
   useregexp VARCHAR(512) NULL ,
   useregexpmsg VARCHAR(512) NULL ,
   predetvalue varchar(4096),
-  PRIMARY KEY (idfield) 
+  PRIMARY KEY (idfield)
   );
 
 CREATE  TABLE cruge_fieldvalue (