Подайте ошибку пользователю через 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.

Другие вопросы по тегам