Имеется задача. Нужно получить выборку товаров на сайте (это просто), отметить галочкой нужные, а затем по нажатию кнопки скачать прайс-лист с выбранными товарами в формате 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 нашей скрытой формы (через запятую).
Создаём кнопку получения прайс-листа, по которой эта форма будет отправляться.
<p><button id="button_price">Получить прайс</button></p>
Раз кнопка вне формы (поскольку форма скрыта), то пропишем для неё обработчик на js.
$('#button_price').on('click', function(e){
e.preventDefault();
$("#item_ids_form").submit();
return false;
});
Получается, в html-форма умеет отправить данные на страницу, которая откроется в соседнюю вкладке.
Почему было не сделать такую возможность для ajax, для меня загадка. Всего-то пару параметров добавить. Видимо не настолько часто приходится реализовывать подобное, чтобы ради этого драконить ajax.