Stáhnutí PDF a zobrazení hodnoty v šabloně pomocí Joseki / pdfResponse

Hubert
Člen | 8
+
0
-

Dobrý den,

v metodě, která mi vytvoří a stáhne PDF mám:

<?php
	public function actionPrint(){
 		$template = $this->createTemplate();
        $template->setFile('CESTA K SABLONE\pdf.latte');
        $template->value = 10;
        $pdf = new \Joseki\Application\Responses\PdfResponse($template);
        $pdf->setSaveMode(PdfResponse::DOWNLOAD);
        $this->sendResponse($pdf);
	}
?>

a v šabloně pdf.latte:

<?php
<h1>Nadpis</h1>
{$value}
?>

Dostávám chybu „Undefined variable: value“, přitom do value přiřazuji číslo 10 a pokud zakomentuji v šabloně {$value}, pak bych očekával, že se mi stáhne PDF ve kterém bude pouze text Nadpis, místo toho se mi stránka(šablona pdf.latte) zobrazí v prohlížeči.

Dokázal by mi prosím někdo poradit co s tím?

Nainstalováno pomocí composeru do nette 2.4.

Editoval Hubert (8. 12. 2018 8:34)

Alsatian
Člen | 164
+
0
-

Jsem začátečník, ale nemáš v šabloně navíc PHP?

<h1>Nadpis</h1>
{$value}
Hubert
Člen | 8
+
0
-

Alsatian napsal(a):

Jsem začátečník, ale nemáš v šabloně navíc PHP?

<h1>Nadpis</h1>
{$value}

Díky za reakci. Moc nerozumím co tím myslíš… v šabloně mám pouze to co jsem uvedl, nic víc tam není.

lightteka
Backer | 17
+
0
-

Hubert napsal(a):

Alsatian napsal(a):

Jsem začátečník, ale nemáš v šabloně navíc PHP?

<h1>Nadpis</h1>
{$value}

Díky za reakci. Moc nerozumím co tím myslíš… v šabloně mám pouze to co jsem uvedl, nic víc tam není.

Ze by tam zrejme nemely byt ty <?php znacky v tom pdf.latte souboru.

Ondřej Kubíček
Člen | 494
+
0
-

@Alsatian @lightteka ony tam nejsou, to je jen tady blbě vložené na foru

Alsatian
Člen | 164
+
0
-

Hele a normálně ti generování PDF funguje a nebo tvoříš první příklad?

Co kdybys na zkoušku umístil tvorbu PDF přímo do presenteru?
Dívám se, že u new máš uvedeno \Joseki\Application\Responses\PdfResponse a u setSaveMode uz jenom PdfResponse. Předpokládám ale, že jsi použil use \Joseki\Application\Responses\PdfResponse;

Třeba „PdfPresenter.php“

namespace App\Presenters;
use Nette;
use \Joseki\Application\Responses\PdfResponse;
public function renderPdfObjednavka($hash = NULL)
{
	$template = $this->createTemplate();
	$template->setFile(__DIR__ . "/templates/components/pdf-objednavka.latte");
	$template->value = 10;
	$pdf = new PdfResponse($template);
	$pdf->setSaveMode(PdfResponse::DOWNLOAD); // stažení
	$pdf->setSaveMode(PdfResponse::INLINE); // zobrazit jako stránku, lepší pro test
	$this->sendResponse($pdf);
}

K tomu mám vytvořenou routu, kde pomocí hash předám svůj parametr, třeba pro identifikaci faktury a podobně:

$router[] = new Route('pdf/<action>[/<hash>]', 'Pdf:');

Pro zobrazení nebo stažení souboru se stačí odkázat na mojedomena.cz/pdf/objednavka/3feb3ba4138bb7d6427ac359588255ee
kde hash „3fer3ba4138ab7d6427ac358588255ee“ mám uložený v DB ke konkrétní objednávce.

pdf-objednvka.latte

