Compare commits

...

6 Commits

Author SHA1 Message Date
Sabina Talipova cb37869bac
Merge pull request #10297 from creative-commoners/pulls/4/gridfield-set-polymorphic-class
Issue was fixed
2022-05-13 14:01:17 +12:00
Guy Sartorelli c0ff638cd8
Merge pull request #10307 from silverstripe-terraformers/feature/removal-all-enhancement
ENH: RemoveAll() memory performance enhancement.
2022-05-13 14:00:29 +12:00
Mojmir Fendek b864c11b12 PR fixes. 2022-05-13 12:11:18 +12:00
Mojmir Fendek 26d59944e0 ENH: RemoveAll() memory performance enhancement. 2022-05-13 11:19:04 +12:00
Guy Sartorelli 5436df57e4 FIX Add polymorphic class on new records for use in forms. 2022-05-11 14:04:52 +12:00
Guy Sartorelli 2836478c72 API Add method to get foreign class key on polymorphic has_many 2022-05-02 18:29:01 +12:00
8 changed files with 101 additions and 2 deletions

View File

@ -18,6 +18,7 @@ use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBHTMLText;
use SilverStripe\ORM\HasManyList;
use SilverStripe\ORM\ManyManyList;
use SilverStripe\ORM\PolymorphicHasManyList;
use SilverStripe\ORM\RelationList;
use SilverStripe\ORM\SS_List;
use SilverStripe\ORM\ValidationException;
@ -201,6 +202,12 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler
$key = $list->getForeignKey();
$id = $list->getForeignID();
$this->record->$key = $id;
// If the list is polymorphic, add the foreign class as well.
if ($list instanceof PolymorphicHasManyList) {
$classKey = $list->getForeignClassKey();
$class = $list->getForeignClass();
$this->record->$classKey = $class;
}
}
if (!$this->record->canView()) {

View File

@ -1174,7 +1174,7 @@ class DataList extends ViewableData implements SS_List, Filterable, Sortable, Li
*/
public function removeAll()
{
foreach ($this as $item) {
foreach ($this->getGenerator() as $item) {
$this->remove($item);
}
return $this;

View File

@ -29,6 +29,14 @@ class PolymorphicHasManyList extends HasManyList
return $this->dataQuery->getQueryParam('Foreign.Class');
}
/**
* Gets the field name which holds the related object class.
*/
public function getForeignClassKey(): string
{
return $this->classForeignKey;
}
/**
* Create a new PolymorphicHasManyList relation list.
*

View File

@ -5,6 +5,7 @@ namespace SilverStripe\Forms\Tests\GridField;
use SilverStripe\Control\Controller;
use SilverStripe\Dev\CSSContentParser;
use SilverStripe\Dev\FunctionalTest;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
@ -14,6 +15,7 @@ use SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest\CategoryControlle
use SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest\GroupController;
use SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest\PeopleGroup;
use SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest\Person;
use SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest\PolymorphicPeopleGroup;
use SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest\TestController;
/**
@ -26,6 +28,7 @@ class GridFieldDetailFormTest extends FunctionalTest
protected static $extra_dataobjects = [
Person::class,
PeopleGroup::class,
PolymorphicPeopleGroup::class,
Category::class,
];
@ -119,6 +122,30 @@ class GridFieldDetailFormTest extends FunctionalTest
$this->assertEquals($count + 1, $group->People()->Count());
}
public function testAddFormWithPolymorphicHasOne()
{
// Log in for permissions check
$this->logInWithPermission('ADMIN');
// Prepare gridfield and other objects
$group = new PolymorphicPeopleGroup();
$group->write();
$gridField = $group->getCMSFields()->dataFieldByName('People');
$gridField->setForm(new Form());
$detailForm = $gridField->getConfig()->getComponentByType(GridFieldDetailForm::class);
$record = new Person();
// Trigger creation of the item edit form
$reflectionDetailForm = new \ReflectionClass($detailForm);
$reflectionMethod = $reflectionDetailForm->getMethod('getItemRequestHandler');
$reflectionMethod->setAccessible(true);
$itemrequest = $reflectionMethod->invoke($detailForm, $gridField, $record, new Controller());
$itemrequest->ItemEditForm();
// The polymorphic values should be pre-loaded
$this->assertEquals(PolymorphicPeopleGroup::class, $record->PolymorphicGroupClass);
$this->assertEquals($group->ID, $record->PolymorphicGroupID);
}
public function testViewForm()
{
$this->logInWithPermission('ADMIN');

View File

@ -18,7 +18,8 @@ class Person extends DataObject implements TestOnly
];
private static $has_one = [
'Group' => PeopleGroup::class
'Group' => PeopleGroup::class,
'PolymorphicGroup' => DataObject::class,
];
private static $many_many = [

View File

@ -0,0 +1,38 @@
<?php
namespace SilverStripe\Forms\Tests\GridField\GridFieldDetailFormTest;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RelationEditor;
use SilverStripe\ORM\DataObject;
class PolymorphicPeopleGroup extends DataObject implements TestOnly
{
private static $table_name = 'GridFieldDetailFormTest_PolymorphicPeopleGroup';
private static $db = [
'Name' => 'Varchar'
];
private static $has_many = [
'People' => Person::class
];
private static $default_sort = '"Name"';
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->replaceField(
'People',
GridField::create(
'People',
'People',
$this->People(),
GridFieldConfig_RelationEditor::create()
)
);
return $fields;
}
}

View File

@ -458,6 +458,17 @@ class DataListTest extends SapphireTest
$this->assertNull($list->byID($id));
}
/**
* Test DataList->removeAll()
*/
public function testRemoveAll()
{
$list = Team::get();
$this->assertGreaterThan(0, $list->count());
$list->removeAll();
$this->assertCount(0, $list);
}
/**
* Test DataList->canSortBy()
*/

View File

@ -110,4 +110,11 @@ class PolymorphicHasManyListTest extends SapphireTest
$this->assertEmpty($subteam1fan->FavouriteID);
$this->assertEmpty($subteam1fan->FavouriteClass);
}
public function testGetForeignClassKey(): void
{
$team = $this->objFromFixture(DataObjectTest\Team::class, 'team1');
$list = $team->Fans();
$this->assertSame('FavouriteClass', $list->getForeignClassKey());
}
}