0

鉴于我正在使用模型管理来管理客户数据对象,并且我有这样的代码,取自 SilverStripe 文档:

public function onBeforeDelete() {
    if ($this->Orders()->Count() > 0) {
        user_error("Cannot delete a Customer with Orders", E_USER_ERROR);
        exit();
    }
    parent::onBeforeDelete();
}

当我尝试通过模型管理删除带有订单的客户时,我得到的只是一个 JavaScript 警报,上面写着“从服务器获取数据时发生错误。请稍后再试”以及右上角的通知

Error at line 42 of /var/www/mysite/code/dataobjects/Customer.php

我如何收到一条好消息返回给模型管理员说“无法删除带有订单的客户”?

4

3 回答 3

4

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

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

ValidationException被表单处理代码捕获,应该将错误显示为右上角的弹出消息之一。

于 2014-08-12T00:03:54.753 回答
3

您可以在右上角以 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 扩展 DataExtension 之类的类中。

public function popupCMSError($message='The action is not allowed', $errorCode=403)
{
        header("HTTP/1.1 $errorCode $message");
        exit;
}

然后,您始终可以通过以下方式在像您这样的情况下或出于任何其他目的调用它(例如,如果在 siteconfig 类中):

singleton('SiteConfig')->popupCMSError("Sorry your custom message here");

注意:我在这里使用 HTTP 错误 403 仅作说明。您也可以使用其他标题。Silverstripe 框架核心使用相同的样式来显示 CMS 错误。

于 2014-09-07T10:16:17.410 回答
1

你可以试试这个:

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

}

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

于 2014-07-17T06:52:08.400 回答