Kompletní vytvoření komponenty
- S_I_M_O_N
- Člen | 23
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
takhle vypadá kód oukej, opravdu si na stránce jehož routa směřuje na NejakyPresenter ?
- Ondřej Kubíček
- Člen | 494
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
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
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 2x?
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
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 2x?
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.
- klíčové bylo udělat si šablonu, která mi vygeneruje HTML pro knihovnu mpdf
- to HTML vygenerovat pomocí renderToString(…) a vložit to do $mpdf->WriteHTML($html);
- 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.