Commits

christiansalazar committed f0a6268

FIX ISSUE #66 - customizable user description

  • Participants
  • Parent commits 75175ec

Comments (1)

  1. Christian Salazar repo owner

    CrugeStoredUser.getUserDescription()

    (ver ejemplo de como se puede usar)

    leer acerca de este cambio: https://bitbucket.org/christiansalazarh/cruge/commits/ceb8b3bcfe3b69dceb07b18648181f558ffd67ec

    se ha agregado un nuevo parametro accesible desde config/main: "userDescriptionFieldsArray" este parametro permite que se pueda especificar una lista de campos personalizados (incluyendo los campos fijos: username e email) para que el nuevo metodo creado para CrugeStoredUser.getUserDescription() devuelva esos valores, permitiendo asi la personalizacion de la descripcion del usuario.

    funciones nuevas:

    // 1) entrega una descripcion del usuario basada en la config (ver nota arriba)
    echo "usuario: ". $usuario->getUserDescription();  
    
    // 2)
    // acceso desde crugeuser a los campos personalizados.  retorna la instancia de CrugeField
    // hecho desde un inicio desde el API pero ahora agregado aqui para mayor facilidad.
    $field_firstName = $usuario->getCustomField("firstname");
    echo "firstname=".$field_firstName->getFieldValue();
    
    
    // 3) 
    //  lo mesmo, pero con el valor en vez de la instancia (caso2).
    //
    $fieldValue_firstName = $usuario->getCustomFieldValue("firstname");
    echo "firstname=".$fieldValue_firstName;
    

    Agregados del commit:

    Tambien se ha arreglado la vista "Assign roles to users" (del panel de admin) para que en vez del email fijo ahora en cambio consuma a este nuevo metodo $user->getUserDescription(), lo cual respondera a config y mostrara en esa lista lo que el desarrollador quiera y no lo que yo puse en modo hard-wired (antes email).

    La via estandar para acceder a campos personalizados siempre sera:

    $nombre = Yii::app()->user->um->getFieldValue(Yi::app()->user->id,'nombre'); 
    // (el argumento Yii::app()->user->id pudiera ser ese mismo o una instancia de CrugeStoredUser, se aceptan ambas)
    

Files changed (6)

File CrugeModule.php

 											// a Yii::app()->user->checkAccess retornara true
 											// si el superuserName coincide con este valor
 
+	// permite que se puedan configurar los campos (incluso personalizados)
+	//	a la hora de consultar a:  $usuario->getUserDescription()  (CrugeStoredUser)
+	//
+	//	se debe retornar un array con "username" o "email" o cualquier nombre de campo personalizado
+	//  ejemplos: array("firstname","lastname","chipnumber","address")
+	//	lo cual concatenara una lista separada por comas con los valores de estos
+	//	campos.
+	//
+	public $userDescriptionFieldsArray = array("email" /*, firstname, lastname */);
+
+
 	public $afterLoginUrl;				// por defecto son usadas por el filtro de sesion: DefaultSessionFilter
 	public $afterLogoutUrl;				//	tras el evento onLogin y onLogout
 	public $afterSessionExpiredUrl;		//

File components/CrugeUserManager.php

 
         es una funcion helper que invoca a listUsers con los parametros adecuados.
     */
-    public function listUsersDataProviderFromArray($arrayUserId, $pageSize = 20)
+    public function listUsersDataProviderFromArray($arrayUserId, $pageSize = 20
+			,$boolLoadCustomFields = false)
     {
-        return $this->listUsers(null, true, $pageSize, true, $arrayUserId);
+        return $this->listUsers(null, true, $pageSize, true, $arrayUserId
+				,$boolLoadCustomFields);
     }
 
