Skip to content

Instantly share code, notes, and snippets.

@maxime-rainville
Created December 6, 2023 04:45
Show Gist options
  • Save maxime-rainville/eefa209bf727a0526304a2d5bacc72ca to your computer and use it in GitHub Desktop.
Save maxime-rainville/eefa209bf727a0526304a2d5bacc72ca to your computer and use it in GitHub Desktop.
Test of ViewableData Gridfield
<?php
use SilverStripe\View\ArrayData;
class Company extends ArrayData
{
public function __construct($id=0, $data=[])
{
if (empty($data)) {
return parent::__construct([
'ID' => $id
]);
}
list($name, $type, $value, $ceo) = $data;
return parent::__construct([
'ID' => $id,
'Company' => $name,
'Industry' => $type,
'Valuation' => $value,
'CEO' => $ceo
]);
}
public function canCreate() {
return true;
}
public function canDelete() {
return true;
}
public function canEdit() {
return true;
}
}
<?php
namespace {
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
use SilverStripe\Forms\GridField\GridFieldConfig_Base;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordViewer;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\Forms\GridField\GridFieldDetailForm;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldFilterHeader;
use SilverStripe\Forms\GridField\GridFieldLazyLoader;
use SilverStripe\Forms\GridField\GridFieldPrintButton;
use SilverStripe\Forms\TextField;
use SilverStripe\LinkField\Form\LinkField;
use SilverStripe\LinkField\Models\Link;
use SilverStripe\FrameworkTest\Model\Company;
use SilverStripe\ORM\ArrayList;
use SilverStripe\View\ArrayData;
use SilverStripe\ORM\Search\BasicSearchContext;
class Page extends SiteTree
{
private static $db = [];
private static $has_one = [
'MyLink' => Link::class,
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Main', LinkField::create('MyLink', 'Link'));
$fields->addFieldsToTab('Root.ViewableData', $this->GridField());
$fields->addFieldsToTab('Root.FancyObject', $this->GridFieldTwo());
return $fields;
}
public function GridField()
{
$rawData = Company::create()->data();
/** @var ArrayList $dataset */
$dataset = ArrayList::create();
foreach ($rawData as $id => $company) {
list($name, $type, $value, $ceo) = $company;
$dataset->push(ArrayData::create([
'ID' => $id,
'Company' => $name,
'Industry' => $type,
'Valuation' => $value,
'CEO' => $ceo
]));
}
$config = GridFieldConfig_RecordViewer::create();
$config = GridFieldConfig_RecordEditor::create();
// $config = GridFieldConfig_Base::create();
$config
->getComponentByType(GridFieldDataColumns::class)
->setDisplayFields([
// 'ID' => 'ID',
'Company' => 'Company',
'Industry' => 'Industry',
'Valuation' => 'Valuation',
'CEO' => 'CEO',
]);
$config
->getComponentByType(GridFieldDetailForm::class)
->setFields(FieldList::create([
// TextField::create('ID'),
TextField::create('Company'),
TextField::create('Industry'),
TextField::create('Valuation'),
TextField::create('CEO'),
]));
$config->removeComponentsByType(GridFieldAddNewButton::class);
$config->removeComponentsByType(GridFieldDeleteAction::class);
$searchContext = BasicSearchContext::create(null);
$searchContext->setFields(FieldList::create(
TextField::create('ID'),
TextField::create('Company'),
TextField::create('Industry'),
TextField::create('Valuation'),
TextField::create('CEO'),
));
$config
->getComponentByType(GridFieldFilterHeader::class)
->setSearchContext($searchContext);
return GridField::create('MyArrayList', 'My Array List', $dataset, $config);
}
public function GridFieldTwo()
{
$rawData = Company::create()->data();
/** @var ArrayList $dataset */
$dataset = ArrayList::create();
foreach ($rawData as $id => $company) {
$dataset->push(new \Company($id, $company));
}
$config = GridFieldConfig_RecordEditor::create();
$config
->getComponentByType(GridFieldDataColumns::class)
->setDisplayFields([
'Company' => 'Company',
'Industry' => 'Industry',
'Valuation' => 'Valuation',
'CEO' => 'CEO',
]);
$config
->getComponentByType(GridFieldDetailForm::class)
->setFields(FieldList::create([
TextField::create('Company'),
TextField::create('Industry'),
TextField::create('Valuation'),
TextField::create('CEO'),
]));
// $config->removeComponentsByType(GridFieldAddNewButton::class);
// $config->removeComponentsByType(GridFieldDeleteAction::class);
$searchContext = BasicSearchContext::create(null);
$searchContext->setFields(FieldList::create(
TextField::create('ID'),
TextField::create('Company'),
TextField::create('Industry'),
TextField::create('Valuation'),
TextField::create('CEO'),
));
$config
->getComponentByType(GridFieldFilterHeader::class)
->setSearchContext($searchContext);
$config->addComponent(GridFieldExportButton::create('buttons-before-left'));
$config->addComponent(GridFieldPrintButton::create('buttons-before-left'));
$config->addComponent(GridFieldLazyLoader::create());
return GridField::create('MyArrayListTwo', 'My Array List', $dataset, $config);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment