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.

SVN:trunk[3774]
This commit is contained in:
Denis Flaven
2015-09-17 17:22:07 +00:00
parent 1206cc42bc
commit 554a462809
3 changed files with 63 additions and 54 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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));