Předání stránky do handle

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
darthcz
Člen | 113
+
0
-

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
+
0
-
<a href="javascript:window.print()">Tisknout</a>
darthcz
Člen | 113
+
0
-

No, to právě nechci tisknout… Potřebuji tu stránku uložit do pdf pro zaslání emailem… respektive potřebuji jako pdf uložit jen uživatelem upravenou šablonu…

Editoval darthcz (19. 8. 2011 15:21)

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Tak zkus místo $this->context->session jenom $this->getSession() (v presenteru).

Editoval HosipLan (19. 8. 2011 19:33)

darthcz
Člen | 113
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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í :(