Skip to content

Commit

Permalink
Merge pull request #10913 from lekoala/dbcomposite
Browse files Browse the repository at this point in the history
DBComposite::writeToManipulation() is never called
  • Loading branch information
GuySartorelli authored Aug 14, 2023
2 parents 597d97b + 637859a commit cdbc50c
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/ORM/DataObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -1491,7 +1491,7 @@ protected function prepareManipulationTable($baseTable, $now, $isNewRecord, &$ma
$specification = $schema->fieldSpec(
$class,
$fieldName,
DataObjectSchema::DB_ONLY | DataObjectSchema::UNINHERITED
DataObjectSchema::UNINHERITED
);
if (!$specification) {
continue;
Expand Down
22 changes: 21 additions & 1 deletion tests/php/ORM/DBCompositeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ public function testCompositeFieldMetaDataFunctions()
$this->assertEquals(
[
'MyMoney' => 'Money',
'OverriddenMoney' => 'Money'
'OverriddenMoney' => 'Money',
'DoubleMoney' => DBCompositeTest\DBDoubleMoney::class
],
$schema->compositeFields(DBCompositeTest\TestObject::class)
);
Expand All @@ -68,6 +69,7 @@ public function testCompositeFieldMetaDataFunctions()
'MyMoney' => 'Money',
'OtherMoney' => 'Money',
'OverriddenMoney' => 'Money',
'DoubleMoney' => DBCompositeTest\DBDoubleMoney::class
],
$schema->compositeFields(DBCompositeTest\SubclassedDBFieldObject::class)
);
Expand Down Expand Up @@ -111,4 +113,22 @@ public function testInheritedTables()
$this->assertEquals('DBCompositeTest_SubclassedDBFieldObject', $object2->dbObject('OtherMoney')->getTable());
$this->assertEquals('DBCompositeTest_SubclassedDBFieldObject', $object2->dbObject('OverriddenMoney')->getTable());
}

public function testWriteToManipuationIsCalledWhenWritingDataObject()
{
$obj = DBCompositeTest\TestObject::create();
$obj->DoubleMoney = ['Amount' => 10, 'Currency' => 'CAD'];
$moneyField = $obj->dbObject('DoubleMoney');
$this->assertEquals(10, $moneyField->getAmount());

$obj->write();

// Custom money class should double the amount before writing
$this->assertEquals(20, $moneyField->getAmount());

// Note: these would fail since dbObject will return a new instance
// of the DoubleMoney field based on the initial values
// $this->assertSame($moneyField, $obj->dbObject('DoubleMoney'));
// $this->assertEquals(20, $obj->dbObject('DoubleMoney')->getAmount());
}
}
17 changes: 17 additions & 0 deletions tests/php/ORM/DBCompositeTest/DBDoubleMoney.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace SilverStripe\ORM\Tests\DBCompositeTest;

use SilverStripe\Dev\TestOnly;
use SilverStripe\ORM\FieldType\DBMoney;

class DBDoubleMoney extends DBMoney implements TestOnly
{
public function writeToManipulation(&$manipulation)
{
// Duplicate the amount before writing
$this->setAmount($this->getAmount() * 2);

parent::writeToManipulation($manipulation);
}
}
3 changes: 2 additions & 1 deletion tests/php/ORM/DBCompositeTest/TestObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class TestObject extends DataObject implements TestOnly
private static $db = [
'Title' => 'Text',
'MyMoney' => 'Money',
'OverriddenMoney' => 'Money'
'OverriddenMoney' => 'Money',
'DoubleMoney' => DBDoubleMoney::class,
];
}

0 comments on commit cdbc50c

Please sign in to comment.