如何在 Silverstripe 中向 ModelAdmin 添加自定义操作?

How to add custom action to ModelAdmin in Silverstripe?

我有一个名为 MembershipAdmin 的 ModelAdmin 扩展。

class MembershipAdmin extends ModelAdmin {

  private static $url_segment = 'membership';

  private static $url_handlers = array(
      '$ModelClass/$Action' => 'handleAction',
      '$ModelClass/$Action/$ID' => 'handleAction'
)

我希望它识别以下操作并通过 URL 访问该操作,如下所示:http://www.example.com/admin/membership/Member/ActivateMember/666 - 只能在 CMS 中访问。

public function ActivateMember() {

    $Params = $this->getURLParams();
    $id = Convert::raw2sql($Params['ID']);
    $Member = Member::get_by_id('Member', $id);
    //activate member.

然而,当我运行这个 $ID 时,它没有被识别为 URL 参数。

通过只能在 CMS 中访问的 URL 运行 ActivateMember 的正确方法是什么?

这里的问题是匹配了第一个 URL 处理程序,而不是第二个。这意味着 $ID 不匹配。

发生这种情况是因为处理程序不需要匹配整个 URL 并且按顺序进行检查。要更正此问题,只需将更具体的处理程序(带有 $ID 的处理程序)放在列表​​的第一个即可。