diff --git a/_config/extensions.yml b/_config/extensions.yml index 6f834a6..f681410 100644 --- a/_config/extensions.yml +++ b/_config/extensions.yml @@ -15,6 +15,19 @@ SilverStripe\FrameworkTest\Model\Employee: extensions: - SilverStripe\FrameworkTest\Extension\TestDataObjectExtension +SilverStripe\FrameworkTest\Fields\NestedGridField\RootNode: + extensions: + - SilverStripe\FrameworkTest\Extension\TestDataObjectExtension +SilverStripe\FrameworkTest\Fields\NestedGridField\BranchNode: + extensions: + - SilverStripe\FrameworkTest\Extension\TestDataObjectExtension +SilverStripe\FrameworkTest\Fields\NestedGridField\LeafNode: + extensions: + - SilverStripe\FrameworkTest\Extension\TestDataObjectExtension +SilverStripe\FrameworkTest\Fields\NestedGridField\NonRelationalData: + extensions: + - SilverStripe\FrameworkTest\Extension\TestDataObjectExtension + SilverStripe\ORM\DatabaseAdmin: extensions: - SilverStripe\FrameworkTest\GridFieldArbitraryData\DatabaseBuildExtension diff --git a/code/fields/NestedGridField/BranchNode.php b/code/fields/NestedGridField/BranchNode.php new file mode 100644 index 0000000..de653f0 --- /dev/null +++ b/code/fields/NestedGridField/BranchNode.php @@ -0,0 +1,38 @@ + 'Varchar(50)', + 'Category' => 'Varchar(50)', + ]; + + private static $has_one = [ + 'RootNode' => RootNode::class, + ]; + + private static $has_many = [ + 'LeafNodes' => LeafNode::class, + ]; + + private static $summary_fields = [ + 'Name', + 'Category', + ]; + + public function getNestedConfig(): GridFieldConfig + { + $config = new GridFieldConfig_RecordEditor(); + $config->addComponent(GridFieldNestedForm::create()->setRelationName('LeafNodes')); + return $config; + } +} diff --git a/code/fields/NestedGridField/LeafNode.php b/code/fields/NestedGridField/LeafNode.php new file mode 100644 index 0000000..e56587d --- /dev/null +++ b/code/fields/NestedGridField/LeafNode.php @@ -0,0 +1,24 @@ + 'Varchar(50)', + 'Category'=>'Varchar(255)', + ]; + + private static $has_one = [ + 'BranchNode' => BranchNode::class, + ]; + + private static $summary_fields = [ + 'Name', + 'Category', + ]; +} diff --git a/code/fields/NestedGridField/NestedGridFieldAdmin.php b/code/fields/NestedGridField/NestedGridFieldAdmin.php new file mode 100644 index 0000000..070be76 --- /dev/null +++ b/code/fields/NestedGridField/NestedGridFieldAdmin.php @@ -0,0 +1,40 @@ + [ + 'title' => 'Root Nodes', + 'dataClass' => RootNode::class, + ], + 'non-relational-data' => [ + 'title' => 'Non-Relational Data', + 'dataClass' => NonRelationalData::class, + ], + ]; + + protected function getGridFieldConfig(): GridFieldConfig + { + $config = parent::getGridFieldConfig(); + if ($this->modelClass === RootNode::class) { + $config->addComponent(GridFieldNestedForm::create()->setRelationName('BranchNodes')); + } else if ($this->modelClass === NonRelationalData::class) { + $config->addComponent(GridFieldNestedForm::create()->setRelationName('getList')); + } else { + throw new RuntimeException("Unexpected Model name: {$this->tab}"); + } + + return $config; + } +} diff --git a/code/fields/NestedGridField/NonRelationalData.php b/code/fields/NestedGridField/NonRelationalData.php new file mode 100644 index 0000000..2b918f8 --- /dev/null +++ b/code/fields/NestedGridField/NonRelationalData.php @@ -0,0 +1,26 @@ + 'Varchar(50)', + ]; + + public function getList() { + $list = ArrayList::create(); + $data = Company::get()->byIDs([1,2,3,4,5]); + foreach ($data as $value) { + $list->push($value); + } + + return $list; + } +} diff --git a/code/fields/NestedGridField/RootNode.php b/code/fields/NestedGridField/RootNode.php new file mode 100644 index 0000000..c265bc4 --- /dev/null +++ b/code/fields/NestedGridField/RootNode.php @@ -0,0 +1,18 @@ + 'Varchar(50)', + ]; + + private static $has_many = [ + 'BranchNodes' => BranchNode::class, + ]; +} diff --git a/code/fields/NestedGridField/SecurityAdminExtension.php b/code/fields/NestedGridField/SecurityAdminExtension.php new file mode 100644 index 0000000..5cd0cd8 --- /dev/null +++ b/code/fields/NestedGridField/SecurityAdminExtension.php @@ -0,0 +1,17 @@ +owner->getModelClass() === Group::class) { + $config->addComponent(GridFieldNestedForm::create()->setRelationName('Members')); + } + } +}