[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHPExcel и проблема с header
Gurchava
Доброго времени суток. Сейчас я разрабатываю простенький конструктор отчетов. Пользователь выбирает данные из базы, после чего информация выводиться в виде таблицы на экран, далее можно сохранить эту таблицу в виде xlsx файла. Как раз с сохранением у меня и возникла проблема. Сохраняю я с помощью библиотеки PHPExcel. Чтобы пользователь мог выбрать путь сохранения согласно документации нужно добавить такой код:

// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');

// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0

Проблема в том, что когда я добавляю этот код, вместо окошка, где пользователь выбирает путь сохранения файла, на экране появляется набор бессвязных символов. Я понял, что это связано с тем, что информацию header нужно отправлять до html тегов т.к. добавив этот код в самое начало, я обнаружил, что окошко появилось после загрузки сайта. Загвоздка в том, что пользователь должен сначала выбрать данные с помощью различных списков и полей, которые в свою очередь описываются с помощью тегов и должны быть выведены на экран. Подскажите, как можно решить эту проблему?
Valick
Gurchava, странно слышать подобный вопрос от человека разрабатывающего простенький конструктор отчетов.
Что мешает разделить логику кода обработки и логику вывода html?
Что мешает сделать обработчик вообще в другом файле?

_____________
Стимулятор ~yoomoney - 41001303250491
AllesKlar
Valick Злюка.


Gurchava
Ты на верном пути.
Но я не сторонник обычной помощи, хотя тут и 3 строчки кода.
Сначала нужно выесть тебе мозг :) Надеюсь, это пойдет на пользу :)

В общем, ты отправляешь заголовки в браузер
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

Но отправлять заголовки в браузер нужно ДО того, как был сделан хоть какой-либо вывод данных.
Что такое вывод. Любое echo, любой вывод тега HTML. Что при этом происходит: сервер сначала отправляет заголовки (даже если просто стоит echo "";), а потом выдает данные, а потом ты пытаешься еще раз отправить заголовки. Но раздел заголовков уже ушел... вот и получется мешанина.

Поэтому, переведя на толерантный язык сообщене от злюки, делать тебе нужно следующим образом:

1. Пользователь выбирает все, что хочет (forma.html), нажимает sbmit
2. Форма прилетает в обработчик формы (handler.php).
3. Обработик формы (handler.php) проверяет все полученные данные на коректность, если все с ними ОК, то записывает их в сессию и делает редирект на скрипт (get_excel.php), который читает данные из сессии, генерирует Excel книгу и выдает ее в браузер.
4. После того, как get_excel.php отдал файл, он так же делает редирект.. ну, куда там тебе нужно, после скачивания файла. например, опять на forma.html

_____________
[продано копирайтерам]
Valick
AllesKlar, я ни разу не злюка smile.gif
Кстати зачем сессия и редиректы? Не ищем легких путей? biggrin.gif


_____________
Стимулятор ~yoomoney - 41001303250491
AllesKlar
Цитата
Кстати зачем сессия и редиректы? Не ищем легких путей?

Сессия для чтения данных после редиректа.
Редирект - стандартная вещь обработчика формы.
Для кого эта вещь нестандартная, тот Попов tongue.gif
// чтобы по F5 форма из браузера еще раз не летела на сервер.

_____________
[продано копирайтерам]
Gurchava
Что ж, спасибо за советы, приняв их во внимание, я переделал структуру программы так, что данные из формы, которая расположена в отдельном файле, отправляются по нажатию кнопки с помощью ajax сценария на контроллер (сам сайт я пишу с помощью codeigniter), где данные проверяются, обрабатываются и выводятся на экран, после чего записываются в сессию.

По нажатию другой кнопки происходит перенаправление на контроллер отвечающий за сохранение данных в файл, где нет ни одного тега и echo и где данные считываются из сессии и записываются в excel файл.

К сожалению проблема осталась, все так же вместо окна с выбором пути сохранения на экран выводятся бессвязные символы, как пример :

PKDG�D�X�[Content_Types].xml��MN�0���"�%nY ��vAa �(0����ؖg�w{&i �@�nbE�{��y��d۸l m������X�(���)�A 533;�F���;@1_������c)jᦙ ; 3;x/%��E��y� �QĿi!��K�y3�J<���Z1�0?Y�L%zV c��Ib7�����a/l٥P1:�q�r� ; ;�j��j0A����u�""���(� ���W�M��)Tj�({ܲ�>�Oᦙ ; 3;�,X٭���>B��~׭� ......

При этом если сохранять файл в корень сайта, без использования header, сохранение произойдет, и все данные запишутся в файл корректно. Если добавить тег в начало файла, ожидаемо появиться ошибка headers already sent. В моем же случае выводиться лишь абракадабра без каких либо ошибок. В чем здесь проблема?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.