rozsireni (extend) Controlu vcetne jeho sablony

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

v aplikaci jsem si vyrobil komponentu, ktera rozsiruje Control. tato komponenta reprezentuje jeden zaznam (obrazek v galerii).
obrazek mohu v aplikaci priradit ruznym jinym entitam (clanek, galerie, …) – a pro kazdou entitu je vazebni tabulka trosku jina (ale samozrejme zaklad obrazek-entita je stejny).

napriklad u clanku chci krome samotne vazby ulozit poradi obrazku k clanku, u galerie chci ulozit, zda-li obrazek smi probublat do rodicovskych galerii pri jejich zobrazeni.

moje MediaListItem komponenta ma tedy tridu MediaListItem a sablonu MediaListItem.phtml. jakym zpusobem bych mohl tuto tridu rozsirit? – treba na ArticleMediaListItem, ktera by v sablone pridala na nejake misto nejake HTMLko (select nebo input pro zadani poradi polozky).

v MediaListItem.phtml mam ciste HTML, neni tam zadny {block ...}{/block}

… nechce se mi delat vice komponent vcetne kompletni sablony.

despiq
Člen | 320
+
0
-

ruzne rendery

wdolek
Člen | 331
+
0
-

despiq napsal(a):

ruzne rendery

abych pravdu rekl, moc nerozumim :) mel sem za to, ze to cele funguje tak, ze pri vytvoreni komponenty se automaticky vola render()

class MyControl extends Control {
	public function render() {
		$template = $this->template;
		$template->whatever = 'foo';

		// + nejake nastaveni souboru sablony
	}
}

v presenteru si pak vyrobim

public function createComponentMyControl() {
	return new MyControl();
}

a v sablone presenteru pak proste a jednoduse

{widget MyControl}

… ktera zavola prave fci render()

mno a ja mel na mysli to, jak udelat treba

class MySecondControl extends MyControl {
	public function render() { ... }
}

a zaroven, jak vzit sablonu pro MyControl a neco do ni naklast… stejne, jako to udelam v bezne sablone – treba layoutu a nejaky pohled. v layoutu si vyrobim blok {block fooBar}{/block} a v samotne sablone pak tento blok naplnim {block fooBar}Hello Foo!{/block}… jenze :( komponenty layout-view nemaji :( ..

jasir
Člen | 746
+
0
-

voláš {widget MyControl:paginator} – volá renderPaginator(), viz třeba https://forum.nette.org/…louzi-widget?…

wdolek
Člen | 331
+
0
-

jasir: áha… takze k render() si pridam jeste renderArticle (nebo tak neco) a renderGallery… jen mi ale vrta hlavou, aby to bylo vice DRY – jak rozsirit tu sablonu MyControl.phtml?

  1. muzu pro kazdy renderer udelat vlastni sablonu – ale v sablonach bude 95% stejneho kodu, coz nebude uplne optimalni, zvlast kdyz budu chtit pozmenit HTML – musel bych prepsat vice sablon
  2. muzu pouzit jednu sablonu a jen to tam nejak rozvetvit – v pripade, ze mi pribude vice specifickych zobrazeni to pak ale bude pekny zmatek
Panda
Člen | 569
+
0
-

Co nějak šikovně využít dědičnost bloků? Budeš mít jednu základní šablonu, kde budeš mít {include #name}/{block #name} ... {/block} a pak další šablonu, která bude začínat na {extends ...} a bude jen přepisovat bloky.