Kompletni Html vystup templatu

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

Zdravim,
mam dotaz, jestli existuje nejaka rozumna cesta, jak ziskat HTML aktualni stranky do Nette, tedy jestli je mozne ho dostat nejak behem vykresleni jeste do nejake promenne nebo session, pripadne potom do nejakeho handleru?
V zasade situace kdy na strance mam tlacitko „Zobraz HTML“ a po kliknuti na nej se zobrazi klidne string s veskerym html.
Zkousel jsem to pres file_get_contents, ale tam se to pak zacykly ve chvili, kdyz to vlastne znovu rekonstruuje stranku na ktere je tato fce.

tomasnikl
Člen | 137
+
0
-

asi to neni reseni (s nette zacinam), ale neco k tomu zacykleni… volej tu stranku s nejakym parametrem a pridej podminku, pak se ti to nezacykli.. zjednodusene:

<a href="zobraz-html.php?zobraz-html=true">zobraz HTML</a>

//a v kodu php potom:
if(isset($_GET['zobraz-html'])){
	$c = file_get_contents('www.web.cz/zobraz-html.php');
}

takze ti to vlastne vola stranku bez parametru a tudiz se to nezacykli..

JakubS
Člen | 15
+
0
-

llsm napsal(a):
mam dotaz, jestli existuje nejaka rozumna cesta, jak ziskat HTML aktualni stranky

Makrem {capture} ?

llsm
Člen | 121
+
0
-

dekuji za podnety, dneska odzkousim a uvidim, co z toho vyleze

llsm
Člen | 121
+
0
-

tak update a poznatky z me strany:

1) makro capture se zda byt zajimavym resenim, ale jen do chvile nez chcete chytit stranku celou, protoze neni kam promenou vypsat, resp. jak ji treba predat jako parametr. Duha finta zmineneho makra je v tom, ze co vypise jako kod uz nevykresli v puvodni podobe.

2) dale jsem narazil na to, ze jsem vse nejdrive zkousel na jednoduchem dokumentu, ale pri implementaci do projektu s prihlasovanim nelze ziskat html stranku pomoci file_get_contents, protoze server ze ktereho clovek pristupuje samozrejme neni autorizovanym uzivatelem…

Opravdu nema nekdo nejake dalsi napady? Samozrejme na tom budu jeste pracovat, ale postouchnuti nekam kam by clovek normalne nezavital se vzdy hodi, i kdyz z toho nic nevzejde. I tim dekuji vam, kteri jste odpovedeli… ; )

Filip Procházka
Moderator | 4668
+
0
-

Já bych rád věděl proč to potřebuješ

Jinak, jedno řešení je třeba:

protected function beforeRender()
{
	ob_start();
}


protected function afterRender()
{
	$html = ob_get_clean();
}
vifo
Člen | 4
+
0
-

Další možnost:

Někde (třeba v Presenter::startup nebo jen v akci, kde to potřebuješ) si můžeš přidat událost na onShutdown

<?php
$this->onShutdown[] = callback($this, 'templateToStr');
?>

a nachystat si metodu

<?php
    public function templateToStr() {
        $template = clone $this->template;
        $s = (string)$template; // tady je obsah aktuální stránky
    }
?>

Ale šablona se renderuje 2×, takže to asi není ideální. A taky by mě zajímalo, k čemu se to může hodit.

smasty
Člen | 90
+
0
-

Pokiaľ ti ide naozaj len o zobrazenie zdrojového kódu stránky, netreba do toho vôbec ťahať serverové technológie, zvládne to aj JavaScript – http://css-tricks.com/…urce-button/.

llsm
Člen | 121
+
0
-

Zdravim vsechny, byl jsem ted chvili mimo internet, ale uz jsem zpet…

HosipLan napsal(a):

Já bych rád věděl proč to potřebuješ

Aktualne si hraju s doplnkem PDFResponse a ten prijima pro vygenerovani pdf celou html stranku. Chci se pokusit napsat neco trochu univerzalnejsiho pro moji aplikaci, abych byl schopny si ukladat v pdf aktualne zobrazenou stranku. Diky za vas kod a nápady…

Filip Procházka
Moderator | 4668
+
0
-

To je ale otresne. Pokud si bude uživatel chtít vytisknout současnou stránku, tak klikne na tisk. Pokud bude chtít exportovat do PDF, není pěkné řešení ohýbat životní cyklus presenteru. Lépe takto:

public function actionExportPdf()
{
	$template = $this->createTemplate()->setFile(__DIR__ . '/moje-sablona.latte');
	$template->data = $data;
	$this->sendResponse(new PdfResponse((string)$template));
}

Nezkoumal jsem jak funguje PdfResponse, ale předpokládám, že takto nějak.

llsm
Člen | 121
+
0
-

HosipLan napsal(a):

To je ale otresne. Pokud si bude uživatel chtít vytisknout současnou stránku, tak klikne na tisk. Pokud bude chtít exportovat do PDF, není pěkné řešení ohýbat životní cyklus presenteru.

Co ti na myslence samotne prijde otresne? Pokud chce tisknout, tak jasne, ze si to vytiskne. Proto se na stranku i davaji tlacitka Tisk…
A kdyz to chce do PDF – co se tyce toho co se da najit na foru a v informacich k doplnku – je finta v tom, ze vzdy ta sablona, kterou pouzivaji, ma v sobe kompletni html. Tzn. neumi sama zahrnout @layout → tedy nemohu pouzit stejny template a musel bych kazde strance delat novy.
Upozornuji tedy, ze vse ted bezi na Nette 0.9.7. Na Nette 2 pro PHP 5.3 zatim prevod neni mozny kvuli ostatnim (cizim) projektum na serveru (tedy neni mozne prehodit server na php 5.3). A prevadet na Nette 2 bez namespaces mi aktualne prijde zbytecne.
Zpet ale k problemu, obecne mi prislo lepsi mit nejake univerzalni reseni lehce roubovatelne na jakoukoliv stranku i v jinem projektu. A samozrejme bych rad nasel cestu, kdy by to cele bylo co nejcistsi…

Editoval llsm (30. 8. 2011 16:23)

llsm
Člen | 121
+
0
-

Nakonec jsem vyresil ajaxem:

<script>
	$("a.pdfRequest").live("click", function (event) {
		event.preventDefault();
		var url = this.href;
		var html = '<html>\n' + $("html").html() + '\n</html>';
		$.post(url, {html: html}, function(data){
			window.open(url + '&sess=' + data);
		});
		return false;
	});
</script>

Bez ajaxu to pak nebezi. V tomto pripade nejdriv poslu data POSTem na server, tam html zpracuji a ulozim do session, ze ktere se nactou pri otvirani noveho okna. V me aplikaci to takto vyhovuje, protoze pdf nemuze zobrazit nikdo jiny pomoci odkazu a nemusim resit bezpecnost…