[addon pdfresponse] PdfResponse

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

!!!!!! Diky moc :)
Pak bylo potreba jeste prohodit par veci stare nette → nove – ale to ladenka moc hezky rekne co a kde konkretne, takze to jde :)

jeste jednou dekuju

vcernik
Člen | 30
+
0
-

Mohl by mi prosím někdo poradit jak mám ty soubory dostat z toho SVN? :) Díky :)

Honza Kuchař
Backer | 1661
+
0
-

Stáhni si TortoiseSVN a potom:

  • vytvoř nějakou složku u sebe na PC
  • na ni klikni pravým tlačítkem a dej Checkout (případně TortoiseSVN->checkout)
  • zadej adresu SVN repozitáře, kterou najdeš na stránce s dokumentací doplňku
  • OK
  • čekej
  • Máš to stažené
  • OK = zavřít
Honza Kuchař
Backer | 1661
+
0
-

Poprosím někoho, kdo to má zprovozněné pod Nette 2.0, ať mi na mail pošle ZIP. Přidám odkaz do dokumentace. (zatím ještě pořád vyvíjím pod Nette 0.9.x)

pidiclovek
Člen | 91
+
0
-

Hola, v první řadě díky za skvělý addon! @Honza Kuchař: K přechodu opravdu stačí jen hodit addon do namespacu, předělat pdfResponse class dle příspěvku #100 a cca na řádku 379 změnit
String::webalize na Strings::webalize :)

Mám však problém se stylováním výstupu, respektive výsledné pdf ignoruje :( zkusil jsem jak využít přímo proměnné styles v pdfResponse tak narvat např toto přímo do šablony.

<style>
    #aboutMe {
        text-align: justify;
        width: 500px;
    }
</style>

V čem je ten trik prosíím? :)

Editoval pidiclovek (1. 9. 2011 22:33)

Honza Kuchař
Backer | 1661
+
0
-

A proháníš ten kód ještě nějakým editorem? (WYSIWYG) On totiž ten tag <style> ostraňuje. (nevím přesně proč) Mě tedy stylování funguje.

Jak oblbnout WYSIWYG máš v příkladu v distribuce, DEMO je zde.

pidiclovek
Člen | 91
+
0
-

@Honza Kuchař právě že neproháním, jediné co dělám je že v presenteru přidám pdfResponse šablonu, nastavím marginy, narvu do šablony proměnné a nechám vyrenderovat pdfko z této šablony. Demo jsem pročítal. Je ale možné, že je to přechodem na nové Nette a tím jak jsem si překopával pdfResponse na namespacy..

Honza Kuchař
Backer | 1661
+
0
-

To je zvlastni chyba, zkusil bych krokovat.

Honza Kuchař
Backer | 1661
+
0
-
  • updatovan mPDF na verzi 5.3 (v verzí PHP to nijak nesouvisí)
mr.mac
Člen | 87
+
0
-

Honza Kuchař napsal(a):

  • updatovan mPDF na verzi 5.3

Je to funkční na Nette 2.0 a PHP 5.3? EDIT: není.

Zkouším to rozchodit – stáhnul jsem si mPDF z domácí stránky a bezvýznamně (dtto u poslední distribuce) – poslední zjištěná chyba (po všech úpravách zde doporučených pro Nette 2) je tato:

Nette\InvalidArgumentException

Invalid argument passed to foreach resp. Nette\Iterators\CachingIterator; array or Traversable expected, NULL given.

EDIT2:Ahoj světě funguje. Když podstrčím template (latte) tak to vyhodí tuto chybu. V template nemám žádné <style>.

Editoval mr.mac (31. 10. 2011 22:05)

Honza Kuchař
Backer | 1661
+
0
-

To co ti to vyhazuje není chyba doplňku, ale chyba v té šabloně, kterou jsi tomu dal. Nejspíš jsi předal špatnou hodnotu do foreache.

mr.mac
Člen | 87
+
0
-

Honza Kuchař napsal(a):

Šablona vypisuje data z databáze ve formě obyčejné tabulky v rámci oblasti <context>, jsou tam tedy i <a href> odkazy, to by snad ale nemělo vadit ne? Padá to i na obyčejné stránce s textem (ul, li, div tagy). Není tam <html> tag ani hlavička. Pokud to ale správně zobrazilo z presenteru <p>Hello world</p>, tak fakt nevím čím by to mělo být – lze to nějak slušně odkrokovat? Z laděnky toho asi moc nepřečtu kde to padá?

