diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 40d71f266..8c0880fe0 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -400,16 +400,25 @@ abstract class DBObject { throw new CoreException("Unknown external key '$sExtKeyAttCode' for the class ".get_class($this)); } - $oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode); - $sRemoteClass = $oKeyAttDef->GetTargetClass(); - $oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false); - if (is_null($oRemoteObj)) + + $oExtFieldAtt = MetaModel::FindExternalField(get_class($this), $sExtKeyAttCode, $sRemoteAttCode); + if (!is_null($oExtFieldAtt)) { - return ''; + return $this->GetStrict($oExtFieldAtt->GetCode()); } else { - return $oRemoteObj->Get($sRemoteAttCode); + $oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode); + $sRemoteClass = $oKeyAttDef->GetTargetClass(); + $oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false); + if (is_null($oRemoteObj)) + { + return ''; + } + else + { + return $oRemoteObj->Get($sRemoteAttCode); + } } } } diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 9f9bedbfb..c5e69fbc2 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -871,15 +871,32 @@ abstract class MetaModel final static public function GetExternalFields($sClass, $sKeyAttCode) { - $aExtFields = array(); - foreach (self::ListAttributeDefs($sClass) as $sAttCode => $oAtt) + static $aExtFields = array(); + if (!isset($aExtFields[$sClass][$sKeyAttCode])) { - if ($oAtt->IsExternalField() && ($oAtt->GetKeyAttCode() == $sKeyAttCode)) + $aExtFields[$sClass][$sKeyAttCode] = array(); + foreach (self::ListAttributeDefs($sClass) as $sAttCode => $oAtt) { - $aExtFields[] = $oAtt; + if ($oAtt->IsExternalField() && ($oAtt->GetKeyAttCode() == $sKeyAttCode)) + { + $aExtFields[$sClass][$sKeyAttCode][$oAtt->GetExtAttCode()] = $oAtt; + } } } - return $aExtFields; + return $aExtFields[$sClass][$sKeyAttCode]; + } + + final static public function FindExternalField($sClass, $sKeyAttCode, $sRemoteAttCode) + { + $aExtFields = self::GetExternalFields($sClass, $sKeyAttCode); + if (isset($aExtFields[$sRemoteAttCode])) + { + return $aExtFields[$sRemoteAttCode]; + } + else + { + return null; + } } final static public function GetExtKeyFriends($sClass, $sExtKeyAttCode)