N°4099 - Fix object lists being very slow for classes with a overloaded GetName() function

This commit is contained in:
Eric
2021-06-25 17:13:14 +02:00
parent 60b015919d
commit de71d490c1
7 changed files with 81 additions and 21 deletions

View File

@@ -116,8 +116,7 @@ class DataTable
// See if this column is a must to load
$sClass = $this->aClassAliases[$sAlias];
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if ($oAttDef->alwaysLoadInTables())
{
if ($oAttDef->AlwaysLoadInTables()) {
$aColumnsToLoad[$sAlias][] = $sAttCode;
}
}

View File

@@ -1517,7 +1517,7 @@ abstract class DBObject implements iDisplay
/**
* Helper to get the friendly name in a safe manner for displaying inside a web page
*
* @api
* @internal since 3.0 will be set final in 3.1
*
* @return string
* @throws \CoreException
@@ -1528,14 +1528,14 @@ abstract class DBObject implements iDisplay
}
/**
* Helper to get the friendly name
*
* This is not safe for displaying inside a web page since the " < > characters are not escaped.
* In example, the name may contain some XSS script instructions.
* Helper to get the friendly name
*
* This is not safe for displaying inside a web page since the " < > characters are not escaped.
* In example, the name may contain some XSS script instructions.
* Use this function only for internal computations or for an output to a non-HTML destination
*
* @api
*
* @internal since 3.0 will be set final in 3.1
*
* @return string
* @throws \CoreException
*/

View File

@@ -775,17 +775,73 @@ abstract class MetaModel
}
return array($sFormat, $nameRawSpec);
}
elseif (empty($nameRawSpec))
{
} elseif (empty($nameRawSpec)) {
return array($sClass, array());
}
else
{
} else {
// string -> attcode
return array('%1$s', array($nameRawSpec));
}
}
/**
*
* @param string $sClass
* @param bool $bWithAttributeDefinition
*
* @return array of attribute codes used by friendlyname
* @throws \CoreException
* @since 3.0.0
*/
final public static function GetNameAttributes(string $sClass, $bWithAttributeDefinition = false): array
{
self::_check_subclass($sClass);
$rawNameAttCodes = self::$m_aClassParams[$sClass]["name_attcode"];
$aNameAttCodes = [];
if (!is_array($rawNameAttCodes)) {
if (self::IsValidAttCode($sClass, $rawNameAttCodes)) {
$aNameAttCodes[] = $rawNameAttCodes;
}
} else {
$aNameAttCodes = $rawNameAttCodes;
}
if ($bWithAttributeDefinition) {
$aResults = [];
foreach ($aNameAttCodes as $sAttCode) {
$aResults[$sAttCode] = self::GetAttributeDef($sClass, $sAttCode);
}
return $aResults;
}
return $aNameAttCodes;
}
/**
* @param string $sClass
* @param false $bWithAttributeDefinition
*
* @return array of attributes to always reload in tables
* @throws \CoreException
* @since 3.0.0
*/
final public static function GetAttributesToAlwaysLoadInTables(string $sClass, $bWithAttributeDefinition = false): array
{
$aResults = [];
foreach (self::GetAttributesList($sClass) as $sAttCode) {
$oAttDef = self::GetAttributeDef($sClass, $sAttCode);
if ($oAttDef->AlwaysLoadInTables()) {
if ($bWithAttributeDefinition) {
$aResults[$sAttCode] = $oAttDef;
} else {
$aResults[] = $sAttCode;
}
}
}
return $aResults;
}
/**
* @param string $sClass
*

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -377,6 +377,11 @@ class AjaxRenderController
$aColumns[$sAlias][$sAttCode]['checked'] = false;
}
}
// Add attributes to always load in tables
foreach (MetaModel::GetAttributesToAlwaysLoadInTables($sClassName) as $sAttCode) {
$aColumnsLoad[$sAlias][] = $sAttCode;
}
}
$aQueryParams = isset($aExtraParams['query_params']) ? $aExtraParams['query_params'] : [];
@@ -401,11 +406,11 @@ class AjaxRenderController
if (isset($aObject[$sAlias])) {
$aObj[$sAlias."/_key_"] = $aObject[$sAlias]->GetKey();
$aObj[$sAlias."/hyperlink"] = $aObject[$sAlias]->GetHyperlink();
foreach ($aObject[$sAlias]->GetLoadedAttributes() as $sAttCode) {
foreach ($aColumnsLoad[$sAlias] as $sAttCode) {
$aObj[$sAlias."/".$sAttCode] = $aObject[$sAlias]->GetAsHTML($sAttCode);
}
$sObjHighlightClass = $aObject[$sAlias]->GetHilightClass();
if (!empty($sObjHighlightClass)){
if (!empty($sObjHighlightClass)) {
$aObj['@class'] = 'ibo-is-'.$sObjHighlightClass;
}
}

View File

@@ -308,7 +308,7 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
// See if this column is a must to load
$sClass = $aClassAliases[$sAlias];
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if ($oAttDef->alwaysLoadInTables()) {
if ($oAttDef->AlwaysLoadInTables()) {
$aColumnsToLoad[$sAlias][] = $sAttCode;
}
}
@@ -550,7 +550,7 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
// See if this column is a must to load
$sClass = $aClassAliases[$sAlias];
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if ($oAttDef->alwaysLoadInTables()) {
if ($oAttDef->AlwaysLoadInTables()) {
$aColumnsToLoad[$sAlias][] = $sAttCode;
}
}