Kompletní vytvoření komponenty

S_I_M_O_N
Člen | 23
+
0
-

Dobrý den,
už několik hodin se extrémně trápím s tvorbou vlastní komponenty.

Úplně tomu nerozumím a nejsem si jistý, nebo se spíše domnívám, že to v dokumentaci (https://doc.nette.org/…n/components) není vůbec kompletní, a proto mi to nefunguje. Postupoval jsem přesně podle návodu, ale pořád mi to hlásí:

Component with name 'pdf' does not exist. Ale přitom jí mám…

K tvorbě PDF používám mpdf.php, myslím však, že to s mým problémem nesouvisí.

Mám komponentu v adresáři „app/components“:

declare(strict_types=1);

namespace App\Components;

use Nette\Application\UI\Control;
use Tracy\Debugger;

class PdfControl extends Control {

	public function render(): void {

		// nějaký kód ...


		// a tohle mám nakonci - má to vyrendrovat PDFko pomocí mpdf.php
		$this->template->render(__DIR__ . '/../Presenters/templates/PRESENTER/SABLONA_V_LATTE.latte'
	}

}

Mám v presenteru NejakyPresenter tvorbu komponenty:

declare(strict_types=1);

namespace App\Presenters;

use App\Components\PdfControl;


final class NejakyPresenter extends BasePresenter {

	protected function createComponentPdf(): PdfControl
		$pdf = new PdfControl;
		return $pdf;
	}
}

A nakonec mám tu šablonu např. SABLONA_V_LATTE.latte (nic víc tam nemám)

{control pdf}

Podrobněji mi to dává:
/* line 1 */ $_tmp = $this->global->uiControl->getComponent("pdf");

Nepostrádám někde něco?

Děkuji za každou pomoc

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

takhle vypadá kód oukej, opravdu si na stránce jehož routa směřuje na NejakyPresenter ?

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

ještě co se dívám, ten {control pdf} nedáváš do šablony, kterou máš v tom Controleru tedy SABLONA_V_LATTE.latte, ale do šablony pro ten presenter

S_I_M_O_N
Člen | 23
+
0
-

Ondřej Kubíček napsal(a):

takhle vypadá kód oukej, opravdu si na stránce jehož routa směřuje na NejakyPresenter ?

Určitě jsem, mám to tak i v URL. /NEJAKY_PRESENTER/SABLONA_V_LATTE.

Kdybych nebyl, tak by mi to nepsalo v CALL STACKu „templates-Nejaky(Presenter)-nejake.latte–fd3042cf79.php:14 App\Components\PdfControl->render()“

S_I_M_O_N
Člen | 23
+
0
-

Ondřej Kubíček napsal(a):

ještě co se dívám, ten {control pdf} nedáváš do šablony, kterou máš v tom Controleru tedy SABLONA_V_LATTE.latte, ale do šablony pro ten presenter

Nevím jestli rozumím, ale:
{control pdf} mám v příslušné šabloně, kterou volám v Controleru tj. řádek:

$this->template->render(__DIR__ . '/../Presenters/templates/PRESENTER/SABLONA_V_LATTE.latte'

Asi mi to už trochu dochází.

Já mám odkaz:

<a n:href="Nejaky:NEJAKE_LATTE" target="_blank">MUJ ODKAZ</a>

který mě vezme na to NEJAKE_LATTE (to vyhodí výše zmíněnou chybu), které generuje to PDF, takže vlastně, jestli to chápu dobře, tak k tomu přistupuji 2×?

Tj. jednou z presenteru to renderuji, ale on neví, která komponenta to je a podruhé z volání té komponenty (ten $this->template->render(…) …)

S_I_M_O_N
Člen | 23
+
0
-

S_I_M_ON napsal(a):

Ondřej Kubíček napsal(a):

ještě co se dívám, ten {control pdf} nedáváš do šablony, kterou máš v tom Controleru tedy SABLONA_V_LATTE.latte, ale do šablony pro ten presenter

Nevím jestli rozumím, ale:
{control pdf} mám v příslušné šabloně, kterou volám v Controleru tj. řádek:

$this->template->render(__DIR__ . '/../Presenters/templates/PRESENTER/SABLONA_V_LATTE.latte'

Asi mi to už trochu dochází.

Já mám odkaz:

<a n:href="Nejaky:NEJAKE_LATTE" target="_blank">MUJ ODKAZ</a>

který mě vezme na to NEJAKE_LATTE (to vyhodí výše zmíněnou chybu), které generuje to PDF, takže vlastně, jestli to chápu dobře, tak k tomu přistupuji 2×?

Tj. jednou z presenteru to renderuji, ale on neví, která komponenta to je a podruhé z volání té komponenty (ten $this->template->render(…) …)

Bylo to opravdu jak jsem říkal. A taky jsem to dělal asi úplně špatně.

Povedlo se mi PDF vygenerovat přímo v presenteru.

  1. klíčové bylo udělat si šablonu, která mi vygeneruje HTML pro knihovnu mpdf
  2. to HTML vygenerovat pomocí renderToString(…) a vložit to do $mpdf->WriteHTML($html);
  3. poté zavolat Output a říct $this->redirect(‚this‘);

Komponenta asi není na tento případ nejvodnější nástroj, protože slouží pro renderování HTML a ne PDF (jestli jsem dobře pochopil).

Jestli někoho napadá, kam je ideální dát generování PDFek (model, presenter, komponenta, úplně nezávisle, …), tak budu rád za radu.