BUG Fix regressions from #2206 in hasValue and dbObject

Fixes #2982
This commit is contained in:
Damian Mooyman 2014-03-28 09:37:04 +13:00 committed by Simon Welsh
parent 451f9d383f
commit cf5d524235
2 changed files with 19 additions and 4 deletions

View File

@ -2788,8 +2788,8 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
return DBField::create_field('ForeignKey', $val, $fieldName, $this); return DBField::create_field('ForeignKey', $val, $fieldName, $this);
// has_one for polymorphic relations do not end in ID // has_one for polymorphic relations do not end in ID
} else if($this->has_one($fieldName)) { } else if(($type = $this->has_one($fieldName)) && ($type === 'DataObject')) {
$val = $this->$fieldName; $val = $this->$fieldName();
return DBField::create_field('PolymorphicForeignKey', $val, $fieldName, $this); return DBField::create_field('PolymorphicForeignKey', $val, $fieldName, $this);
} }
@ -3784,8 +3784,8 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
* @return boolean * @return boolean
*/ */
public function hasValue($field, $arguments = null, $cache = true) { public function hasValue($field, $arguments = null, $cache = true) {
$obj = $this->dbObject($field); // has_one fields should not use dbObject to check if a value is given
if($obj) { if(!$this->has_one($field) && ($obj = $this->dbObject($field))) {
return $obj->exists(); return $obj->exists();
} else { } else {
return parent::hasValue($field, $arguments, $cache); return parent::hasValue($field, $arguments, $cache);

View File

@ -228,6 +228,7 @@ class DataObjectTest extends SapphireTest {
// Check entity with polymorphic has-one // Check entity with polymorphic has-one
$fan1 = $this->objFromFixture("DataObjectTest_Fan", "fan1"); $fan1 = $this->objFromFixture("DataObjectTest_Fan", "fan1");
$this->assertTrue((bool)$fan1->hasValue('Favourite'));
// There will be fields named (relname)ID and (relname)Class for polymorphic // There will be fields named (relname)ID and (relname)Class for polymorphic
// entities // entities
@ -238,6 +239,13 @@ class DataObjectTest extends SapphireTest {
$favourite = $fan1->Favourite(); $favourite = $fan1->Favourite();
$this->assertEquals($team1ID, $favourite->ID); $this->assertEquals($team1ID, $favourite->ID);
$this->assertInstanceOf('DataObjectTest_Team', $favourite); $this->assertInstanceOf('DataObjectTest_Team', $favourite);
// check behaviour of dbObject with polymorphic relations
$favouriteDBObject = $fan1->dbObject('Favourite');
$favouriteValue = $favouriteDBObject->getValue();
$this->assertInstanceOf('PolymorphicForeignKey', $favouriteDBObject);
$this->assertEquals($favourite->ID, $favouriteValue->ID);
$this->assertEquals($favourite->ClassName, $favouriteValue->ClassName);
} }
/** /**
@ -389,10 +397,17 @@ class DataObjectTest extends SapphireTest {
$player1 = $this->objFromFixture('DataObjectTest_Player', 'player1'); $player1 = $this->objFromFixture('DataObjectTest_Player', 'player1');
$fan1 = $this->objFromFixture('DataObjectTest_Fan', 'fan1'); $fan1 = $this->objFromFixture('DataObjectTest_Fan', 'fan1');
// Test relation probing
$this->assertFalse((bool)$team1->hasValue('Captain', null, false));
$this->assertFalse((bool)$team1->hasValue('CaptainID', null, false));
// Add a captain to team 1 // Add a captain to team 1
$team1->setField('CaptainID', $player1->ID); $team1->setField('CaptainID', $player1->ID);
$team1->write(); $team1->write();
$this->assertTrue((bool)$team1->hasValue('Captain', null, false));
$this->assertTrue((bool)$team1->hasValue('CaptainID', null, false));
$this->assertEquals($player1->ID, $team1->Captain()->ID, $this->assertEquals($player1->ID, $team1->Captain()->ID,
'The captain exists for team 1'); 'The captain exists for team 1');
$this->assertEquals($player1->ID, $team1->getComponent('Captain')->ID, $this->assertEquals($player1->ID, $team1->getComponent('Captain')->ID,