Silverstripe 通过Model Admin&;向用户提出错误;DataObject::onBeforeDelete()

Silverstripe 通过Model Admin&;向用户提出错误;DataObject::onBeforeDelete(),silverstripe,modeladmin,Silverstripe,Modeladmin,鉴于我使用模型管理员管理客户数据对象,我有如下代码,取自SilverStripe文档: public function onBeforeDelete() { if ($this->Orders()->Count() > 0) { user_error("Cannot delete a Customer with Orders", E_USER_ERROR); exit(); } parent::onBeforeDelete

鉴于我使用模型管理员管理客户数据对象,我有如下代码,取自SilverStripe文档:

public function onBeforeDelete() {
    if ($this->Orders()->Count() > 0) {
        user_error("Cannot delete a Customer with Orders", E_USER_ERROR);
        exit();
    }
    parent::onBeforeDelete();
}
当我试图通过Model Admin删除一个有订单的客户时,我得到的只是一个JavaScript警报,上面写着“从服务器获取数据时发生错误。请稍后再试”以及页面右上角的一个通知

Error at line 42 of /var/www/mysite/code/dataobjects/Customer.php
我如何才能收到一条好消息,告诉模型管理员“无法删除有订单的客户”?

您可以尝试以下方法:

public function canDelete($member=null) {
    if ($this->Orders()->Count() > 0) {
        return false;
    }
    return parent::canDelete($member);
}


这将完全删除删除按钮,但您必须以另一种方式向用户说明原因。

除了重载validate函数外,您还可以抛出一个
ValidationException

public function onBeforeDelete() {
    if ($this->Orders()->Count() > 0) {
        throw new ValidationException("Cannot delete a Customer with Orders");
    }
    parent::onBeforeDelete();
}

ValidationException
被表单处理代码捕获,并应在右上角以弹出消息的形式显示错误。

您可以在右上角以CMS默认错误消息样式显示消息。简单的技巧是返回一个错误头,ajax调用知道如何处理它

public function onBeforeDelete() {
   if ($this->Orders()->Count() > 0) {
     header("HTTP/1.1 403 Sorry you can not delete a customer with orders");
        exit;
    }
    parent::onBeforeDelete();
 }
如果您更多地使用此类消息,最好的方法是在自定义siteconfig扩展类中放置一个函数,并每次调用它来处理这种情况。例如,将以下代码放在一个公共函数文件或类SiteConfigExtension Extendes DataExtension中

public function popupCMSError($message='The action is not allowed', $errorCode=403)
{
        header("HTTP/1.1 $errorCode $message");
        exit;
}
然后,在类似于您的情况下或出于任何其他目的,您始终可以通过以下方式调用它(例如,如果在siteconfig类中):


注意:我在这里使用HTTP错误403仅用于说明。您也可以使用其他标题。在Silverstripe Framework core中使用相同的样式来显示CMS错误

在Customer.php的第42行有什么代码?谢谢,这似乎是最好的解决方案LiteralField::create('DeleteButtonHelp','这就是为什么我看不到delete按钮');
singleton('SiteConfig')->popupCMSError("Sorry your custom message here");