Laravel Ajax отправить форму в dompdf распечатать в новой вкладке - PullRequest
0 голосов
/ 27 сентября 2019

в фреймворке Laravel я скачал пакет domPDF.Я хотел создать отчет в формате PDF:

  1. Пользователь отправляет форму
  2. Данные формы будут проходить по маршруту Route::post('/customers/pdf', 'AjaxController@export_pdf')->middleware('auth');
  3. Функция export_pdf in AjaxController получит данные формы и обработает их в базе данных.
  4. После завершения процесса базы данных результат запроса будет передан mypdf.blade.php.Пока вывод PDF выполнен успешно, но не может быть объединен с данными формы из внешнего интерфейса.

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

web.php

Route::post('/customers/pdf', 'AjaxController@export_pdf')->middleware('auth');

report.blade.php

<form method="post" id="FormReport">
    <div class="form-group">
        <label class="d-block" for="mobilenumber">Step 1 - Report Type</label>
        <div class="input-group">
            <div class="input-group-prepend">
                <i class="mdi mdi-pencil-outline input-group-text" aria-hidden="true"></i>
            </div>
            <select class="form-control" id="reporttype" name="reporttype" required>
                <option value="" disabled selected></option>
                <option value="1">Report A</option>
            </select>
        </div>
    </div>
    <div class="row">
        <div class="col-12">
            <div class="form-group mb-0">
                <label class="d-block">Step 2 - Select Dates</label>
            </div>
        </div>
        <div class="col-sm-6">
            <div class="form-group">
                <label class="d-block" data-target="#fromdate" data-toggle="datetimepicker">From Date</label>
                <div class="input-group">
                    <div class="input-group-prepend">
                        <i class="mdi mdi-pencil-outline input-group-text" aria-hidden="true"></i>
                    </div>
                    <input type="text" class="form-control datetimepicker-input" id="fromdate" name="fromdate" data-toggle="datetimepicker" data-target="#fromdate" required />
                </div>
            </div>
        </div>
        <div class="col-sm-6">
            <div class="form-group">
                <label class="d-block" data-target="#todate" data-toggle="datetimepicker">To Date</label>
                <div class="input-group">
                    <div class="input-group-prepend">
                        <i class="mdi mdi-pencil-outline input-group-text" aria-hidden="true"></i>
                    </div>
                    <input type="text" class="form-control datetimepicker-input" id="todate" name="todate" data-toggle="datetimepicker" data-target="#todate" required />
                </div>
            </div>
        </div>
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-success mt-3">Generate</button>
    </div>
</form>

<script type="text/javascript">
    $(document).ready(function() {
        var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');

        $('#fromdate, #todate').datetimepicker({
            format: 'YYYY-MM-DD'
        });

        $(document).on('submit', '#FormReport', function(e) {
            e.preventDefault();

            $('.pre-loader').show();

            var form = $(this);
            var formData = new FormData(form[0]);

            $.ajax({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
                url: '/customers/pdf',
                type: "POST",
                data: formData,
                dataType: 'json',
                contentType: false,
                processData: false,
                cache: false,
                success: function(data) {
                    // How should I proceed here?
                },
                error: function(xhr, ajaxOptions, thrownError) {
                    console.log('Error', xhr);
                },
                complete: function(c) {

                }
            });

        });
    })
</script>

AjaxController @ export_pdf

public function export_pdf(Request $request)
{
    $fromdate = $request->input('fromdate');
    $arr_products = $arr_product = array();

    try {
        $rs_product = DB::select("select a.prod_desc, a.prod_location from product_store a where a.created_date >= ?", [$fromdate]);
        $numrow_product = count($rs_product);

        if ($numrow_product > 0) {
            foreach ($rs_product as $row_product) {
                $prod_desc = $row_product->prod_desc;
                $prod_location = $row_product->prod_location;

                $arr_product['prod_desc'] = $prod_desc;
                $arr_product['prod_location'] = $prod_location;

                $arr_products[] = $arr_product;
            }
        }
    } catch (\Illuminate\Database\QueryException $ex) {
        $this->error['form-message'] = 'ERR' . __LINE__ . ': Report is unavailable';
    }

    if ($this->error == '') {
        $data = ['title' => 'Product In Store', 'productlist' => $arr_products];
        /* I think this part has to do with the output of PDF? */
        $pdf = PDF::loadView('mypdf', $data);
        return $pdf->stream('productinstore_'.date('YmdHis').pdf');
    }
}

mypdf.blade.php

@guest
@else
<!DOCTYPE html>
<html>
<head>
    <title>{{$title}}</title>
</head>
<body>
    <table class="content" width="100%">
        <thead>
            <tr>
                <th>Description</th>
                <th>Location</th>
            </tr>
        </thead>
        <tbody>
        @foreach ($productlist as $products => $product)
        <tr>
        <td>{{ $product['proddescription'] }}</td>
        <td>{{ $product['prodlocation'] }}</td>
        <tr>
        @endforeach
        </tbody>
    </table>
</body>
</html>
@endguest

1 Ответ

0 голосов
/ 27 сентября 2019

Вот шаги, которые я выполнил, чтобы решить вашу проблему: создал api/pdf и сгенерировал pdf, как показано ниже,

Route::get('pdf', function () {
    $path =  public_path() . '/data.pdf';
    PDF::loadView('customers', [])->save($path);
    return response()->json(env('APP_URL').'/data.pdf');
});

Я использовал общую папку для сохранения файла pdf и $pathотвечает за путь к папке public.Затем я сохраняю файл PDF, используя save().Мы можем получить доступ к загруженному файлу, используя url и мой случай localhost:8000/data.pdf, поэтому я восстановил urlПосле этого в ajax я перехватил ответ и создал ссылку для скачивания.

 $("#exportPDF").click(function() {
   $.ajax({
      type : "get",
      url  : "api/pdf",
      success : function(data) {
          $('.links').append(`<a href="${data}" download="file" target="_blank">Download File</a>`);
      }
    });
});

Надеюсь, это полезно.Я нашел несколько полезных ответов, связанных с вашим вопросом и прикрепленных ниже:

Обработка загрузки файла с поста ajax

Использование PHP DOMPDF и AJAX для загрузки PDFФайл

...