Dynamická definice několika bloků v cyklu

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

Ahoj,

dělám něco blbě, nebo tohle fakt fungovat nebude?

{foreach $content as $blockName => $blockContent}
    {block $blockName}
	{$blockContent}
    {/block}
{/foreach}

Díky moc :-)

Filip Procházka
Moderator | 4668
+
0
-

Ano, přesně tak. Tohle fungovat nebude. Bloky mají nejvyšší prioritu v šabloně a není možné je definovat dynamicky.

Použij komponenty.

Editoval HosipLan (24. 9. 2012 23:54)

arron
Člen | 464
+
0
-

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
+
0
-

Niečo podobné som už riešil kedysi. A bola na to rovnaká odpoveď :-|
https://forum.nette.org/…okov-v-latte

mkoubik
Člen | 728
+
0
-

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
+
0
-

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
+
0
-
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ů.

arron
Člen | 464
+
0
-

Není to tak přímočarý, ale moho by to jít nějak vymyslet :-)

Díky, fakt jsem už potřeboval další pohled :-)

Ascaria
Člen | 187
+
0
-

A co tohle?

{define #blok}
    {$bcontent}
{/define}

{foreach $content as $blockContent}
    {include #blok, bcontent => $blockContent}
{/foreach}
Filip Procházka
Moderator | 4668
+
0
-

Ne. Lepší je použít komponenty.