https://www.lexium.ru/2023/01/otkryt-fajjl-v-sosednejj-vkladke-peredav-tuda-dannye-metodom-post/

Открыть xls файл в соседней вкладке, передав туда данные методом post

Имеется задача. Нужно получить выборку товаров на сайте (это просто), отметить галочкой нужные, а затем по нажатию кнопки скачать прайс-лист с выбранными товарами в формате xls.

Превратить php-скрипт в xls легко.

<? //Генерация xls-файла
header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" );
header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" );
header ( "Cache-Control: no-cache, must-revalidate" );
header ( "Pragma: no-cache" );
header ( "Content-type: application/vnd.ms-excel;charset=UTF-8;" );
header ( "Content-Disposition: attachment; filename=items_export.xls" );
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//RU" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="none" />
<title>Demo</title>
</head>
<body>
<table><tr><th>Заголовок</th></tr><tr><td>Содержимое</td></tr></table>
</body>
</html>

По сути php файл прикинется файлом xls.

Осталось только передать ему ID нужных товаров. И вот в этом получается затык.

Есть ajax. С его помощью можно передать данные серверному скрипту и получить от него ответ. Однако с его помощью нельзя получить файл и открыть его в соседней вкладке. И тогда на помощь приходит костыль.

Создаём скрытую форму со скрытым текстовым полем. Прописываем в тэге form путь к php-скрипту и его открытие в соседней вкладке.

<form id="item_ids_form" method="POST" target="_blank" action="/php_scripts/xls/">
<textarea style="display:none;" id="item_ids_container" name="item_ids"></textarea>
</form>

Делаем js-скрипт, который при работе с выборкой (при снятии/простановке галочек) будет добавлять ID в textarea нашей скрытой формы (через запятую).

Код js-скрипта приводить не буду, поскольку в каждой конкретной ситуации он будет отличаться.

Создаём кнопку получения прайс-листа, по которой эта форма будет отправляться.

<p><button id="button_price">Получить прайс</button></p>

Раз кнопка вне формы (поскольку форма скрыта), то пропишем для неё обработчик на js.

$('#button_price').on('click', function(e){
e.preventDefault();
$("#item_ids_form").submit();
return false;
});
Впрочем, обработчик делать не обязательно, ведь скрыть можно не всю форму, а только поле (textarea). Тогда кнопку размещаем непосредственно в форме и отправка данных произойдёт по клику, без дополнительного js. Кнопка должна быть тэгом button, или input (с параметром type=’submit’)

Получается, в html-форма умеет отправить данные на страницу, которая откроется в соседнюю вкладке.

Почему было не сделать такую возможность для ajax, для меня загадка. Всего-то пару параметров добавить. Видимо не настолько часто приходится реализовывать подобное, чтобы ради этого драконить ajax.

Напишите комментарий