鉴于我使用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
如何收到回复模型管理员的好消息"无法删除带订单的客户"?
答案 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);
}
这将完全删除删除按钮,但您必须以其他方式向用户说明原因。