|
|
|
| Информация во всплывающую форму подгружается из JSON. Оператор выбирает таблицу, которую требуется сохранить на компьютере, и эти данные поступают в файл SERVER, на котором считывается из базы содержимое соответствующей таблицы (производитель, артикул, название, цена и количество). Все эти данные необходимо сохранить на компьютере в виде CSV файла. А вот как это сделать, я не знаю… | |
|
|
|
|
|
|
|
для: Владимир55
(15.05.2013 в 17:22)
| | Как обычно - скачивать и сохранять. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2013 в 17:54)
| | А обычно - как это делается? | |
|
|
|
|
|
|
|
для: Владимир55
(15.05.2013 в 18:03)
| | Обычно, это отдается файл посредством скрипта, либо просто ссылкой на него. Но судя по вашему описанию, то что готовится по запросу не сохраняется в файл, но это не важно, отдать можно не файл, а поток, а можно и содержимое буфера:
<?
ob_start();
//здесь код создания csv-данных
$csv = ob_get_contents(); //это содержимое буфера (подготовленные csv-данные) присваиваются переменной
ob_end_clean();
//здесь код выдачи данных пользователю
//где в качестве данных выступает $csv
|
| |
|
|
|
|
|
|
|
для: confirm
(15.05.2013 в 18:16)
| | то что готовится по запросу не сохраняется в файл
Да, без крайней необходимости не хотелось бы этого делать.
Нюанс еще и в том, что header работать не будет, поскольку уже использована всплывающая форма. Так что типовой прием не будет работать (как я предполагаю).
<?
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename=my_file.csv');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.strlen($content));
echo $content;
|
| |
|
|
|
|
|
|
|
для: Владимир55
(15.05.2013 в 18:27)
| | Все будет, если разместить все на своих местах. Например, ваш файл который выдает что-то и передает заголовки какие либо:
<?
if($_GET['file']) { //или POST, что в сущности не важно, является запросом на файл
//тут код подготовки данных и выдачи его
exit; //с обязательным прекращением работы скрипта
}
//а здесь основной код, где вы можете работать с заголовками сколь угодно
//так как выдача файла в самом начале, и основного кода не касается
|
PS. header('Content-Disposition: attachment; filename=my_file.csv'); - если речь идет о выдачи не файла, а данных, то не my_file.csv должно быть, а переменная содержащая данные. (Хотя это имеется ввиду имя для сохранения, а остальное вы уяснили, тогда все верно) | |
|
|
|
|
|
|
|
для: confirm
(15.05.2013 в 18:34)
| | >Все будет, если разместить все на своих местах.
На практике получается вот что.
<?php
// ЭКСПОРТ
if ($module == "export")
{
$gruppa = $_POST['gruppa']; // Название таблицы. В данном примере не используем.
$myfile = $_POST['file_export']; // Имя файла для вывода
$myCsvFile = "Вова;Петя"; // Эквивалент полученной из базы инфы
header("Content-Description: File Transfer\r\n");
header("Pragma: public\r\n");
header("Expires: 0\r\n");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0\r\n");
header("Cache-Control: public\r\n");
header("Content-Type: text/plain; charset=UTF-8\r\n");
header("Content-Disposition: attachment; filename=\"$myfile.csv\"\r\n");
echo $myCsvFile;
exit;
// Переадресация при успешном сохранении
$success_href = (empty($_POST['success_href'])) ? 'server.php' : $_POST['success_href'];
echo '<script id="success">location.href="'.$success_href.'";</script>';
}
|
Естесственно, что в результате просто выводится "Вова Петя". Если же закомментировать exit, то форма просто закрывается и никакого вывода тоже нет. | |
|
|
|
|
|
|
|
для: Владимир55
(16.05.2013 в 11:40)
| | Вы не поняли о чем я вам рассказывал, или я не понимаю, о чем вы сейчас говорите.
На самом деле все просто. Допустим:
//это код страницы, где в начале есть вывод, или передача заголовка
<html>
<head>
....
<?
//какой-то код, и
if(isset($_GET['file])) {
//в этом месте встроен код отдачи файла скриптом
//который предполагает передачу и заголовков
}
| Конечно же при такой структуре кода у вас ничего не получится, так как уже был вывод в браузер, что не позволит передать заголовки отдаваемого файла, и к тому же, это означает, что страница будет перезагружена.
Но если поместить секцию кода выдачи файла в самое начало страницы, и завершить код этой секции выходом, что я вам и показывал, то все будет работать, так как остальной код отвечающий за выдачу страницы не будет выполняться.
Второе решение (зачастую применяемое), это запрос на выдачу файла другим, отдельным скриптом. | |
|
|
|
|
|
|
|
для: confirm
(16.05.2013 в 12:08)
| | >
>Второе решение (зачастую применяемое), это запрос на выдачу файла другим, отдельным скриптом.
Это я понимаю, и если не получится реализация задуманного, то придется перейти на второй вариант. Но только в том случае, если первый вариант действительно не имеет решения. А алгоритм у него такой.
На главной странице имеется ссылка "Экспорт". При клике на нее появляется всплывающая форма, на которой выбирается скачиваемая таблица (и имя создаваемого файла, но это не обязательно). Инфа в форму подгужается из json.php, а результат выбора поступает в файл server.php, где и формирутся информация для скачивания.
При этом всплывающая форма остается открытой.
Чтобы закрыть всплывающую форму, в файле server.php нужно выполнить:
// Переадресация при успешном сохранении
$success_href = (empty($_POST['success_href'])) ? 'server.php' : $_POST['success_href'];
echo '<script id="success">location.href="'.$success_href.'";</script>';
|
Вместе с тем, насколько я понимаю, для сохранения файла на компе надо предоставить пользователю другую, специальную форму для согласия на закачку файла. И получается, что, по любому, форм должно быть две? Всплывающая форма должна закрываться и при этом автоматически должна появляться другая форма для одобрения скачивания?
Таков должен быть алгоритм?
Это технически реализуемо?
(Поиск по сети показал, что в решении проблемы сохранения файла на компе при использовании всплываюшей формы я не одинок - это, действительно, проблема.) | |
|
|
|
|
|
|
|
для: Владимир55
(16.05.2013 в 12:33)
| | Сделать можно все что угодно, нужно только отделить логику сервера от логики клиента. Серверная логика живет пока готовится страница клиенту, а клиентская на всем протяжении работы на странице. Весь последующий диалог клиент-сервер, это отклики сервера на запрос клиента, а обработка этих откликов как раз и есть клиентская логика - что-то показать, что-то скрыть...
Я вообще не сторонник иметь кучу скриптов для того, чтобы решать задачу, то есть к чему данные для формы грузить из одного файла, а решения по этой форме принимать в другом?
К тому же, зачем держать форму открытой дожидаясь чего-то, если ее всегда можно открыть вновь? Если это следствие того, что необходимо будет заново что-то в нее впечатывать, ну так есть и cookie, и localStorage, можно и запомнить.
Для скачивания файла совсем не нужно открывать некую другую форму, так как вы ее уже запросили первой - достаточно ответа сервера, что файл подготовлен, и даже автоматом направить запрос на загрузку (посредством JS на основе ответа сервера). | |
|
|
|
|
|
|
|
для: confirm
(16.05.2013 в 12:59)
| | Спасибо, проблема решена. | |
|
|
|