Honza Kuchař
Backer | 1661
+
0
-

Ale přečteš. Laděnka Ti řekne vše. Na novém Nette ti tuším (používám pořád Nette 0.9) řekne dokonce i na kterém řádku v nezkompilované šabloně to padlo. Každopádně, to že ti neprojde šablona, za to PdfResponse nemůže.

PS: Šablony jdou krokovat naprosto parádně. Tedy stačí spustit XDebug či http://www.nusphere.com/…ts/phped.htm

mr.mac
Člen | 87
+
0
-

Honza Kuchař napsal(a):

Ale přečteš. Laděnka Ti řekne vše.

Přiznávám, pracuji s nette asi teprve 3 tydny, učím se za pochodu. Kouknu se na to ještě – teď jsem na to neměl čas.
Každopádně diky za rady. Pokud to moc nebude mít progres, ozvu se.

Honza Kuchař
Backer | 1661
+
0
-

Jasný. :-)

mr.mac
Člen | 87
+
0
-

Tak to funguje – pokud je zájem pro tápající jako jsem byl já, tak jsem na doporučení HosipLana shrnul stručně postup v novém vlákně ZDE.

Editoval mr.mac (8. 11. 2011 15:43)

Filip Procházka
Moderator | 4668
+
0
-

To je pěkné, ale jako samostatné vlákno by to určitě bylo lepší :)

Honza Kuchař
Backer | 1661
+
0
-

Nová revize (32): update: mPDF 5.3 → mPDF 5.4

Tomáš Votruba
Moderator | 1110
+
0
-

Pokud by se to někomu hodilo (= dělalo velké potíže vlastní rozjetí), podařilo se mi to zprovoznit na Nette 2.0, bez js, který nepoužívám.

Editoval Schmutzka (14. 4. 2012 2:54)

Tomáš Votruba
Moderator | 1110
+
0
-

Kdyby někdo hledal, jak udělat další stránku, tak: <pagebreak>

EDIT: Aha :)

Editoval Schmutzka (18. 4. 2012 10:50)

thorn
Člen | 14
+
0
-

Mel bych dotaz, potreboval bych k vyrenderovanemu PDF popridavat cisla stranek, popr. i nastavit od ktere stranky se ma cislovat. Jak v nette neco takoveho nastavit? Divam se na manual k mPDF a tam se cisla stranek zrejme ukladaji do {PAGENO} a to se pak tiskne v sablone, ale s timto se logicky nema rado latte. Podarilo se nekomu nejak zobrazit cisla stranek? Popripade jak?

EDIT: v souboru mpdf.php jsem veskere vyskyty {PAGENO}, {DATE ..}, {nbpg} nahradil [PAGENO],[nbpg],[date .. ], v latte sablone uz jen v parovem tagu <htmlpageheader .. > nebo <htmlpagefooter .. > zavolat napriklad [PAGENO]/[nbpg] a jede to, nezapomenout dat jeste vyvolavaci neparovy tag <sethtmlpageheader .. />, <sethtmlpagefooter .. />

Editoval thorn (19. 4. 2012 18:01)

ricco24
Člen | 141
+
0
-

Pokúšam sa do pdf natlačiť číslovanie stránok 1/8 2/8 … 8/8 vložil som tam {PAGENO}/{nbpg} no vypisuje mi to na sledovne 1/7 2/6 … 8/0 čo je blbosť. Viem že to nesúvisí s týmto pluginom ale s mPDF priamo no možno s tým máte už niekto skúsenosti. Vďaka.

//EDIT:
Už som na to prišiel keď som sa pozrel do kódu mPDF. Ak by to niekto potreboval do budúcna:
Celkový počet stránok sa zobrazuje makrom {nb}
{nbpg} zobrazuje počet stránok v skupine …

Editoval ricco24 (19. 5. 2012 17:17)

Honza Kuchař
Backer | 1661
+
0
-

Tedy vyřešeno. Díky Ti za řešení, určitě se to bude někomu hodit.

A opravdu to s pluginem nesouvisí… Toto si řeší mPDF.

Endrju
Člen | 147
+
0
-

Ahoj předem děkuji Honzovi za pěknou komponentu, kterou jsem použil ještě pro PHP5.2 a parádně fungovala. Potřebuji ji ale použít v Nette 0.9.7 pro PHP5.3 a narážím na problém, se kterým si nevím rady.

http://ukaz.at/2j2

Soubor PdfResponse.php jsem upravil viz. citace a žádné další změny jsem tuším nedělal.

Kryšpin napsal(a):

