diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index b6373233f..902a4215f 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -972,6 +972,9 @@ class DBObjectSearch // Alternative to object mapping: the data are transfered directly into an array // This is 10 times faster than creating a set of objects, and makes sense when optimization is required + /** + * @param hash $aOrderBy Array of '[.]attcode' => bAscending + */ public function ToDataArray($aColumns = array(), $aOrderBy = array(), $aArgs = array()) { $sSQL = MetaModel::MakeSelectQuery($this, $aOrderBy, $aArgs); diff --git a/core/dbobjectset.class.php b/core/dbobjectset.class.php index fd10138b0..1c1d3dfff 100644 --- a/core/dbobjectset.class.php +++ b/core/dbobjectset.class.php @@ -48,7 +48,7 @@ class DBObjectSet * Create a new set based on a Search definition. * * @param DBObjectSearch $oFilter The search filter defining the objects which are part of the set (multiple columns/objects per row are supported) - * @param hash $aOrderBy + * @param hash $aOrderBy Array of '[.]attcode' => bAscending * @param hash $aArgs Values to substitute for the search/query parameters (if any). Format: param_name => value * @param hash $aExtendedDataSpec * @param int $iLimitCount Maximum number of rows to load (i.e. equivalent to MySQL's LIMIT start, count) @@ -1156,5 +1156,3 @@ function HashCountComparison($a, $b) // Sort descending on 'count' } return ($a['count'] > $b['count']) ? -1 : 1; } - -?> diff --git a/core/metamodel.class.php b/core/metamodel.class.php index beea2e118..2919c53d2 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -1,5 +1,5 @@ .]attcode' => bAscending + */ public static function MakeSelectQuery(DBObjectSearch $oFilter, $aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0, $bGetCount = false) { // Check the order by specification, and prefix with the class alias @@ -2228,32 +2231,44 @@ abstract class MetaModel $aOrderSpec = array(); foreach ($aOrderBy as $sFieldAlias => $bAscending) { - if ($sFieldAlias != 'id') - { - MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sFieldAlias, self::GetAttributesList($sClass)); - } if (!is_bool($bAscending)) { throw new CoreException("Wrong direction in ORDER BY spec, found '$bAscending' and expecting a boolean value"); } - - if (self::IsValidAttCode($sClass, $sFieldAlias)) + + $iDotPos = strpos($sFieldAlias, '.'); + if ($iDotPos === false) { - $oAttDef = self::GetAttributeDef($sClass, $sFieldAlias); - foreach($oAttDef->GetOrderBySQLExpressions($sClassAlias) as $sSQLExpression) + $sAttClass = $sClass; + $sAttClassAlias = $sClassAlias; + $sAttCode = $sFieldAlias; + } + else + { + $sAttClassAlias = substr($sFieldAlias, 0, $iDotPos); + $sAttClass = $oFilter->GetClassName($sAttClassAlias); + $sAttCode = substr($sFieldAlias, $iDotPos + 1); + } + + if ($sAttCode != 'id') + { + MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sAttCode, self::GetAttributesList($sAttClass)); + + $oAttDef = self::GetAttributeDef($sAttClass, $sAttCode); + foreach($oAttDef->GetOrderBySQLExpressions($sAttClassAlias) as $sSQLExpression) { $aOrderSpec[$sSQLExpression] = $bAscending; } } else { - $aOrderSpec['`'.$sClassAlias.$sFieldAlias.'`'] = $bAscending; + $aOrderSpec['`'.$sAttClassAlias.$sAttCode.'`'] = $bAscending; } // Make sure that the columns used for sorting are present in the loaded columns - if (!is_null($aAttToLoad) && !isset($aAttToLoad[$sClassAlias][$sFieldAlias])) + if (!is_null($aAttToLoad) && !isset($aAttToLoad[$sAttClassAlias][$sAttCode])) { - $aAttToLoad[$sClassAlias][$sFieldAlias] = MetaModel::GetAttributeDef($sClass, $sFieldAlias); + $aAttToLoad[$sAttClassAlias][$sAttCode] = MetaModel::GetAttributeDef($sAttClass, $sAttCode); } } @@ -5509,5 +5524,3 @@ MetaModel::RegisterZList("preview", array("description"=>"All attributes visible MetaModel::RegisterZList("standard_search", array("description"=>"List of criteria for the standard search", "type"=>"filters")); MetaModel::RegisterZList("advanced_search", array("description"=>"List of criteria for the advanced search", "type"=>"filters")); - -?> diff --git a/core/valuesetdef.class.inc.php b/core/valuesetdef.class.inc.php index c563b00f0..eabc10952 100644 --- a/core/valuesetdef.class.inc.php +++ b/core/valuesetdef.class.inc.php @@ -100,6 +100,9 @@ class ValueSetObjects extends ValueSetDefinition private $m_bAllowAllData; private $m_aModifierProperties; + /** + * @param hash $aOrderBy Array of '[.]attcode' => bAscending + */ public function __construct($sFilterExp, $sValueAttCode = '', $aOrderBy = array(), $bAllowAllData = false, $aModifierProperties = array()) { $this->m_sContains = ''; @@ -415,5 +418,3 @@ class ValueSetEnumClasses extends ValueSetEnum return true; } } - -?> diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 8e68d32d1..0fb54cb83 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -1,5 +1,5 @@