通过Model Admin&amp ;;向用户提出错误数据对象:: onBeforeDelete()

时间:2014-07-15 09:38:27

标签: silverstripe modeladmin

鉴于我使用Model Admin来管理Customer DataObject,我有类似的代码,取自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

如何收到回复模型管理员的好消息"无法删除带订单的客户"?

3 个答案:

答案 0 :(得分:4)

除了重载验证功能外,您还可以抛出ValidationException

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

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

答案 1 :(得分: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 Framework核心中使用相同的样式来显示CMS错误。

答案 2 :(得分:1)

你可以试试这个:

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

}

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