[addon pdfresponse] PdfResponse
- Honza Kuchař
- Člen | 1662
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ř
- Člen | 1662
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
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ř
- Člen | 1662
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
@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..
- mr.mac
- Člen | 87
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ř
- Člen | 1662
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
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ř
- Člen | 1662
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
- Tomáš Votruba
- Moderator | 1114
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 | 1114
Kdyby někdo hledal, jak udělat další stránku, tak: <pagebreak>
EDIT: Aha :)
Editoval Schmutzka (18. 4. 2012 10:50)
- thorn
- Člen | 14
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
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ř
- Člen | 1662
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
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.
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://componette.org/search/?… (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
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
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
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
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
v případě Iněco by v podmínce spíš asi mělo být „implements“ místo „instanceof“
- DOBss
- Člen | 24
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
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ř
- Člen | 1662
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
#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ř
- Člen | 1662
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
PpfResponse už má na GitHubu několik mutací…
např. od Tomáše
Votruby, nějakého jasira anebo od mé maličkosti.
- Honza Kuchař
- Člen | 1662
Můžu svoji (vlastně původní) větev nějak začlenit, jako fork? Ať se to drží pěkně pohromadě?
- castamir
- Člen | 629
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 | 778
@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)
- piskotek
- Člen | 35
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
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
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)
- Honza Kuchař
- Člen | 1662
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 | 22
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