diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 5b0d145595..5e60a04879 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -5548,30 +5548,31 @@ abstract class DBObject implements iDisplay { $aFields = $oExpression->ListRequiredFields(); $aArgs = array(); - foreach ($aFields as $sFieldDesc) - { + foreach ($aFields as $sFieldDesc) { $aFieldParts = explode('.', $sFieldDesc); - if (count($aFieldParts) == 2) - { + if (count($aFieldParts) == 2) { $sClass = $aFieldParts[0]; $sAttCode = $aFieldParts[1]; - } - else - { + } else { $sClass = get_class($this); $sAttCode = $aFieldParts[0]; } - if (get_class($this) != $sClass) continue; - if (!MetaModel::IsValidAttCode(get_class($this), $sAttCode)) continue; + if (get_class($this) != $sClass) { + continue; + } + if (!MetaModel::IsValidAttCode(get_class($this), $sAttCode)) { + continue; + } $oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode); $aSQLValues = $oAttDef->GetSQLValues($this->m_aCurrValues[$sAttCode]); $value = reset($aSQLValues); if ($oAttDef->IsNull($value)) { - $value = ''; + return ''; } $aArgs[$sFieldDesc] = $value; } + return $oExpression->Evaluate($aArgs); } } diff --git a/test/core/DBObjectTest.php b/test/core/DBObjectTest.php index ff8780436a..941cfcf7cf 100644 --- a/test/core/DBObjectTest.php +++ b/test/core/DBObjectTest.php @@ -125,6 +125,28 @@ class DBObjectTest extends ItopDataTestCase static::assertEquals('Romain Duris', $oObject->Get('friendlyname')); } + /** + * @covers DBObject::NewObject + * @covers DBObject::Get + */ + public function testPartialAttributeEvaluation() + { + $oObject = \MetaModel::NewObject('Person', array('name' => 'Foo', 'org_id' => 3, 'location_id' => 2)); + + static::assertEquals('', $oObject->Get('friendlyname')); + } + + /** + * @covers DBObject::NewObject + * @covers DBObject::Get + */ + public function testEmptyAttributeEvaluation() + { + $oObject = \MetaModel::NewObject('Person', array('org_id' => 3, 'location_id' => 2)); + + static::assertEquals('', $oObject->Get('friendlyname')); + } + /** * @covers DBObject::Get * @covers DBObject::Set diff --git a/test/core/ExpressionEvaluateTest.php b/test/core/ExpressionEvaluateTest.php index 79d9bc38bf..28cd7b9caa 100644 --- a/test/core/ExpressionEvaluateTest.php +++ b/test/core/ExpressionEvaluateTest.php @@ -295,10 +295,15 @@ class ExpressionEvaluateTest extends iTopDataTestCase public function ExpressionsWithObjectFieldsProvider() { - return array( - array('Location', array('name' => 'Grenoble', 'org_id' => 2), 'org_id', 2), - array('Location', array('name' => 'Grenoble', 'org_id' => 2), 'CONCAT(SUBSTR(name, 4), " cause")', 'noble cause'), - ); + return [ + ['URP_UserProfile', ['profileid' => 2], 'friendlyname', ''], + ['Location', ['name' => 'Grenoble', 'org_id' => 2], 'name', 'Grenoble'], + ['Location', ['name' => 'Grenoble', 'org_id' => 2], 'friendlyname', ''], + ['Location', ['name' => 'Grenoble', 'org_id' => 2], 'org_name', ''], + ['Location', ['name' => 'Grenoble', 'org_id' => 2], 'org_id_friendlyname', ''], + ['Location', ['name' => 'Grenoble', 'org_id' => 2], 'org_id', 2], + ['Location', ['name' => 'Grenoble', 'org_id' => 2], 'CONCAT(SUBSTR(name, 4), " cause")', 'noble cause'], + ]; } /**