Вы должны сделать это с ajax, потому что вы действительно не знаете, сколько времени потребуется серверу для создания PDF-файла.
HTML:
<button class="btn btn-info mt-2" type="button" data-id="{{ $syllabus->id }}" id="botonimprimir"><span data-feather="printer"></span> Imprimir Syllabus</button>
Я бы изменил маршрут с именем exportarpdf
на маршрут post
вместо get
.
JS (используя jQuery):
//Make sure that the following line is inside the blade.php file:
var ruta_pdf = "{{ route('exportarpdf') }}";
//The rest of the javascript code can be inside a `js` file:
$(document).ready(function(){
iniciarEventos();
});
function iniciarEventos(){
$('#botonimprimir').on('click', function(e){
enviarPeticion(this);
});
}
function enviarPeticion(elemento){
var id = $(elemento).data('id');
$.ajax({
type: 'post',
url: ruta_pdf,
dataType: 'json',
data: {id: id},
beforeSend: function(){
var contenedor = document.getElementById('contenedor_carga');
contenedor.style.visibility = 'visible';
contenedor.style.opacity = '1';
}
}).done(function(response){
var contenedor = document.getElementById('contenedor_carga');
contenedor.style.visibility = 'hidden';
contenedor.style.opacity = '0';
window.location.replace(response.ruta);
}).fail(function(xhr, textStatus, errorThrown){
var contenedor = document.getElementById('contenedor_carga');
contenedor.style.visibility = 'hidden';
contenedor.style.opacity = '0';
});
}
Метод контроллера:
public function exportpdf($syllabusid){
$syllabus = Microdiseno::find($syllabusid);
set_time_limit(300);
$paper_size = array(0,0,800,1300);
$pdf = PDF::loadView('syllabus.syllabuscompleto.prubapdf', compact('syllabus'))->setPaper($paper_size);
//you would need to save the pdf here inside a folder, I will use public folder just for this example:
$pdf->render();
$output = $pdf->output();
file_put_contents(public_path('pdf/your-file.pdf'), $output);
//Now you need to return the path from your just created PDF:
$ruta = asset('pdf/your-file.pdf');
$response = array();
$response['ruta'] = $ruta;
return response()->json($response);
}
Следующий фрагмент кода будет перенаправлен на созданный путь с помощью javascript: window.location.replace(response.ruta)
, так как это файл PDF, если браузер поддерживает его рендеринг, он будет покажите файл, если он не имеет поддержки, загрузка будет принудительной. Если вам НУЖНО форсировать загрузку всегда, я оставлю вам остальное, вам не нужно добавлять слишком много кода, чтобы форсировать загрузку.