Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.01.2015, 19:27
Аватар для NewJSUser
Новичок на форуме
Отправить личное сообщение для NewJSUser Посмотреть профиль Найти все сообщения от NewJSUser
 
Регистрация: 09.01.2015
Сообщений: 6

AJAX, Только передача данных.
Здравствуйте! Извиняюсь если не по адресу задаю вопрос или похожая тема уже была. Нужна помощь квалифицированных программистов. Начал писать модуль для сайта (калькулятор услуг). Смысл его в том, что этот калькулятор с помощью PHP делает выборку из БД. Потом пользователь при помощи JavaScript собирает необходимый набор данных и получает HTML таблицу. (все на этой же странице). Затем при помощи ajax надо передать данные php-скрипту, который собирает и отдает пользователю на скачку PDF файл (организовано при помощи FPDF), а вместо файла получаю только набор символов. Хотя php код работает правильно и если обратиться к нему напрямую http://Имя_сайта/exptopdf.php то можно получить файл. Как сделать так, что бы ajax только отдавал данные, а php отдал браузеру файл на скачку?.

вот так выглядит ajax (самый простой, какой только смог найти):
function set_cat(pid, cid) //входящие параметры
{
 var ld = document.getElementById('loading');
 ld.style.display = "block";
 
 $.ajax({
   type: "POST", 
   url: "exptopdf/exptopdf.php", 
   data: "id="+pid+"&cat="+cid, 
   success: function(msg){ 
	   $("#area").html(msg);
   }
 });
}


Это php скрипт, который генерирует PDF файл. Еще не дописал, но что-то он уже делает.

<?php
	$id = $_POST["id"];
	$cat = $_POST["cat"];	
	
	try
	{

		require('../FPDF/fpdf.php');
		$pdf=new FPDF();
		$pdf->AddPage();
		$pdf->AddFont('Calibri','','calibri.php');
		$pdf->SetFont('calibri','',16);
		$pdf->Image('Header.png',10,10,-138);
		
		$pdf->Ln(50);
		$pdf->Cell(210,10,'Коммерческое предложение',0,2,'C');
		$pdf->Ln(20);
		
		$pdf->SetFillColor(233,233,233);
		$pdf->SetDrawColor(118,118,118);
		$pdf->SetLineWidth(.025);
		$pdf->SetFont('calibri','',11);
		
		$pdf->Cell(8,6,"№",1,0,'C',true);
		$pdf->Cell(62,6,"Наименование",1,0,'C',true);
		$pdf->Cell(25,6,"Количество",1,0,'C',true);
		$pdf->Cell(28,6,"Цена",1,0,'C',true);
		$pdf->Cell(28,6,"Сумма",1,0,'C',true);
		$pdf->Cell(38,6,"Примечание",1,0,'C',true);
		$pdf->Ln();
		
		$pdf->Cell(189,6,"Благоустройство",1,0,'C',true);
		$pdf->Ln();
		
		$pdf->Cell(8,6,"№",1,0,'C',true);
		$pdf->Cell(62,6,$id,1,0,'C',true);
		$pdf->Cell(25,6,$cat,1,0,'C',true);
		$pdf->Cell(28,6,"Цена",1,0,'C',true);
		$pdf->Cell(28,6,"Сумма",1,0,'C',true);
		$pdf->Cell(38,6,"Примечание",1,0,'C',true);
		$pdf->Ln();
		
		$pdf->SetCreator('Automatically created document');
		$pdf->SetTitle('Offer');
		$pdf->SetKeywords('Коммерческое предложение, предложение, offer, comercial offer');
		
		$pdf->Output('Offer.pdf','D');
	}
	catch(Exception $ex)
	{
		echo $ex;
	}
?>


Единственное, что удалось получить:
Ответить с цитированием
  #2 (permalink)  
Старый 09.01.2015, 19:31
Аватар для NewJSUser
Новичок на форуме
Отправить личное сообщение для NewJSUser Посмотреть профиль Найти все сообщения от NewJSUser
 
Регистрация: 09.01.2015
Сообщений: 6

Забыл уточнить, уровень JS грамотности - начальный, или даже очень начальный. Только 2 недели с ним работаю. Если будут какие-нибудь советы, дать ссылку или немного подробнее расписать. Заранее благодарен.
Ответить с цитированием
  #3 (permalink)  
