Autor Zpráva
maktub
Profil *
Zdravím, už tu pár hodin bojuju s jednou mojí neznalostí a tou je AJAX...

Řekněme, že mám dva divy, jeden slouží uživateli pro vkládání dat do textových polí, vložené hodnoty se použijí pro převod do PDF pomocí TCPDF knihovny:
<div id="insertingValues">
  <form id="quotationForm" action="php/create_quote.php" method="POST">
    // není třeba vypisovat pole, ale co byste měli vědět je, že všechny relevantní mají třídu .c (jako control) pro vyvolání události.
  </form>
</div>

Obsah druhého divu by měl být náhledem tohoto PDF před skutečným odesláním formuláře.
<div id="pdfPreview"></div>

Takže jsem vypsal AJAX, ale bohužel vůbec nevím jak na to.
$('.c').on('blur',function(){
    $.ajax({
        type: 'POST',
        url: 'php/create_quote_preview.php',
        data: $('#quotationForm').serialize(),
        success: function(data){
            $('#pdfPreview').html(data);
        },
        dataType: 'html'
    });
});

Samozřejmě s tímhle bych potřeboval poradit, prošel jsem všelijaké fóra, vyzkoušel všelicos, ale bohužel vás budu muset obtěžovat a prosit o jakoukoliv radu. Je třeba pozměnit typ dat, ale já nevím jak...

Ještě k TCPDF - tu jsem vybral hlavně kvůli podpoře UTF8. Na konci dokumentu používá:
$pdflocation = 'cesta/název_souboru';
$pdf->Output('$pdflocation', 'I');
  // I pro vykreslení PDF v prohlížeči, nebo...
$pdf->Output('$pdflocation', 'F');
  // F pro uložení souboru

Pokud byste někdo věděl co s tím, ocenil bych alespoň nasměrování. Díky
Alphard
Profil
Jaký je záměr, co vlastně ten php script vrací? Tímto způsobem $('#pdfPreview').html(data); zřejmě jedině aby php script vracel html kód obsahující iframe s cílem toho pdf.
Postup by tedy byl někam na server uložit pdf jako soubor a posílat jen cestu k němu.

Alternativně existuje např. Google Docs Viewer plugin for jQuery, který by mohl být vhodný, pokud bude možné vynutit za běhu znovunačtení zdroje, zkuste.
maktub
Profil *
Alphard:
Pokud použiju skript přímo při odeslání formuláře, tak právě díky I v $pdf->Output($pdflocation, 'I'); zobrazí převedené HTML do PDF přímo v prohlížeči, stejně jako když si v něm otevřete jakékoliv jiné PDF. Ještě před samotným AJAXem jsem se snažil tenhle problém vyřešit s jQuery .load metodou, ale to mně bylo také k ničemu.
Takže mým cílem jej bylo vložit pomocí AJAXu do divu #pdfPreview. V současné době ale ukazuje toto (to, co lze vidět, je opravdu #pdfPreview). O zmíněné alternativě s <iframe> jsem už četl a taky jsem ji zkoušel, do #pdfPreview jsem vložil iframe s nějakým ID, PDF output jsem nastavil na uložení a poté v JavaScriptu pro tento iframe .setAttribute('src', 'cesta');, ale změna se vůbec neprojevila. Za chviličku mrknu na tu plužinu od Vás. Děkuji za reakci.
maktub
Profil *
Alphard:
Pokud jsem to správně pochopil, tak je to vlastně na stejný způsob, jako přímo vypsaný iframe, o kterém jsme psali, s tím rozdílem, že plužina přepíše odkaz na iframe a obalí divem a to všechno lze stylovat pomocí CSS, je to tak? Prosím, poraďte mi, nějak jsem v tom nenašel řešení mého problému.
Začínám si myslet, že udělat živý náhled PDF je pro mě problém, přesto by se mohlo zdát, že to v dnešní době nebude takový problém. Můžu se zeptat, jestli jste někdy dělal takovou aplikaci, kde je třeba použít náhled PDF?


