Dynamická definice několika bloků v cyklu
- Filip Procházka
- Moderator | 4668
Ano, přesně tak. Tohle fungovat nebude. Bloky mají nejvyšší prioritu v šabloně a není možné je definovat dynamicky.
Editoval HosipLan (24. 9. 2012 23:54)
- arron
- Člen | 464
Na tohle těžko použiju komponenty, protože tenhle kód má primárně sloužit k dynamickému renderování komponent :-) (ukázku jsem lehce zjednodušil). Čili prostě dostane nějaká data a podle nich to má nadefinovat bloky. Ty jsou staticky definované v layotu, který se té šabloně dynamicky předává. Tenhle kód je má jenom de facto plnit obsahem.
No zkusím najít nějaký workaround, ale bych viděl jako feature request (pokud se mi to nepovede obejít).
- Cifro
- Člen | 245
Niečo podobné som už riešil kedysi. A bola na to rovnaká odpoveď
:-|
https://forum.nette.org/…okov-v-latte
- mkoubik
- Člen | 728
arron napsal(a):
Na tohle těžko použiju komponenty, protože tenhle kód má primárně sloužit k dynamickému renderování komponent :-)
V čem je problém? Komponenty také umí dynamicky renderovat další komponenty. Skus vysvětlit na co tam potřebuješ ty bloky a možná na něco přijdeme.
- arron
- Člen | 464
mkoubik wrote:
Tak to pojďme zkusit :-) Celé to budu zjednodušovat fakt na základní prvky…
Mějme základní šablonu #1, ve které je nadefinovaný layout stránky:
<html>
<head>
<title>{$title}</title>
</head>
<body>
{include #content}
</body>
</html>
Dále mějme šablonu #2, která určuje layout stránky a která dědí od #1:
{block #content}
<div n:inner-block="left" id="left"></div>
<div n:inner-block="center" id="center"></div>
<div n:inner-block="right" id="right"></div>
{/block}
Tahle šablona se dynamicky mění na základě konfigurace dané stránky. Každá podobná šablona má trochu jinou strukturu, třeba jiné rozmístění bloků a tak.
A teď hledám způsob, jak takovouhle šablonu naplnit datama (která jsou uložená v DB, ale v principu je to jedno) tak, abych nemusel psát pro každou šablonu typu #2 zvláštní kód. Což by bylo mohlo ideálně vypadat třeba takhle (#3):
{foreach $content as $blockName => $blockContent}
{block $blockName}
{$blockContent}
{/block}
{/foreach}
Čili v zásadě něco ve smyslu „vem si data, která dostaneš a rozděl je do příslušných bloků“.
#1 definuje základní kostru stránky (a tím i společné prvky a tak)
#2 definuje layout (třísloupcový, dvousloupcový, s bannerem apod) dané stránky a dynamicky se mění/nastavuje
#3 plní data do připraveného prostoru (bloků) a je/mělo by být jedno, co je nad tím.
#3 dědí od #2 a to dědí od #1.
Dává to celé trochu smysl? :-)
- Filip Procházka
- Moderator | 4668
class MyPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->containers = array(
'left-container' => $this['left'],
'main-container' => $this['main'],
'right-container' => $this['right'],
);
}
protected function createComponentLeft()
{
$left = new Nette\ComponentModel\Container;
$left['nav'] = new Navigation;
return $left;
}
protected function createComponentMain()
{
$main = new Nette\ComponentModel\Container;
$main['nav'] = new ArticleControl($this->articleModel);
return $main;
}
protected function createComponentRight()
{
$right = new Nette\ComponentModel\Container;
$right['nav'] = new PoolControl;
return $right;
}
}
{block #content}
<div n:foreach="$containers as $id => $container" id="{$id}">
{foreach $container->components as $component}
{control $component}
{/foreach}
</div>
Tohle je jenom hloupý nástřel. Napsat se to dá lépe a daleko více dynamicky. Komponenty můžeš mít nastavené třeba v databázi a vždy je pro konkrétní stránku vytvořit a nastavit do jednotlivých kontejnerů.