I’ve managed to do this by extending the GridFieldDetailForm_ItemRequest because that one is responsible for rendering the edit form in the grin (surprise!)
SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest:
extensions:
- App\Extensions\TargetClassActions
<?php
namespace App\Extensions;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Extension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest;
use SilverStripe\Forms\LiteralField;
/**
* @property-read GridFieldDetailForm_ItemRequest $owner
*/
class TargetClassActions extends Extension {
public function updateFormActions(FieldList $actions)
{
$targetClass = TargetClass::class;
$record = $this->owner->getRecord();
if($record && $record->exists() && $record->ClassName == $targetClass) {
$action = 'newaction';
$classDesc = str_replace('\\','-',$targetClass);
$link = '/'.Controller::curr()->Link("$classDesc/$action/{$record->ID}");
$actions->push(
LiteralField::create('Literal_'.$action,'<a target="_blank" href="'.$link.'" class="btn btn-outline-secondary">Download Unclaimed tokens</a>')
);
}
}
}
<?php
namespace App\Admin;
use SilverStripe\Admin\ModelAdmin;
use SilverStripe\Control\HTTPRequest;
class TargetClassAdmin extends ModelAdmin
{
private static $allowed_actions = [
'newaction',
];
private static $url_handlers = [
'newaction/$ID' => 'newaction',
];
private static $managed_models = [
TargetClass::class,
];
public function newaction(HTTPRequest $request)
{
$params = $request->match('$ID');
//do the stuff
}
}