Skip to content

Instantly share code, notes, and snippets.

@wilr
Created December 7, 2020 22:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wilr/436cbfe9011c6fcd225f68f9b94615df to your computer and use it in GitHub Desktop.
Save wilr/436cbfe9011c6fcd225f68f9b94615df to your computer and use it in GitHub Desktop.
Custom GridField row action example
<?php
use SilverStripe\Control\Controller;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\ValidationException;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridField_FormAction;
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
use SilverStripe\Forms\GridField\GridField_ActionProvider;
use SilverStripe\Forms\GridField\GridField_ActionMenuItem;
class GridFieldRestrictedRiderAction implements GridField_ColumnProvider, GridField_ActionProvider, GridField_ActionMenuItem
{
/**
*
*/
public function getRider($record)
{
if ($record instanceof Licence) {
$rider = $record->Rider();
} else {
$rider = $record;
}
return $rider;
}
/**
* @inheritdoc
*/
public function getTitle($gridField, $record, $columnName)
{
$rider = $this->getRider($record);
if (!$rider->isDisqualified()) {
return 'Add to Restricted Riders';
} else {
return 'Remove from Restricted Riders';
}
}
/**
* @inheritdoc
*/
public function getGroup($gridField, $record, $columnName)
{
$field = $this->getFormAction($gridField, $record, $columnName);
return $field ? GridField_ActionMenuItem::DEFAULT_GROUP: null;
}
/**
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string|null the attribles for the action
*/
public function getExtraData($gridField, $record, $columnName)
{
$field = $this->getFormAction($gridField, $record, $columnName);
if ($field) {
return $field->getAttributes();
}
return null;
}
/**
* Add a column 'Delete'
*
* @param GridField $gridField
* @param array $columns
*/
public function augmentColumns($gridField, &$columns)
{
if (!in_array('Actions', $columns)) {
$columns[] = 'Actions';
}
}
/**
* Return any special attributes that will be used for FormField::create_tag()
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return array
*/
public function getColumnAttributes($gridField, $record, $columnName)
{
return ['class' => 'grid-field__col-compact'];
}
/**
* Add the title
*
* @param GridField $gridField
* @param string $columnName
* @return array
*/
public function getColumnMetadata($gridField, $columnName)
{
if ($columnName == 'Actions') {
return ['title' => ''];
}
}
/**
* Which columns are handled by this component
*
* @param GridField $gridField
* @return array
*/
public function getColumnsHandled($gridField)
{
return ['Actions'];
}
/**
* Which GridField actions are this component handling
*
* @param GridField $gridField
* @return array
*/
public function getActions($gridField)
{
return ['restrictrider', 'unrestrictrider'];
}
/**
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string|null the HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName)
{
$field = $this->getFormAction($gridField, $record, $columnName);
if ($field) {
return $field->Field();
}
return null;
}
/**
* Handle the actions and apply any changes to the GridField
*
* @param GridField $gridField
* @param string $actionName
* @param array $arguments
* @param array $data Form data
* @throws ValidationException
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data)
{
if ($actionName == 'restrictrider' || $actionName == 'unrestrictrider') {
$item = $gridField->getList()->byID($arguments['RecordID']);
if (!$item) {
return;
}
// return the correct rider from the list. If it's a licence then
// it's attached, or the member.
if ($item instanceof Licence) {
$rider = $item->Rider();
} else {
$rider = $item;
}
if ($actionName == 'restrictrider') {
$disqualification = DisqualifiedRider::create();
$disqualification->Surname = $rider->Surname;
$disqualification->FirstName = $rider->FirstName;
$disqualification->DateOfBirth = $rider->dbObject('DateOfBirth')->getTimestamp();
$disqualification->LicenceNumber = $rider->getLicenceNumbers();
$disqualification->write();
$disqualification->Riders()->add($rider);
foreach ($rider->getRidingLicences() as $licence) {
$disqualification->Licences()->add($licence);
}
return Controller::curr()->redirect($disqualification->AbsoluteLink());
} else {
// remove any disqualifications.
$dis = $rider->isDisqualified();
if ($dis) {
$dis->delete();
}
}
}
}
/**
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return GridField_FormAction|null
*/
private function getFormAction($gridField, $record, $columnName)
{
$rider = $this->getRider($record);
if ($rider->isDisqualified()) {
$title = 'Remove from Restricted Riders';
$field = GridField_FormAction::create(
$gridField,
'UnrestrictRider' . $record->ID,
false,
"unrestrictrider",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md grid-field__icon-action action-menu--handled')
->setAttribute('classNames', 'font-icon-unlock')
->setDescription($title)
->setAttribute('aria-label', $title);
} else {
$title = 'Add Restricted Riders';
$field = GridField_FormAction::create(
$gridField,
'RestrictRider' . $record->ID,
false,
"restrictrider",
['RecordID' => $record->ID]
)
->addExtraClass('btn btn--no-text btn--icon-md grid-field__icon-action action-menu--handled')
->setAttribute('classNames', 'font-icon-lock')
->setDescription($title)
->setAttribute('aria-label', $title);
}
return $field;
}
}

Description

Adds a button to each GridField row with a custom 'Action'. In this example, each row relates to a Member record which can be disqualified or not. The GridField action allows ADMIN users to add users to the disqualified list, or remove them if they already exist

Usage

$grid = GridField::create(...); $grid->getConfig()->addComponent(GridFieldRestrictedRiderAction::class);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment