diff --git a/model/DataObject.php b/model/DataObject.php index 6a0cb3cfd..c6082873f 100644 --- a/model/DataObject.php +++ b/model/DataObject.php @@ -1786,6 +1786,12 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity $extraFields = $this->manyManyExtraFieldsForComponent($componentName) ?: array(); $result = ManyManyList::create($componentClass, $table, $componentField, $parentField, $extraFields); + + // Store component data in query meta-data + $result = $result->alterDataQuery(function($query) use ($extraFields) { + $query->setQueryParam('Component.ExtraFields', $extraFields); + }); + if($this->model) $result->setDataModel($this->model); $this->extend('updateManyManyComponents', $result); @@ -2683,6 +2689,28 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity return $this; } + /** + * {@inheritdoc} + */ + public function castingHelper($field) { + if ($fieldSpec = $this->db($field)) { + return $fieldSpec; + } + + // many_many_extraFields aren't presented by db(), so we check if the source query params + // provide us with meta-data for a many_many relation we can inspect for extra fields. + $queryParams = $this->getSourceQueryParams(); + if (!empty($queryParams['Component.ExtraFields'])) { + $extraFields = $queryParams['Component.ExtraFields']; + + if (isset($extraFields[$field])) { + return $extraFields[$field]; + } + } + + return parent::castingHelper($field); + } + /** * Returns true if the given field exists in a database column on any of * the objects tables and optionally look up a dynamic getter with diff --git a/tests/model/DataObjectTest.php b/tests/model/DataObjectTest.php index 08a4bcd29..766ec7fd8 100644 --- a/tests/model/DataObjectTest.php +++ b/tests/model/DataObjectTest.php @@ -911,6 +911,16 @@ class DataObjectTest extends SapphireTest { $this->assertEmpty($fields); } + public function testCastingHelper() { + $team = $this->objFromFixture('DataObjectTest_Team', 'team1'); + + $this->assertEquals('Varchar', $team->castingHelper('Title'), 'db field wasn\'t casted correctly'); + $this->assertEquals('HTMLVarchar', $team->castingHelper('DatabaseField'), 'db field wasn\'t casted correctly'); + + $sponsor = $team->Sponsors()->first(); + $this->assertEquals('Int', $sponsor->castingHelper('SponsorFee'), 'many_many_extraFields not casted correctly'); + } + public function testSummaryFieldsCustomLabels() { $team = $this->objFromFixture('DataObjectTest_Team', 'team1'); $summaryFields = $team->summaryFields();