maktub:
kde je třeba použít náhled PDF
Samozřejmě jsem se nevyjádřil úplně přesně, mám na mysli náhled právě upravovaného formuláře, který má (třeba i mj.) předložit data pro vytvoření PDF.
Fisir
Profil
Reaguji na maktuba:
Nepoužívej AJAX, ale úplně normálně odešli formulář, s tím, že atribut action bude mířit na skript pro generování PDF. Vytvoř si iframe, nastav mu nějaký name a obshah atributu name vlož do atributu target formuláře. Skript pro generování PDF si nastav tak, aby ti PDF vypsal rovnou.

Pokud chceš PDFko aktualizovat jindy než při odeslání formuláře, můžeš ten formulář odesílat JavaScriptem (například jako to máš teď).
Alphard
Profil
maktub:
zobrazí převedené HTML do PDF přímo v prohlížeči, stejně jako když si v něm otevřete jakékoliv jiné PDF
Předpokládám ale, že zobrazí jen to pdf, ne kombinaci html a pdf. Tohle funguje, protože se odešlou hlavičky, že jde o pdf, a pak se může vypsat binárka. Když ta binární data vložíte kamkoliv v rámci html, tak to samozřejmě dopadne tak, jak vidíte.
Ať již to uděláte tak, jak jsem navrhovál já, nebo [#5] Fisir, podstatou je neodesílat binární obsah pdf přes ajax (což vede k problémům), ale vytvořit podmínky samostatné stránky pro odeslání hlaviček, binárních dat a ukončení výstupu.
maktub
Profil *
Fisir:
Víte, jde o formulář pro tvorbu cenové nabídky, lze tam nastavit typ cenové nabídky, jazyk, graf. styl, formát, orientaci, měnu a vůbec všechno možné a AJAXem jsem chtěl jaksi zajistit, aby měl uživatel aplikace rychlý náhled PDF bez odesílání formuláře a jaksi se mně zdá, že tímhle by o to přišel a zároveň by to nesedělo do jakési "aury" ostatních částí aplikace. Každopádně díky moc za nápad a jestli na to dneska nepřijdu, tak už s tím ztrácet čas nebudu a zkusím to takhle. Díky moc.

Alphard:
Ano, určitě, zobrazí jen to PDF, já jsem hned při zakládání topicu věděl, že to je špatně a předtím jsem zkoušel různé možnosti změn typu dat a vždycky to bylo na víc jak dva řádky, ale vždycky bez úspěchu. Každopádně bylo z toho poznat, že to je možné a že se s tím už několik lidí přes net pralo, ale jednoduše to pro mě nesedělo.
ale vytvořit podmínky samostatné stránky pro odeslání hlaviček, binárních dat a ukončení výstupu.
Jinak, tedy zdá se, že to bez toho odesílání jen tak nepůjde? Přesto, mockrát díky za reakce Vám oběma.
Fisir
Profil
Reaguji na maktuba:
rychlý náhled PDF bez odesílání formuláře
Tohle můžeš zajistit i odesíláním formuláře přes JavaScript (formular.submit()). Prostě místo AJAXového volání odesílej formulář.
maktub
Profil *
Fisir:
Tomu moc dobře nerozumím, mohl bys to, prosím, trochu rozvinout?
Fisir
Profil
Reaguji na maktuba:
Pokud bys to chtěl mít stejně jako teď, tedy obnovení při každé ztrátě focusu, místo AJAXu odešleš formulář:
<form action="pdf.php" target="pdf" method="post" id="formular">
<input type="text" name="bla" class="c">
</form>
<iframe name="pdf" src="about:blank"></iframe>
<script>
$('.c').on('blur', function(){
    document.getElementById('formular').submit();
});
</script>
V iframe se ti zobrazí výsledné PDFko a obnoví se pokaždé, když nějaký input se třídou c ztratí focus.
maktub
Profil *
Ach, můj bože, děkuji Ti :-) Na stotisíckrát! Chápu to.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0