CompilerExtension a createComponent
- libik
- Člen | 100
Ahoj,
zkousim extensions zaregistrovat pres tridu class ProjectsExtension extends
\Nette\DI\CompilerExtension.
Extension obsahuje nejake sluzby, to je v pohode, ale taky komponentu.
Lze komponentu nejak vytvorit jinak aniz bych musel sahnout do prezenteru a
tam ji vytvaret metodou createComponentProjects() ?
Potrebuju aby byla dostupna v latte pres {control projects}.
Diky :)
- CZechBoY
- Člen | 3608
Teoreticky vzato můžeš přidat jakýkoliv php kod do afterCompile. k tomu
viz třeba kdyby/events rozšíření https://github.com/…xtension.php#L173
Takže si můžeš zaregistrovat callback na
Application::onPresenter($application, $presenter)
, tam si vzít
presenter z parametru, vytvořit komponentu a zavolat
$presenter->addComponent('projects', $instanceKomponenty);
Tohle celý bych samozřejmě vyčlenil do nějaký třídy, tu zaregistroval do
DI a v initialize
pouze zavolal danou metodu.
Editoval CZechBoY (26. 9. 2018 17:09)
- David Matějka
- Moderator | 6445
zhruba takhle:
ale spise bych to nedoporucoval, zneprehledni to kod a prijdes napriklad o lazy inicializaci komponent
- libik
- Člen | 100
Staci mi to i pro jeden. V textu stranky vyparsuju zapis pro nacteni komponenty, ktera se mi v tom miste na webu pak vyrenderuje. Ted musim tu komponentu v mem ContentPresenteru vytvorit, ale pokud bych pridaval dalsi extension, zase bych tam musel uvest novou metodu a tomu se chci vyhnout.
- David Matějka
- Moderator | 6445
problem bude asi v opakovanem registrovani presenteru. Bud muzes zkusit pred znovu registrovanim presenteru overit, zda uz neni registrovat pres https://api.nette.org/…Builder.html#… nebo jej vubec neregistrovat a spolehat na to, ze jej registruje nette samo. pak ale budes muset presunout to navazani na addSetup do beforeCompile – tam si vytahnes definici presenteru zas pres getByType a zavolas na tom addSetup