<html>
    <head>
        <link rel="stylesheet" media="all" href="{$basePath}/css/pdf.css" type="text/css" />
    </head>
    <body>

    {* Nastavení paty stránky pro mPDF: https://mpdf.github.io/headers-footers/method-4.html*}
    {* Použít htmlpagefooter a sethtmlpagefooter. *}
    {* Definice musí být v BODY. *}
    {* V patičce nezapomenout vypnout Latte makra => n:syntax="off" *}

    <htmlpagefooter name="Footer1">
        <table width="100%" n:syntax="off">
            <tr>
                <td width="50%">
                    <small>Vlastní text</small>
                </td>
                <td width="50%" align="right">
                    <small><em>Strana {PAGENO}/{nbpg}</em></small>
                </td>
            </tr>
        </table>
    </htmlpagefooter>
    <sethtmlpagefooter name="Footer1" value="on" />

	<h1>Nadpis</h1>
	{$value}<br>
	<br>

	<div align="right" n:if="$dodavatel->foto_razitko">
        <img src="{$basePath}/obrazky/mujobrazek.jpg" width="200">
    </div>

</body>
</html>

Editoval Alsatian (8. 12. 2018 20:33)

Hubert
Člen | 8
+
0
-

Alsatian napsal(a):

Hele a normálně ti generování PDF funguje a nebo tvoříš první příklad?

Co kdybys na zkoušku umístil tvorbu PDF přímo do presenteru?
Dívám se, že u new máš uvedeno \Joseki\Application\Responses\PdfResponse a u setSaveMode uz jenom PdfResponse. Předpokládám ale, že jsi použil use \Joseki\Application\Responses\PdfResponse;

Třeba „PdfPresenter.php“

namespace App\Presenters;
use Nette;
use \Joseki\Application\Responses\PdfResponse;
public function renderPdfObjednavka($hash = NULL)
{
	$template = $this->createTemplate();
	$template->setFile(__DIR__ . "/templates/components/pdf-objednavka.latte");
	$template->value = 10;
	$pdf = new PdfResponse($template);
	$pdf->setSaveMode(PdfResponse::DOWNLOAD); // stažení
	$pdf->setSaveMode(PdfResponse::INLINE); // zobrazit jako stránku, lepší pro test
	$this->sendResponse($pdf);
}

K tomu mám vytvořenou routu, kde pomocí hash předám svůj parametr, třeba pro identifikaci faktury a podobně:

$router[] = new Route('pdf/<action>[/<hash>]', 'Pdf:');

Pro zobrazení nebo stažení souboru se stačí odkázat na mojedomena.cz/pdf/objednavka/3feb3ba4138bb7d6427ac359588255ee
kde hash „3fer3ba4138ab7d6427ac358588255ee“ mám uložený v DB ke konkrétní objednávce.

pdf-objednvka.latte

<html>
    <head>
        <link rel="stylesheet" media="all" href="{$basePath}/css/pdf.css" type="text/css" />
    </head>
    <body>

    {* Nastavení paty stránky pro mPDF: https://mpdf.github.io/headers-footers/method-4.html*}
    {* Použít htmlpagefooter a sethtmlpagefooter. *}
    {* Definice musí být v BODY. *}
    {* V patičce nezapomenout vypnout Latte makra => n:syntax="off" *}

    <htmlpagefooter name="Footer1">
        <table width="100%" n:syntax="off">
            <tr>
                <td width="50%">
                    <small>Vlastní text</small>
                </td>
                <td width="50%" align="right">
                    <small><em>Strana {PAGENO}/{nbpg}</em></small>
                </td>
            </tr>
        </table>
    </htmlpagefooter>
    <sethtmlpagefooter name="Footer1" value="on" />

	<h1>Nadpis</h1>
	{$value}<br>
	<br>

	<div align="right" n:if="$dodavatel->foto_razitko">
        <img src="{$basePath}/obrazky/mujobrazek.jpg" width="200">
    </div>

</body>
</html>

Právě tvořím první příklad, jakou používáš verzi Nette? Zkoušel jsem tvůj příklad akorát bez předání parametru, to nepotřebuji a mám furt stejnou chybu, „Undefined variable: value“, konkrétně <?php echo LR\Filters::escapeHtmlText($value) /* line 20 */ ?><br>

Alsatian
Člen | 164
+
+1
-

@Hubert verzi Nette mam stejnou jako ty, 2.4. Napada me udelat novy projekt (pokud ve stavajicim mas neco dalsiho), zazipovat a hodit sem jako odkaz. Mrkneme se ti na to. Někde tam něco nehraje.

Hubert
Člen | 8
+
+1
-

Alsatian napsal(a):

@Hubert verzi Nette mam stejnou jako ty, 2.4. Napada me udelat novy projekt (pokud ve stavajicim mas neco dalsiho), zazipovat a hodit sem jako odkaz. Mrkneme se ti na to. Někde tam něco nehraje.

Udělal jsem tu věc, že jsem si stáhl nový projekt, nainstaloval pomocí composeru PdfResponse a šablonu nazval místo pdf.latte ⇒ print.latte a už funguje vše jak má :)

Každopádně díky za tvůj čas a tvé reakce!