diff --git a/model/DataObject.php b/model/DataObject.php index 618ce6648..8381fbf3b 100644 --- a/model/DataObject.php +++ b/model/DataObject.php @@ -2077,7 +2077,7 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity $candidateManyManys = (array)Config::inst()->get($candidate, 'many_many', Config::UNINHERITED); foreach($candidateManyManys as $relation => $relatedClass) { - if($relatedClass === $this->class) { + if (is_a($this, $relatedClass)) { $relationName = $relation; } } diff --git a/tests/model/ManyManyListExtensionTest.php b/tests/model/ManyManyListExtensionTest.php new file mode 100644 index 000000000..4b37e7848 --- /dev/null +++ b/tests/model/ManyManyListExtensionTest.php @@ -0,0 +1,119 @@ +objFromFixture('ManyManyListTest_IndirectPrimary', 'manymany_extra_primary'); + $secondaries = $primary->Secondary(); + $extraFields = $secondaries->getExtraFields(); + + $this->assertTrue(count($extraFields) > 0, 'has extra fields'); + $this->assertTrue(isset($extraFields['DocumentSort']), 'has DocumentSort'); + + // Test from the secondary (which is extended) to the primary (not extended) + $secondary = $this->objFromFixture('ManyManyListTest_SecondarySub', 'manymany_extra_secondary'); + + $primaries = $secondary->Primary(); + $extraFields = $primaries->getExtraFields(); + + $this->assertTrue(count($extraFields) > 0, 'has extra fields'); + $this->assertTrue(isset($extraFields['DocumentSort']), 'has DocumentSort'); + } +} + +/** + * @package framework + * @subpackage tests + * + * A data object that implements the primary side of a many_many (where the extra fields are + * defined.) The many-many refers to ManyManyListTest_Secondary rather than ManyManyListTest_SecondarySub + * by design, because we're trying to test that a subclass instance picks up the extra fields of it's parent. + */ +class ManyManyListTest_IndirectPrimary extends DataObject implements TestOnly { + + private static $db = array( + 'Title' => 'Varchar(255)' + ); + + private static $many_many = array( + 'Secondary' => 'ManyManyListTest_Secondary' + ); + + private static $many_many_extraFields = array( + 'Secondary' => array( + 'DocumentSort' => 'Int' + ) + ); +} + +/** + * @package framework + * @subpackage tests + * + * A data object that implements the secondary side of a many_many when extended by + * ManyManyListTest_IndirectSecondaryExtension. + */ +class ManyManyListTest_Secondary extends DataObject implements TestOnly { + + // Possibly not required, but want to simulate a real test failure case where + // database tables are present. + private static $db = array( + 'Title' => 'Varchar(255)' + ); + +} + +/** + * @package framework + * @subpackage tests + * + * A data object that is a subclass of the secondary side. The test will create an instance of this, + * and ensure that the extra fields are available on the instance even though the many many is + * defined at the parent level. + */ +class ManyManyListTest_SecondarySub extends ManyManyListTest_Secondary { + + // private static $db = array( + // 'Other' => 'Varchar(255)' + // ); + +} + +/** + * @package framework + * @subpackage tests + * + * An extension that is applied to ManyManyListTest_Secondary that implements the other side of the many-many + * relationship. + */ +class ManyManyListTest_IndirectSecondaryExtension extends DataExtension implements TestOnly { + + private static $db = array( + 'Title' => 'Varchar(255)' + ); + + private static $belongs_many_many = array( + 'Primary' => 'ManyManyListTest_IndirectPrimary' + ); + +} diff --git a/tests/model/ManyManyListExtensionTest.yml b/tests/model/ManyManyListExtensionTest.yml new file mode 100644 index 000000000..a28c7be68 --- /dev/null +++ b/tests/model/ManyManyListExtensionTest.yml @@ -0,0 +1,6 @@ +ManyManyListTest_IndirectPrimary: + manymany_extra_primary: + Title: 'primary' +ManyManyListTest_SecondarySub: + manymany_extra_secondary: + Title: 'secondary'