Komponenty – vykreslení s různými šablonamy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bluray
Člen | 178
+
0
-

Dobrý den, chci se zeptat, jestli je možné měnit šablonu komponenty. Například budu mít třeba ArticleControl který bude vracet články, jednou budu chtít třeba jenom seznam nadpisů článků, potom třeba články v tabulce…
Mám na to udělat více komponent například ArticleListControl nebo ArticleTableControl nebo to může být v jedné?
mám metodu

public function render(){
  $this->template->setFile();
}

Tak jak bych měnil tu šablonu?

Potom se chci zeptat co to vlastně komponenta je. může obsahovat i nějakou logiku? například nějaký model?
Mám třeba takovouhle strukturu:
app/NejakyModul/controls/Article a tam soubory ArticleControl.php a article.latte
Je komponenta jenom nějaká obsluha formuláře nebo může být ve složce controls/Article i třeba model který by ukládal do db? Já si představuji komponenty jako samostatně funkční miniaplikace…
Děkuji za rady :)

Pavel Macháň
Člen | 282
+
0
-

bluray napsal(a):

Dobrý den, chci se zeptat, jestli je možné měnit šablonu komponenty. Například budu mít třeba ArticleControl který bude vracet články, jednou budu chtít třeba jenom seznam nadpisů článků, potom třeba články v tabulce…
Mám na to udělat více komponent například ArticleListControl nebo ArticleTableControl nebo to může být v jedné?
mám metodu

public function render(){
  $this->template->setFile();
}

Tak jak bych měnil tu šablonu?

Potom se chci zeptat co to vlastně komponenta je. může obsahovat i nějakou logiku? například nějaký model?
Mám třeba takovouhle strukturu:
app/NejakyModul/controls/Article a tam soubory ArticleControl.php a article.latte
Je komponenta jenom nějaká obsluha formuláře nebo může být ve složce controls/Article i třeba model který by ukládal do db? Já si představuji komponenty jako samostatně funkční miniaplikace…
Děkuji za rady :)

Prostě uděláš víc render metod

public function render(){
	$this->template->setFile('default.latte');
}
public function renderOne(){
	$this->template->setFile('one.latte');
}
public function renderTwo(){
	$this->template->setFile('two.latte');
}
// latte
{control myComponent}
{control myComponent:one}
{control myComponent:two}

Editoval Pavel Macháň (8. 7. 2014 21:55)

bluray
Člen | 178
+
0
-

Díky to jsem potřeboval vědět. a jak je to s tím modelem v komponentách?

Jiří Nápravník
Člen | 710
+
0
-

Komponenta může být (a i často je) jak píšeš funkční miniaplikace. Ale nějaká logika, jak píšeš z modelu, by měla být v modelu. Konkrétní příklad, co mě napadá – guestbook. Budeš tam chtít mít například formulář pro přidání, hlasování. Když přidáš nějaký komentář, tak formulář v komponentě sice zpracuješ, ale samotné přidání obstará model. To samé hlasování, v té komponentě budeš mít jen něco takového:

public function handleVote($id){
$this->facade->voteComment($id);//zavolá v podstatě jen model a samotné uložení bude tam
$this->redirect('this');
}
bluray
Člen | 178
+
0
-

Děkuji takže do komponenty model přidávám přes DI a a ta obslužná třída je uložena v app/model?

Tomáš Votruba
Moderator | 1114
+
0
-

@bluray Ano, tak jak píšeš. Model stačí uvést v konstruktoru a DI ji při kompilaci předá závislosti sám.

public function __construct(Facade $facade)
{
	$this->facade = $facade;
}