Подайте ошибку пользователю через Model Admin & DataObject::onBeforeDelete()
Учитывая, что я использую 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();
}
Когда я пытаюсь удалить клиента с заказами через Model Admin, все, что я получаю, это предупреждение JavaScript, которое говорит: "Произошла ошибка при получении данных с сервера. Повторите попытку позже" и уведомление в правом верхнем углу
Error at line 42 of /var/www/mysite/code/dataobjects/Customer.php
Как получить приятное сообщение для администратора модели с надписью "Невозможно удалить клиента с заказами"?
3 ответа
Вы можете попробовать это:
public function canDelete($member=null) {
if ($this->Orders()->Count() > 0) {
return false;
}
return parent::canDelete($member);
}
Это полностью удалит кнопку удаления, но вам придется прояснить для ваших пользователей, почему по-другому.
Помимо перегрузки функции проверки, вы можете бросить 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 extends 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.