Kdo bude zprovozňovat tento doplněk pod PHP 5.3 a Nette 2.0 dev, tak jen přidat do

PDFResponse.php

<?php
use Nette\Object,
    Nette\Callback,
    Nette\Environment,
    Nette\String;

class PdfResponse extends Object implements Nette\Application\IPresenterResponse {
....
}
?>

V presenteru mám pro tisk akci „actionPrint“ podobně jako má Honza na stránce s addonem https://addons.nette.org/cs/pdfresponse (také předávám šablonu/template).

function actionPdf() {
    $template = $this->createTemplate()->setFile(APP_DIR."/templates/pdf.phtml");

	$template->promenna_a = "A";
	$template->promenna_b = "B";

    $pdf = new PDFResponse($template);

    // Všechny tyto konfigurace jsou nepovinné:

	...

    // Zde končí nepovinná konfigurace

    // Ukončíme presenter -> předáme řízení PDFresponse
    $this->terminate($pdf);
}

Pokud předám HTML kód ve Stringu, tak se PDF vygeneruje. Chci ale předávat tempale.

  • Setkali jste se někdo s podobnou chybou?
  • Máte nějaké nápady jak by se to dalo opravit?

Děkuji.

Editoval Endrju (30. 5. 2012 11:24)

LeonardoCA
Člen | 296
+
0
-

Problém je pravděpodobně v podmínce o pár řádků výše (co není vidět ve výpisu z laděnky) díky které se to dostane na Exception. Stačí upravit podmínku. Asi to není verze addonu pro tuto verzi Nette.

Editoval LeonardoCA (30. 5. 2012 12:38)

Endrju
Člen | 147
+
0
-

Pokud tedy víš jak metodu getSource() upravit, napíšeš jak? Stáhnul jsem si z SVN poslední verzi pluginu. Ovšem pro kterou verzi Nette je to netuším.. TO by musel poradit asi přímo Honza.

Kód oné fce je:

	/**
	 * Getts source document html
	 * @return string
	 * @throws InvalidStateException
	 */
	public function getSource() {
		$source = $this->getRawSource();

		// String given
		if(is_string($source)) {
			return $source;
		};

		// Nette template given
		if ($source instanceof ITemplate) {
			$source->pdfResponse = $this;
			$source->mPDF = $this->getMPDF();
			return $source->__toString();

		};

		// Other case - not supported
		throw new InvalidStateException("Source is not supported! (type: ".
			(is_object($source) ? ("object of class " . get_class($source)) : gettype($source)).
		")");
	}
LeonardoCA
Člen | 296
+
0
-

Laděnka říká, že předáváš Nette\Templates\Template a podmínka očekává

if ($source instanceof ITemplate) {

zkus takto

// Nette template given
if ($source instanceof Nette\Templates\Template) {
Endrju
Člen | 147
+
0
-

Výborné, díky. Možná mě mohlo napadnout to zkusit :).

Je ale zvláštní, že to nebere tak jak to je. Template rozšiřuje IFileTemlate a IFileTemplate rozšiřuje ITemplate, takže by se k tomu mělo být jak dostat ne? Nebo jsem na zcestí :)?

Edit:
Neadlo mi to a ještě jsem to zkusil s tím ITemplate, protože jsem si říkal, že to musí jít, když Tempale to rozhraní rozšiřuje. Upravil jsem to takto:

// Nette template given
if ($source instanceof Nette\Templates\ITemplate) {

Přesto ale nechápu, proč to nevezme pouhé ITempale? Na začátku souboru totiž mám:

use Nette\Object,
	Nette\Application\IPresenterResponse,
	Nette\Callback,
 	Nette\Environment,
	Nette\String,
	Nette\Templates;

A všechny tři Template, IFileTemplate a ITemplate mají jako namespace uveden Nette\Templates, takže, proč musím v kódu uvést i tak celou cestu?

Editoval Endrju (30. 5. 2012 16:30)

LeonardoCA
Člen | 296
+
0
-

v případě Iněco by v podmínce spíš asi mělo být „implements“ místo „instanceof“

DOBss
Člen | 24
+
0
-

mal by som otázku: ako by sa dalo PDF vyrenderovať na backende, následne uložiť na FTP a presmerovať na iný presenter, bez nutnosti volania terminate, či sendResponse?

LeonardoCA napsal(a):

v případě Iněco by v podmínce spíš asi mělo být „implements“ místo „instanceof“

implements ti hodí fatal…

Editoval DOBss (5. 11. 2012 22:55)

romiix.org
Člen | 343
+
0
-

DOBss napsal(a):

mal by som otázku: ako by sa dalo PDF vyrenderovať na backende, následne uložiť na FTP a presmerovať na iný presenter, bez nutnosti volania terminate, či sendResponse?

Použi iba čisto samotnú knižnicu mPDF bez PdfResponse.

$mpdf->Output('filename.pdf','D');
Honza Kuchař
Backer | 1661
+
0
-

PdfResponse ma moznost zikat primo API mPDF, tedy to, co psal kolega o prispevek vyse je samoyrejme mozne. Vsak ukaladani do souboru je hodne cata vec, kterou budu take potrebovat, tedz pridat to tam. (rekneme do tydne)

Take zkontroluji, jaka je uvedena verze Nette v dokumentaci, ale predesilam, momentalne VSECHNY moje doplnky jsou kompatibilni s nejnovejsi verzi Nette 0.9!

//EDIT: Do dokumentace pridana kompatibilita s Nette.

DOBss
Člen | 24
+
0
-

#131 Ďakujem – fungovať to fungovalo (s 2. parametrom 'F'), len nemal žiaden obsah v tom prípade… ale ako čítam staršie príspevky, tak toto sa tu už riešilo…

#132 Ja som ho skúšal na v2.0.6, PHP 5.3.2–1ubuntu4.18 a po úpravách spomínaných okolo komentára #100 mi fungoval bez problémov… nakoniec som si však vystačil so samotnou knižnicou

Prikladám ešte ukážku, ako s použitím knižnice mPDF uložiť PDF na FTP a násdledne ho odoslať na mail v prílohe… nič extra, ale ako začiatočník som si podobné ukážky nevedel vynachváliť ;]

// Render the tamplate
$template = $this->createTemplate();
$template->setFile('app/mails/pdf.latte');
$template->data = $this->data;
$template = $template->__toString();

// Load library
require('libs/Nette.Addons/PdfResponse/mpdf/mpdf.php');

// Create and save the PDF
$mpdf = new mPDF('utf-8', 'A4', '', '', '0', '0', '0', '0', '0', '0', 'L');
$mpdf->WriteHTML($template, 0);
$mpdf->Output("./pdf/{$this->data['id']}.pdf",'F');

// Send the mail to admin with the PDF
$template = new FileTemplate('app/mails/adminMail.phtml'); //
$template->registerFilter(new Engine);
$template->data = (array) $this->data;

$mail = new Message;
$mail->setFrom('sender@mail.sk', 'OdSantu.sk')
     ->addTo('recipient@iny_mail.sk')
     ->setSubject('Nadpis správy')
     ->setHtmlBody($template);
$mail->addAttachment("pdf/{$this->data['id']}.pdf");
$mail->send();

Editoval DOBss (8. 11. 2012 21:27)

Honza Kuchař
Backer | 1661
+
0
-

Oznamuji, že doplněk je nově dostupný na githubu. SVN repozitář je zatím pořád funkční, vyvíjet se však bude v GITu.

Těším se na pull requesty, forky a všechny další vymoženosti, které GIT přináší.

Používáte-li svn:externals, tento článek je určený pro vás.

(V případě, že bych dělal něco proti GIT-best-practices, prosím upozorněte mě na to, jsem GIT-zelenáč)

castamir
Člen | 629
+
0
-

PpfResponse už má na GitHubu několik mutací…
např. od Tomáše Votruby, nějakého jasira anebo od mé maličkosti.

Honza Kuchař
Backer | 1661
+
0
-

Můžu svoji (vlastně původní) větev nějak začlenit, jako fork? Ať se to drží pěkně pohromadě?

castamir
Člen | 629
+
0
-

Nejsem žádnej expert na git, ale jelikož to od tebe nemá nikdo na gitu forknuté, bude nejsnažší si vybrat nějakou kopii a nahradit obsah repozitáře ručně. Případně si kód upravit podle sebe a třeba se pouze inspirovat (to ale bude trošku pracnější).

castamir
Člen | 629
+
0
-

Chtělo by to se nějak rozhoupat a trošku aktualizovat stránku addonu. To, že je PdfResponse v přehledu doplňků zašedlý spolu s neaktuálním originálním repozitářem moc neprospívá. Doporučuju merge s nějakou novou větví (forkem) nebo alespoň přidat třeba odkazy na nové forky.

Ať ta šedina zmizí ;)

duskohu
Člen | 774
+
0
-