Старый 09.01.2015, 20:50
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Не нужен никакой ajax. Вообще js не нужен. Все работает через простую html форму. Сделай кнопку <button type="submit">. Только серваком выставь заголовок Content-Disposition: attachment или что-то вроде того, иначе браузер вместо скачки отобразит пдф.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 09.01.2015, 22:00
Аватар для NewJSUser
Новичок на форуме
Отправить личное сообщение для NewJSUser Посмотреть профиль Найти все сообщения от NewJSUser
 
Регистрация: 09.01.2015
Сообщений: 6

Сообщение от danik.js Посмотреть сообщение
Не нужен никакой ajax. Вообще js не нужен. Все работает через простую html форму. Сделай кнопку <button type="submit">. Только серваком выставь заголовок Content-Disposition: attachment или что-то вроде того, иначе браузер вместо скачки отобразит пдф.
Все поля созданы JSом. Если я передам данные средствами HTML - страница перезагрузится? Если да, то такой вариант не подходит. (если вдруг в каком-то поле будет небольшая ошибка, то придется заполнять таблицу заново). Но за совет спасибо, попробую сделать.
Ответить с цитированием
  #5 (permalink)  
Старый 09.01.2015, 22:09
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от NewJSUser
страница перезагрузится?
Нет, браузер получит в ответ файл и предложит его сохранить. А страница так и останется без изменений.
Сообщение от NewJSUser
Все поля созданы JSом
pid и cat? Или про какие поля речь? Серверу же только pid и cat нужен - остальное не волнует. А зачем для этих значений нужен js? Че эти поля обозначают и по какому алгоритму их js создает?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 09.01.2015, 22:14
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

function buildElement(eltype, params) {
    var el = document.createElement(eltype);
    for (var i in params) el[i] = params[i];
    return el;
}
function submitPost(data, link) {
    var frm = buildElement('form', {method: 'post', action: link});
    for (var i in data) frm.appendChild( 
        buildElement('input', {type: 'hidden', name: i, value: data[i]})
    );
    document.body.appendChild(frm);
    frm.submit();
    document.body.removeChild(frm);
}
 submitPost({name: 'Ivan', year: '25'}, 'index.php');

Функция submitPost оправляет данные Post запросом. Создаем форму и элементы. Отправляем форму и удаляем ее же.
Ответить с цитированием
  #7 (permalink)  
Старый 09.01.2015, 22:36
Аватар для NewJSUser
Новичок на форуме
Отправить личное сообщение для NewJSUser Посмотреть профиль Найти все сообщения от NewJSUser
 
Регистрация: 09.01.2015
Сообщений: 6

Сообщение от danik.js Посмотреть сообщение
Нет, браузер получит в ответ файл и предложит его сохранить. А страница так и останется без изменений.
pid и cat? Или про какие поля речь? Серверу же только pid и cat нужен - остальное не волнует. А зачем для этих значений нужен js? Че эти поля обозначают и по какому алгоритму их js создает?
Я видимо не верно выразился. JS не pid и cat создает (эти переменные для тестирования я вписал).
Так будет нагляднее:
Ответить с цитированием
  #8 (permalink)  
Старый 09.01.2015, 22:37
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Poznakomlus
frm
Много сократил?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 09.01.2015, 22:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Так у тебя "эта таблица" - тупо дубляж полей. Поля сабмитятся без извращений, типа такого, что Poznakomlus предложил .
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 09.01.2015, 22:53
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от danik.js
Много сократил?
от VB осталось
function buildElement(eltype, params) {
    var element = document.createElement(eltype);
    for (var i in params) element[i] = params[i];
    return element;
}
function submitPost(data, link) {
    var form = buildElement('form', {method: 'post', action: link});
    for (var i in data) form.appendChild( 
        buildElement('input', {type: 'hidden', name: i, value: data[i]})
    );
    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
}
 submitPost({name: 'Ivan', year: '25'}, 'index.php');
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение данных со сторонней страницы без сервера и AJAX? alexandr_ftf Общие вопросы Javascript 3 09.09.2013 05:20
Передача данных через Ajax (IE) byFahrenheit AJAX и COMET 5 01.03.2013 16:06
Передача HTML кода на сервер через Ajax KomaLex AJAX и COMET 2 06.12.2012 15:28
ajax, передача данных методом пост makcstroi AJAX и COMET 9 03.08.2012 18:27
передача данных из форм своего сайта в формы стороннего сайта najrobi Общие вопросы Javascript 19 15.07.2012 22:18