BUG Fix incorrect merge of associative / non-associative summary fields

Fixes #7696
This commit is contained in:
Damian Mooyman 2017-12-14 14:17:19 +13:00
parent a2fa9f0943
commit ed6561d9f5
No known key found for this signature in database
GPG Key ID: 78B823A10DE27D1A
4 changed files with 57 additions and 54 deletions

View File

@ -3337,12 +3337,15 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity
*/
public function summaryFields()
{
$fields = $this->config()->get('summary_fields');
$rawFields = $this->config()->get('summary_fields');
// if fields were passed in numeric array,
// convert to an associative array
if ($fields && array_key_exists(0, $fields)) {
$fields = array_combine(array_values($fields), array_values($fields));
// Merge associative / numeric keys
$fields = [];
foreach ($rawFields as $key => $value) {
if (is_int($key)) {
$key = $value;
}
$fields[$key] = $value;
}
if (!$fields) {

View File

@ -2,25 +2,23 @@
namespace SilverStripe\ORM\Tests;
use InvalidArgumentException;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\i18n\i18n;
use SilverStripe\ORM\Connect\MySQLDatabase;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DataObjectSchema;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\FieldType\DBBoolean;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\Connect\MySQLDatabase;
use SilverStripe\ORM\FieldType\DBPolymorphicForeignKey;
use SilverStripe\ORM\FieldType\DBVarchar;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\ORM\Tests\DataObjectTest\Player;
use SilverStripe\ORM\ValidationException;
use SilverStripe\View\ViewableData;
use stdClass;
use ReflectionException;
use InvalidArgumentException;
class DataObjectTest extends SapphireTest
{
@ -87,11 +85,11 @@ class DataObjectTest extends SapphireTest
// Test with table required
$this->assertEquals(
DataObjectTest\TeamComment::class.'.Varchar',
DataObjectTest\TeamComment::class . '.Varchar',
$schema->fieldSpec(DataObjectTest\TeamComment::class, 'Name', DataObjectSchema::INCLUDE_CLASS)
);
$this->assertEquals(
DataObjectTest\TeamComment::class.'.Text',
DataObjectTest\TeamComment::class . '.Text',
$schema->fieldSpec(DataObjectTest\TeamComment::class, 'Comment', DataObjectSchema::INCLUDE_CLASS)
);
$dbFields = $schema->fieldSpecs(DataObjectTest\ExtendedTeamComment::class);
@ -705,8 +703,8 @@ class DataObjectTest extends SapphireTest
$obj->getChangedFields(true, DataObject::CHANGE_VALUE),
array(
'FirstName' => array(
'before'=>'Captain',
'after'=>'Captain-changed',
'before' => 'Captain',
'after' => 'Captain-changed',
'level' => DataObject::CHANGE_VALUE
)
),
@ -1190,15 +1188,13 @@ class DataObjectTest extends SapphireTest
$summaryFields = $team->summaryFields();
$this->assertEquals(
'Custom Title',
$summaryFields['Title'],
'Custom title is preserved'
);
$this->assertEquals(
'Captain\'s shirt number',
$summaryFields['Captain.ShirtNumber'],
'Custom title on relation is preserved'
[
'Title' => 'Custom Title',
'Title.UpperCase' => 'Title',
'Captain.ShirtNumber' => 'Captain\'s shirt number',
'Captain.FavouriteTeam.Title' => 'Captain\'s favourite team',
],
$summaryFields
);
}
@ -1460,7 +1456,7 @@ class DataObjectTest extends SapphireTest
$this->expectExceptionMessage('Controller is not a valid subclass of DataObject');
/**
* @skipUpgrade
*/
*/
$dataObject->newClassInstance('Controller');
}
@ -1797,7 +1793,7 @@ class DataObjectTest extends SapphireTest
$company = new DataObjectTest\Company();
$this->assertEquals(
array (
array(
'CurrentStaff' => DataObjectTest\Staff::class,
'PreviousStaff' => DataObjectTest\Staff::class
),
@ -1812,16 +1808,16 @@ class DataObjectTest extends SapphireTest
);
$this->assertEquals(
array (
'CurrentStaff' => DataObjectTest\Staff::class.'.CurrentCompany',
'PreviousStaff' => DataObjectTest\Staff::class.'.PreviousCompany'
array(
'CurrentStaff' => DataObjectTest\Staff::class . '.CurrentCompany',
'PreviousStaff' => DataObjectTest\Staff::class . '.PreviousCompany'
),
$company->hasMany(false),
'has_many returns field name data when $classOnly is false.'
);
$this->assertEquals(
DataObjectTest\Staff::class.'.CurrentCompany',
DataObjectTest\Staff::class . '.CurrentCompany',
DataObject::getSchema()->hasManyComponent(DataObjectTest\Company::class, 'CurrentStaff', false),
'has_many returns field name data on single records when $classOnly is false.'
);

View File

@ -59,7 +59,7 @@ class Team extends DataObject implements TestOnly
);
private static $summary_fields = array(
'Title' => 'Custom Title',
'Title', // Overridden by Team_Extension
'Title.UpperCase' => 'Title',
'Captain.ShirtNumber' => 'Captain\'s shirt number',
'Captain.FavouriteTeam.Title' => 'Captain\'s favourite team'

View File

@ -7,6 +7,10 @@ use SilverStripe\ORM\DataExtension;
class Team_Extension extends DataExtension implements TestOnly
{
private static $summary_fields = [
'Title' => 'Custom Title', // override non-associative 'Title'
];
private static $db = array(
'ExtendedDatabaseField' => 'Varchar'
);