-    public function listAllUsersDataProvider($params = array(), $pageSize = 20)
+    public function listAllUsersDataProvider($params = array(), $pageSize = 20
+			,$boolLoadCustomFields = false)
     {
-        return $this->listUsers($params, true, $pageSize, false, null);
+        return $this->listUsers($params, true, $pageSize, false, null
+				,$boolLoadCustomFields);
     }
 
     /*
         $boolUseArray = false
         ,
         $buildFromThisUsersIdArray = null
+		,
+		$boolLoadCustomFields = false
     ) {
         $ar = array();
         // si buildFromThisUsersIdArray es null, entonces se buscan los usuarios directamente
             }
         }
 
+		// levanta sus campos personalizados, segun peticion explicita
+		// podria ralentizar en alto volumen de usuarios..asi que cuidado.
+		if($boolLoadCustomFields == true)
+			foreach($ar as $user)
+				$this->loadUserFields($user);
 
         if ($booleanAsDataProvider == true) {
             $sortFields = CrugeFactory::get()->getICrugeStoredUserSortFieldNames();

File controllers/UiController.php

 
         Yii::log(__CLASS__ . "\nactionRbacUsersAssignments\ndebug:\n" . $debug, "info");
 
+		$boolLoadCustomFields = true;
+
         $roleUsersDataProvider = $um->listUsersDataProviderFromArray(
             $rbac->getUsersAssigned($authItemName),
-            $pageSize
+            $pageSize, $boolLoadCustomFields
         );
-        $allUsersDataProvider = $um->listAllUsersDataProvider(array(), $pageSize);
-
+        $allUsersDataProvider = $um->listAllUsersDataProvider(
+			array(), $pageSize, $boolLoadCustomFields);
 
         $this->render(
             'rbacusersassignments'

File models/data/CrugeStoredUser.php

  * @property string $actdate    fecha de activacion
  * @property string $logondate    ultimo login exitoso
  * @author: Christian Salazar H. <christiansalazarh@gmail.com> @bluyell
- * @license protected/modules/cruge/LICENCE
+ * @license protected/modules/cruge/LICENSE
  */
 class CrugeStoredUser extends CActiveRecord implements ICrugeStoredUser
 {
     // ver acerca de: cruge\components\CrugeUserManager.php::createBlankUser
     public $bypassCaptcha;
 
+	public function getCustomFieldValue($fieldname, $defValue=""){
+		$field = $this->getCustomField($fieldname);
+		if($field != null)
+			return $field->getFieldValue();
+		return $defValue;
+	}
+
+	public function getCustomField($fieldname){
+		foreach($this->getFields() as $obj)
+			if($fieldname == $obj->fieldname)
+				return $obj;
+		return null;
+	}
+
+	public function getUserDescription(){
+		$fieldNames = CrugeUtil::config()->userDescriptionFieldsArray;
+		$tmp = "";
+		if(in_array("username",$fieldNames))
+			$tmp .= ",".$this->username;
+		if(in_array("email",$fieldNames))
+			$tmp .= ",".$this->email;
+		if($fieldNames != null)
+		foreach($fieldNames as $fname)
+			if(($fname != "username") && ($fname != "email"))
+			$tmp .= ",".$this->getCustomFieldValue($fname,"nohay_".$fname);
+		if($tmp == "")
+			$tmp = $this->getUsername();
+		return ltrim($tmp,", ");
+	}
 
     /* es un loadModel de uso multiple. $modo puede ser: 'iduser','username' o 'email' para
         indicar por cual campo se quiere cargar el modelo.

File resources/estilos.css

 /*
 	auth-item muestra los CAuthItems, 
 */
-/*
  1. Christian Salazar repo owner

    este agregado es porque en un anterior commit se elimino debido a la nueva forma de presentar el rbac, pero termino afectando la vista de asignacion de roles.

+
 ul.auth-item {
 	overflow: auto;
 	list-style: none;
 ul.auth-item  li.loop{
 	background-color: #ddd;
 }
-*/
+
 
 #auth-item-tree ul ul li{
 	

File views/ui/rbacusersassignments.php

 	Yii::app()->clientScript->registerCoreScript('jquery');
 	$loaderSrc = Yii::app()->user->ui->getResource('loading.gif');
 	$loaderImg = "<img src='{$loaderSrc}'>";
+
+	$selectedUserGetter = 'userdescription';
 ?>
 <div class='form'>
 <div class='crugepanel user-assignments-role-list'>
 				array(
 					'class'=>'CCheckBoxColumn'
 				),
-				'email',
+				$selectedUserGetter,
 			),
 		));
 	?>	
 				array(
 					'class'=>'CCheckBoxColumn'
 				),
-				'email',
+				$selectedUserGetter,
 			),
 		));
 	?>