Показать сообщение об ошибке в случае необходимости при отдаче файла pdf в браузер

188
15 октября 2018, 22:10

При клике по иконке пользователем на сервер предается некий emploee_id на основании которого сервер делает вычисления и если эти вычисления верны, в новой вкладке браузера должен открыться pdf документ(что на данный момент и происходит).
Но если валидация не будет пройдена, то пользователя необходимо уведомить всплывающим сообщением с описанием ошибок.

Вот тут у меня не получается сообразить, как это сделать. Вся проблема в том, что на клиенте responseType = 'blob' - при изменении которого, например на json, документ пдф открывается с ошибками.
Во всем приложении данные отправляются с сервера в виде json:
{"status_code": 200, "status": "success", "text": null, "data": [{...},...]}.
Но нижележащий код у меня не получается под такой формат подогнать.

PS: Я пробовал конвертировать конечную выдаваемую строку сервером через base64_encode и упаковывать все в json вида:

{
  "status": "success",
  "binary_data": base64_encode($string)
}

а на клиенте декодировать через window.atob(string)и подставлять это в конструктор new Blob(), но ничего не выходит, документ открывается с ошибками



Код сервера:

    // здесь происходит несколько этапов валидации по различным правилам
    // в результате чего в $errors формируется строка из ошибок
    ...
    if(!$this->form_validation->run('mto_rules'))
    {
        $errors .= validation_errors();
    }
    if($errors !== '')
    {
        // здесь нужно как-то уведомить пользователя об ошибках
        // во всем приложении реализовано:
        // $response['status_code'] = 200;
        // $response['status'] = 'error';
        // $response['text'] = $errors;
        // ....
        // тут могут быть вычисления какие-либо
        // ....
        // и в самом конце метода, после всех проверок
        // $this->output->set_status_header($response['status_code'])
        //                ->set_output($response);
    }
    // Формируем некий html  и переводим в pdf библиотекой TCPDF
    ...
    ...
    $pdf->writeHTML($html, true, false, false, false, '');
    // отдаем бинарную строку - ВАЖНО!!!
    echo $pdf->Output('', 'S');

Код клиента:

            var xhr = new XMLHttpRequest()
            xhr.open('GET', 'my.php?emploee_id=' + emploee_id, true)
            xhr.responseType = 'blob'               
            xhr.onload = function(e) {
                var blob = new Blob([this.response],{type: 'application/pdf'})
                var url = window.URL.createObjectURL(blob)
                window.open(url)
            }
            xhr.send()
READ ALSO
Разбивка строки по длинее и переносу строки

Разбивка строки по длинее и переносу строки

Есть такая функция, которая разбивает строку на части заданной длинны:

164
Yii2 Все товары в подкатегориях

Yii2 Все товары в подкатегориях

Вообщем такая проблема, есть проект на yii2 там есть категории с бесконечной вложенностью и такая задача вывести все товары из данной под категории...

159
Как спарсить данные с сайта, если стоит blazingfast.io

Как спарсить данные с сайта, если стоит blazingfast.io

Не удается спарсить данные с https://anistarme/

172
Не полный перенос строки в потоке ввода

Не полный перенос строки в потоке ввода

Нужно отформатировать номер телефона в формате +XXX-YYY-ZZZZZZ и распределить по аргументам номера страны, региона и области, при этом номера между...

206