diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 8bb13c0fb..8e5dcbe6b 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -2704,15 +2704,19 @@ abstract class DBObject implements iDisplay continue; } - /** @noinspection NotOptimalIfConditionsInspection */ - /** @noinspection TypeUnsafeComparisonInspection */ if (utils::IsNullOrEmptyString($sRemoteObjectClass) || utils::IsNullOrEmptyString($sRemoteObjectKey) - || ($sRemoteObjectKey == 0) // non-strict comparison as we might have bad surprises ) { continue; } + // 0 : Undefined ext. key (EG. non-mandatory and no value provided) + // < 0 : Non yet persisted object + /** @noinspection TypeUnsafeComparisonInspection Non-strict comparison as object ID can be string */ + if ($sRemoteObjectKey <= 0) { + continue; + } + if (false === $oIsObjectLoadableCallback($sRemoteObjectClass, $sRemoteObjectKey)) { throw new InvalidExternalKeyValueException($this, $sAttDefCode); } diff --git a/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php b/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php index 187eb8694..db276ef44 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php @@ -1153,6 +1153,9 @@ class ObjectFormManager extends FormManager } catch (CoreCannotSaveObjectException $e) { throw new Exception($e->getHtmlMessage()); } catch (InvalidExternalKeyValueException $e) { + ExceptionLog::LogException($e, $e->getContextData()); + $bExceptionLogged = true; + throw new Exception($e->getIssue()); } catch (Exception $e) { $aContext = [ diff --git a/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php b/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php index 69ddebea8..5545c5cef 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php @@ -558,6 +558,7 @@ class DBObjectTest extends ItopDataTestCase $oPersonLinks = \DBObjectSet::FromScratch(lnkPersonToTeam::class); $oPersonLinks->AddObject(MetaModel::NewObject(lnkPersonToTeam::class, [ 'person_id' => self::INVALID_OBJECT_KEY, + 'team_id' => $oTeam->GetKey(), ])); $oTeam->Set('persons_list', $oPersonLinks); @@ -582,6 +583,7 @@ class DBObjectTest extends ItopDataTestCase $oPersonLinks = \DBObjectSet::FromScratch(lnkPersonToTeam::class); $oPersonLinks->AddObject(MetaModel::NewObject(lnkPersonToTeam::class, [ 'person_id' => $oPersonOnDemoOrg->GetKey(), + 'team_id' => $oTeam->GetKey(), ])); $oTeam->Set('persons_list', $oPersonLinks); @@ -603,6 +605,7 @@ class DBObjectTest extends ItopDataTestCase $oPersonLinks = \DBObjectSet::FromScratch(lnkPersonToTeam::class); $oPersonLinks->AddObject(MetaModel::NewObject(lnkPersonToTeam::class, [ 'person_id' => $oPersonOnItDepartmentOrg->GetKey(), + 'team_id' => $oTeam->GetKey(), ])); $oTeam->Set('persons_list', $oPersonLinks);