Есть следующая проблема:
Допустим, я отправляю данные формы в PHP через стандартный submit формы, без использования js. На стороне PHP я обрабатываю данные формы и формирую заголовки для формирования Эксель файла, которые вывожу командой echo:
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=Rep' . '.csv');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
echo "num;date;phone;fio;status;\n";
/* Здесь формируемы данные по циклу */
exit;
Такой вариант работает хорошо, и по итогу отработки скрипта у меня скачивается файл.
Но что делать, если мне нужно отправить запрос не стандартным submit формы из html, а POST-запросом из JS в PHP?
$('#dont_issue').click(function() {
$.post('/admin/plugins/subscribe/index.php?act=analyticDownload', {'id': id}, function (res) {
});
});
Таким образом я передаю ID в PHP-скрипт, который получает данные из базы данных и в итоге должен сформировать Эксель файл с соответствующими заголовками. Т.е. теперь все заголовки и данные формируемые в серверной части теперь должны возвращаться в JS. Как указать JS-скрипту, что он должен запустить скачивание файла так же, как и в первом случае?
$.ajax({
type: "POST",
url: url,
data: params,
success: function(response, status, xhr) {
// читаем заголовок от PHP и получаем имя файла
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
var type = xhr.getResponseHeader('Content-Type');
var blob = new Blob([response], { type: type });
if (typeof window.navigator.msSaveBlob !== 'undefined') {
//https://msdn.microsoft.com/en-us/library/hh772331(v=vs.85).aspx
//Сохраняем на диск
window.navigator.msSaveBlob(blob, filename);
} else {
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
if (filename) {
// создадим ссылку с атрибутом HTML5 a[download] для указания имени файла
var a = document.createElement("a");
if (typeof a.download === 'undefined') {
window.location = downloadUrl;
} else {
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
}
} else {
window.location = downloadUrl;
}
setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // чистим мусор)
}
}
});
Осторожно используются экспериментальные технологии ;) https://developer.mozilla.org/ru/docs/Web/API/URL/createObjectURL https://developer.mozilla.org/ru/docs/Web/API/URL/revokeObjectURL
Можно еще поступить так (правда немного зашкварно) На серверной части "отрендерить" JavaScript код
Например
<?php
$someHeaderParam = 'XMLHttpRequest';
$script = <<<EOF
<script>
var header = {$someHeaderParam};
</script>
<<<EOF;
Сейчас мозаику можно собрать в любой последовательности, но надо чтобы последовательно, то есть сначала к первой мозаике вторую, ко второй...
Есть фрейм с вычислением площадиНикак не могу понять как сделать, чтобы при совершении вычислений, менялся фон фрейма
сколько себя помню всегда верстал такие секции след образомПросто брал картинку в таком формате и ставил как background
Здравсвтуйте! Есть прикрепленное изображениеОно является кнопкой меню навигации по сайту