Komponenty s tovarnickami – postup na vytvoreni v bodech od A do Z (Nette 2.3.0 – aktualni)
- hotline
- Člen | 41
Pekny patecni vecer,
dlouho jsem se trapil s komponentami, protoze dokumentace vysvetluje uz
podrobnejsi souvislosti a pro zacatecnika tak muze byt velmi slozite vubec
nejakou vytvorit, sepsal jsem si pro sebe navod v bodech, co a jak udelat.
Kdyby na tom byl nekdo stejne, verim, ze mu to pomuze, tak to sem davam –
kdyby neco takoveho bylo, kdyz jsem se to snazil pochopit ja, byl bych happy.
Jestli uznate, ze je to nevhodne nebo je tam neco spatne, budu rad, kdyz mi to
napisete. :) Pripadne to klidne smazte (zalohu mam na vice mistech, nez zalohy
mych web. aplikaci), pokud to uznate za vhodne, ale myslim, ze kazdy pochopi, ze
jde o komunitni navod, ktery se snazi byt jasny, strucny, vystizny a vysvetluje
zcela zakladni principy, ktere neznate, kdyz s nette zacinate (vim, ze se vam
to zda jako trivialni zalezitost, ale ja tohle resil tyden a plno lidi mi
k tomu musela jeste pomahat a radit, timto jim jeste jednou dekuji ;)). Kdyz uz
se pak clovek dostane k tomuhle, pochopi i slozitejsi priklady
z dokumentace/planette/videotutorialu (kde je plno odlisnosti oproti soucasne
verzi)/fora, kde uz se spis vysvetluji veci, ktere by mely pod
komponentami bezet.
Navod vysvetluje princip vytvoreni komponenty, ktera prakticky nic nedela, jen vypisuje jednu statickou promennou.
1. v app/components si vytvorim libovolny Latte soubor (v tomto pripade
NazevKomponenty.latte), ktery bude komponentu vykreslovat
pozn. obaleni do snippetu neni povinne, ale hodi se pro ajaxovou funkcnost
(vice zde)
{snippet}
{$param} //nahodna promenna $param pro demonstraci
{/snippet}
2. v app/components si vytvorim libovolny php soubor, ktery bude jadrem komponenty
<?php
use Nette\Application\UI\Control;
class NazevKomponenty extends Control
{
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/NazevKomponenty.latte');
// vložíme do šablony nějaké parametry
$template->param = "neco"; //nahodna promenna $param pro demonstraci
// a vykreslíme ji
$template->render();
}
}
/** rozhraní pro generovanou továrničku */
interface INejakyNazevKomponenty // nutno zvolit jiny nazev, nez nazev tridy komponenty ("NazevKomponenty")
{
/** @return \NazevKomponenty */ //stejna hodnota, jako je nazev tridy komponenty
function create();
}
3. V souboru config.neon zaregistruji komponentu jako service:
services:
- INejakyNazevKomponenty //stejny nazev, jako byl zadan v interface v souboru komponenty
4. V presenteru (v tomto pripade v basepresenteru) si injectnu tzv. tovarnicku komponenty do promenne:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var \INejakyNazevKomponenty @inject */ //stejny nazev jako v services
public $promennaNejakyNazevKomponenty; //libovolny nazev promenne
protected function createComponentNejakyNazevKomponenty() //metoda musi zacinat na "createComponent" a nazev dale pokracuje libovolne; nazev bez "createComponent" je pak nazev control, ktery lze vykreslit v latte
{
$control = $this->promennaNejakyNazevKomponenty->create();
return $control;
}
protected function createTemplate($class = NULL)
{
$template = parent::createTemplate($class);
}
}
5. V latte souboru presenteru uz jen vypisu komponentu – nazev je podle zvoleneho nazvu metody „createComponent“ (vzdy ve tvaru {control a nazev uvedeny v metode createComponent}). Dulezite: prestoze v metode je nazev „NejakyNazevKomponenty“, nazev v latte musi zacinat malym pismenem, jinak to zkratka nebude fungovat
{control nejakyNazevKomponenty}
Editoval hotline (30. 5. 2015 20:27)
- Lukeluha
- Člen | 130
Myslím že pro začátečníky dostačující návod :) pár nepřesností:
- automaticky generovaná továrnička může být trochu těžká na
pochopení pro začátečníka. Navíc interface by měl být ve zvláštním
souboru a měla by se u něj dodržovat
konvence
INazevKomponentyFactory
- „V presenteru (v tomto pripade v basepresenteru) si injectnu
komponentu do promenne:“ V tomto případě si neinjectuješ komponentu,
ale továrničku pro vytvoření komponenty. Komponenta se vytváří pomocí
metody
createComponentNazevKomponenty
- pro ukázku templatu komponenty je myslím snippet zbytečný (akorát by mohl mást :))
Editoval Lukeluha (29. 5. 2015 21:56)