@castamir https://github.com/…/PdfResponse Nesedi ti dokumentacia, napr.

$pdf->setSaveMode(\PdfResponse::DOWNLOAD);

vsak to vobec nemas v kode. A ako pozeram, tak tam skoro vobec nic nesedi.

Editoval duskohu (11. 4. 2013 15:15)

castamir
Člen | 629
+
0
-

@duskohu: zapomenutej push. Shame on me! Díky za upozornění!

Editoval castamir (11. 4. 2013 15:21)

duskohu
Člen | 774
+
0
-

@castamir :-D vsak som pozeral ze nieco nie je podla kostolneho poriadku :-DD. Tak teraz si mozem dat update? Je to uz ok?

castamir
Člen | 629
+
0
-

@duskohu: mělo by to být ok. Kdyby něco, tak prosím napiš.

piskotek
Člen | 30
+
0
-

ahoj, snažím se použít generátor od Castamira, ale laděnce se to moc nelíbí:
Fatal Error
Class „mPDF“ not found
řádek 387 je označen červeně

382:        public function createMPDF()
383:        {
384:            $margins = $this->getMargins();
385:
386:            //  [ float $margin_header , float $margin_footer [, string $orientation ]]]]]])
387:            $mpdf = new mPDF('utf-8', // string $codepage
388:                $this->pageFormat, // mixed $format
389:                '', // float $default_font_size
390:                '', // string $default_font
391:                $margins["left"], // float $margin_left

poradíte mi někdo co s tím?

castamir
Člen | 629
+
0
-

Máš to nainstalované přes composer nebo jak? V případě instalace přes composer se automaticky stáhne i knihovna mPDF. Do bootstrap pak stačí vložit include autoloaderu, který composer vygeneruje. Pokud to instaluješ jinak, měl bys stáhnout knihovnu mPDF ručně a do PdfResponse dát include mpdf.php, ale tohle nedoporučuju – je to zdlouhavé. Poslední možnost je nechat robotloader, ať to načte za tebe, ale zde tě varuju, že knihovna mPDF je vážně dost velká, takže budeš potřebovat hodně paměti.

castamir
Člen | 629
+
0
-

Upřesnil jsem pokyny pro instalaci bez composeru. Je to sice zbytečně složité a jde tam nakupit spousta chyb, ale co už.

piskotek
Člen | 30
+
0
-

Tak jsem to stáhl přes composer, na localu mi to funguje a když to přehodím na server, tak celá aplikace zamrzne a hodí to:

chyba serveru
Chyba protokolu HTTP 500 (Internal Server Error)

do logu se nic nezapíše
a v temp/cache se vytvoří jen robotloader

nějaké nápady?

castamir
Člen | 629
+
0
-

Pokud bych měl hádat, tak se robotloader snaží načíst příliš mnoho dat a vyčerpá paměť. Ověř si, zda robotloader prochází jen to, co má (tj. neprochází např. libs/mPDF) a ověř také maximum povolené paměti (128MB je značka ideál).

Edit: každopádně se mrkni, co to přesně způsobilo. Zkus error.log nebo hledej u poskytovatele nějaké chybové hlášení. Bez něj to bude opravdu jen hádání…

Editoval castamir (13. 4. 2013 19:03)

piskotek
Člen | 30
+
0
-

Tak už jsem to vyřešil, mohl za to netterobots

díky za rady

Honza Kuchař
Backer | 1661
+
0
-

Doplněk je nyní kompatibilní s Nette 2.0 a využívá Composer. Díky Composeru je možné nainstalovat příklad jedním příkazem.

kbtm
Člen | 19
+
0
-

Přeji dobrý den,
dotaz spíš k používané knihovně mPDF a její funkci pod Nette …

Mám šablonu, kde includuji soubor s definicí header a footer :

...
{extends '../@pdf.layout.latte'}
...
{includeblock '../@pdf.header.latte'}
{includeblock '../@pdf.footer.latte'}
...

Knihovna mPDF umožňuje zobrazení čísla stránky (makro {PAGENO}) jen v rámci hlavičky nebo patičky. Nezkoušel/nevyřešil někdo postup, jak tento údaj zobrazit i v jiné oblasti – tj. kdekoliv na stránce ?
Zkoušel jsem makro {capture $var} … {/capture}, přenos proměnné ale z vloženého souboru neproběhne (i když je tato proměnná definována před makrem {includeblock} a v rámci includované čísti kodu je vše OK – po „výstupu“ do hlavního souboru má původní hodnoru).

S pozdravem kbtm