Předání stránky do handle
- darthcz
- Člen | 113
Dobrý den,
chtěl bych se zeptat, zda lze nějakým způsobem odeslat stránku na které se nachází člověk do handle události. Například jsem na indexu, skryju si některé prvky (nastavím jim pomocí js display: none) a chtěl bych stránku tak, jak vypadá uložit jako pdf. PDF ukládám pomocí PDFResponse jako handle.
Za odpověď děkuji.
- Filip Procházka
- Moderator | 4668
Mě ten tvůj dotaz přijde strašně absurdní :) A víš proč? Protože ty si částečně i rovnou odpovídáš.
Udělej si nějakou Js proměnnou, do které si uložíš co jsi skryl, nebo před odesláním projdi prvky, které se dají skrýt a zjisti jestli jsou skryté. Tuto strukturu pošli na handle. Na straně serveru seskládáš jak potřebuješ a vytiskneš.
Na to jsi fakt nepřišel?
- darthcz
- Člen | 113
No, jde mi prave o to, jak to tomu handle poslat. Pokud tam poslu neco jako ?table_id[]=8&table_id[]=11&table_id[]=15… tak budu mit s narustajicim poctem tabulek narustajici request. A da se ocekavat, ze jednoho dne dosahnu limitu…
Jde mi prave o co nejlepsi reseni takovehoto problemu :) Ale taky mozna jen spatne chapu, jak to funguje :)
Takto posilam handle pro pdf jedne tabulky:
{plink printPDF! analyza_id ⇒ $analyzy[key($analyzy)][‚analyzy_id‘], typ_analyzy ⇒ ‚kl_slov‘, web_id ⇒ $web_id}
- Filip Procházka
- Moderator | 4668
Výborně, tohle je mnohem lepší dotaz. jQuery umí posílat AJAXem POST,
co jsi přijal si pak můžeš v presenteru přečíst v
$this->request->post
.
- darthcz
- Člen | 113
Tak jsem využil tento kód s tím, že se mi vrátí pdf stejně jako by se mi vrátilo v handle. Nicméně nedaří se mi zjistit, jak toto pdf stáhnout. Z handle mi vyskočí klasicky pdf ke stažení. Nevíte, jak na to?
<script>
//po kliknuti na vygenerovani analyzy zjistim vsechny zobrazene anylyzy na strance
$(".pdf").click(function(){
var retezec = "";
//vyberu neskryte divy
$('div[id|="analysis"]:visible').each(function(){
//vytvorim z idecek retezec pro predani post requestu na handle pro pdf
var hideId = $(this).attr("id");
var splittedId = hideId.split("-");
retezec += '"'+splittedId[1]+'",';
});
//odstraneni posledni carky
retezec = retezec.substring(0, retezec.length - 1);
$.post({plink printPDF! typ_analyzy => 'kl_slov', web_id => $web_id}, { 'analyza_id[]': [retezec] }, function(data){ alert("Data Loaded: " + data); });
});
</script>
- Filip Procházka
- Moderator | 4668
Tvůj handle by měl vrátit AJAXu adresu pro přesměrování, na které už bude dostupný soubor pro prohlížeč a AJAX přesměruje. Tohle zpracování je dostupné v nette.jquery.js, který se stará i o snippety.
- darthcz
- Člen | 113
Teď jsem to moc nepochopil… Ted to funguje tak, ze se zavola handle s parametry (ted momentalne ajaxem), handle podle parametru nacte data z databaze, naladuje je do sablony, ze sablony vytvori pdf response a pdf response posle odpoved… Patrne vcetne hlavicek a vseho potrebneho ke stazeni.
Ktery z tech kroku by se mel zmenit? Nerad bych nekde na serveru fyzicky ukladal ty pdf soubory…
- Filip Procházka
- Moderator | 4668
Nejsem si jistý, jestli AJAXem půjde vyvolat stažení souboru.
Můžeš si ale data uložit pod nějakým klíčem do session
$key = Nette\Utils\Strings::random();
$this->context->session->getNamespace('PDF\Analysis')->$key = $data;
vrátit odkaz
$this->payload->redirect = $this->link('download', $key);
$this->sendPayload();
zpracuješ javascriptem. A pak, až to tam javascript přesměruje, tak v té akci si ty data zase vytáhneš
public function actionDownload($ticket)
{
$data = $this->context->session->getNamespace('PDF\Analysis')->$key;
// a vygeneruješ PDF
}
- darthcz
- Člen | 113
Díky moc za odpovědi. V principu to asi funguje nicméně to na mě chrlí chyby typu – nelze číst nedeklarovanou proměnnou context a Nette\Utils\Strings neexistuje (ten sem nahradil za Nette\String)… :(
Mám Nette Framework (version 2.0-dev c1c9de0 released on 2011–01–07) Php 5.3.
Editoval darthcz (19. 8. 2011 19:21)
- Filip Procházka
- Moderator | 4668
Tak zkus místo $this->context->session
jenom
$this->getSession()
(v presenteru).
Editoval HosipLan (19. 8. 2011 19:33)
- darthcz
- Člen | 113
Prepsal jsem to tak, jak uvadim nize a vypisuje se chyba :
PHP Fatal error: Uncaught exception NotImplementedException with message '' in /var/www/databaze/libs/Nette/loader.php:314 @ http://192.168.1.70/…ownload-pdf/?…
$key se nevypise a k die() nedojde … A pote se nejde dostat nikam s hlaskou 500 internal server error… nemuze byt nejak ovlivnena velikost te session nebo neco? to pdf neni zrovna male…
Vrchni cast kodu mimo funkci je samozrejme v handle.. jen jsem ten kod vypichl..
<?php
$key = Nette\String::random();
$session = Nette\Environment::getSession();
$session->getNamespace('PDF\Analysis')->$key = $pdf;
$this->payload->redirect = $this->link('downloadPdf', $key);
$this->sendPayload();
public function actionDownloadPdf($key){
//$session = Nette\Environment::getSession();
//$pdf = $session->getNamespace('PDF\Analysis')->$key;
print_r($key);die();
//$this->sendResponse($pdf);
}
?>
Editoval darthcz (19. 8. 2011 19:46)
- darthcz
- Člen | 113
Tak moc děkuji za rady. Podařilo se mi to rozchodit.
Nelíbilo se tomu ukládání objektu do session a ve stringu mi to zase bylo k ničemu, tak jsem to otočil. V handle jsem si uložil do session proměnné z postu a veškerou ostatní práci jsem udělal po přesměrování, tak jak jste psal. Nejdříve jsem se pokoušel v session prasácky přenášet vygenerované PDF.
- Filip Procházka
- Moderator | 4668
výborně. Pro příště se nauč ještě nějak rozumně formátovat chybové zprávy z laděnky nebo posílat HTML výstup :)
- darthcz
- Člen | 113
Ještě bych se chtěl zeptat, jak to zhruba funguje. Jde mi o ten redirect, ačkoli si totiž zavolám jinou action, stránka mi zůstane stejná. Ten redirect se provádí někde na pozadí? Jde mi o to, že nevím, jak skrýt spinner. Pokud ho totiž spustím, tak ho umím skrýt jen při tom redirectu, což proběhne rychle a to generování pak nějakou chvíli trvá, což je matoucí :(