Kompletni Html vystup templatu
- llsm
- Člen | 121
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
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
llsm napsal(a):
mam dotaz, jestli existuje nejaka rozumna cesta, jak ziskat HTML aktualni stranky
- llsm
- Člen | 121
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
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
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
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
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
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
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
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…