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