Silverstripe 通过Model Admin&;向用户提出错误;DataObject::onBeforeDelete()
鉴于我使用模型管理员管理客户数据对象,我有如下代码,取自SilverStripe文档: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
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");