Parcourir la source

Preserve the initial sort order on lists by determining the default sort order of the tables based on the equivalence between the "friendlyname" and another actual field of the class.

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@3774 a333f486-631f-4898-b8df-5754b55c2be0
dflaven il y a 9 ans
Parent
commit
d9653c3e57

+ 6 - 0
application/datatable.class.inc.php

@@ -748,6 +748,12 @@ class DataTableSettings implements Serializable
 				{
 					$sSort = $aSortOrder['friendlyname'] ? 'asc' : 'desc';
 				}
+				$sNormalizedFName = MetaModel::NormalizeFieldSpec($sClass, 'friendlyname');
+				if(array_key_exists($sNormalizedFName, $aSortOrder))
+				{
+					$sSort = $aSortOrder[$sNormalizedFName] ? 'asc' : 'desc';
+				}
+				
 				$aColumns[$sAlias]['_key_'] = $oSettings->GetFieldData($sAlias, '_key_', null, true /* bChecked */, $sSort);
 			}
 			foreach($aList as $sAttCode)

+ 56 - 0
core/metamodel.class.php

@@ -4920,6 +4920,62 @@ abstract class MetaModel
 			apc_delete($sAPCKey);
 		}
 	}
+	
+	/**
+	 * Given a field spec, get the most relevant (unique) representation
+	 * Examples for a user request:
+	 * - friendlyname => ref
+	 * - org_name => org_id->name
+	 * - org_id_friendlyname => org_id=>name
+	 * - caller_name => caller_id->name
+	 * - caller_id_friendlyname => caller_id->friendlyname
+	 * @param string $sClass
+	 * @param string $sField
+	 * @return string
+	 */
+	public static function NormalizeFieldSpec($sClass, $sField)
+	{
+		$sRet = $sField;
+	
+		if ($sField == 'id')
+		{
+			$sRet = 'id';
+		}
+		elseif ($sField == 'friendlyname')
+		{
+			$sFriendlyNameAttCode = static::GetFriendlyNameAttributeCode($sClass);
+			if (!is_null($sFriendlyNameAttCode))
+			{
+				// The friendly name is made of a single attribute
+				$sRet = $sFriendlyNameAttCode;
+			}
+		}
+		else
+		{
+			$oAttDef = static::GetAttributeDef($sClass, $sField);
+			if ($oAttDef instanceof AttributeFriendlyName)
+			{
+				$oKeyAttDef = MetaModel::GetAttributeDef($sClass, $oAttDef->GetKeyAttCode());
+				$sRemoteClass = $oKeyAttDef->GetTargetClass();
+				$sFriendlyNameAttCode = static::GetFriendlyNameAttributeCode($sRemoteClass);
+				if (is_null($sFriendlyNameAttCode))
+				{
+					// The friendly name is made of several attributes
+					$sRet = $oAttDef->GetKeyAttCode().'->friendlyname';
+				}
+				else
+				{
+					// The friendly name is made of a single attribute
+					$sRet = $oAttDef->GetKeyAttCode().'->'.$sFriendlyNameAttCode;
+				}
+			}
+			elseif ($oAttDef->IsExternalField())
+			{
+				$sRet = $oAttDef->GetKeyAttCode().'->'.$oAttDef->GetExtAttCode();
+			}
+		}
+		return $sRet;
+	}
 } // class MetaModel
 
 

+ 1 - 54
core/tabularbulkexport.class.inc.php

@@ -73,7 +73,7 @@ abstract class TabularBulkExport extends BulkExport
 				$sClass = reset($aAliases);
 			}
 			$sMostRelevantField = $this->SuggestField($sClass, $sAttCode);
-			$sAttCodeEx = $this->NormalizeFieldSpec($sClass, $sMostRelevantField);
+			$sAttCodeEx = MetaModel::NormalizeFieldSpec($sClass, $sMostRelevantField);
 			// Remove the aliases (if any) from the field names to make them compatible
 			// with the 'short' notation used in this case by the widget
 			if (count($aAliases) > 1)
@@ -90,59 +90,6 @@ abstract class TabularBulkExport extends BulkExport
 		return $sAttCode;
 	}
 
-	/**
-	 * Given a field spec, get the most relevant (unique) representation
-	 * Examples for a user request:
-	 * - friendlyname => ref
-	 * - org_name => org_id->name
-	 * - org_id_friendlyname => org_id=>name
-	 * - caller_name => caller_id->name
-	 * - caller_id_friendlyname => caller_id->friendlyname	 	 	 	 	 	 
-	 */	 	
-	protected function NormalizeFieldSpec($sClass, $sField)
-	{
-		$sRet = $sField;
-
-		if ($sField == 'id')
-		{
-			$sRet = 'id';
-		}
-		elseif ($sField == 'friendlyname')
-		{
-			$sFriendlyNameAttCode = MetaModel::GetFriendlyNameAttributeCode($sClass);
-			if (!is_null($sFriendlyNameAttCode))
-			{
-				// The friendly name is made of a single attribute
-				$sRet = $sFriendlyNameAttCode;
-			}
-		}
-		else
-		{
-			$oAttDef = MetaModel::GetAttributeDef($sClass, $sField);
-			if ($oAttDef instanceof AttributeFriendlyName)
-			{
-				$oKeyAttDef = MetaModel::GetAttributeDef($sClass, $oAttDef->GetKeyAttCode());
-				$sRemoteClass = $oKeyAttDef->GetTargetClass();
-				$sFriendlyNameAttCode = MetaModel::GetFriendlyNameAttributeCode($sRemoteClass);
-				if (is_null($sFriendlyNameAttCode))
-				{
-					// The friendly name is made of several attributes
-					$sRet = $oAttDef->GetKeyAttCode().'->friendlyname';
-				}
-				else
-				{
-					// The friendly name is made of a single attribute
-					$sRet = $oAttDef->GetKeyAttCode().'->'.$sFriendlyNameAttCode;
-				}
-			}
-			elseif ($oAttDef->IsExternalField())
-			{
-				$sRet = $oAttDef->GetKeyAttCode().'->'.$oAttDef->GetExtAttCode();
-			}
-		}
-		return $sRet;
-	}
-
 	protected function IsSubAttribute($sClass, $sAttCode, $oAttDef)
 	{
 		return (($oAttDef instanceof AttributeFriendlyName) || ($oAttDef instanceof AttributeExternalField) || ($oAttDef instanceof AttributeSubItem));