Dynamicky pristup k staticky definovanym blokom v sablone

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

Zdravim, davnejsie tu arron riesil Dynamicke definovanie blokov (vid. https://forum.nette.org/…um-v-sablone). Riesim prakticky ten isty problem, t.j. potrebujem dynamicky menit layout aplikacie a tym aj vytvarat jednotlive bloky. Vedel by niekto poradit, ako to riesit? Vdaka.

Filip Procházka
Moderator | 4668
+
0
-

Bloky jsou základní kontrolní prvek šablon. Nejde odpodmínkovat jejich vytvoření, budou vytvořeny vždy. Jediné, co můžeš podmínit, je jejich vykreslení.

Takže doufám už chápeš, že tudy cesta nevede. Řekni nám co máš za problém a vymyslíme lepší řešení.

Gaprielko
Člen | 42
+
0
-

ok, snazim sa vytvorit univerzalnejsie CMS s tym ze jeho zakladom je moznost tvorby vlastnych sablon (a tym padom layoutov) a vlastnych modulov (komponent), ktore budu vkladane do lubovolnych blokov v layoute. Chcem ponechat uplne na uzivatela (administratora) aky layout si vytvori a kolko v nom bude blokov – chcel som, aby definoval len ich nazov a umiestenie v layoute, pricom komponenty do tychto blokov vklada presenter, resp. sama komponenta povie preseteru, do ktoreho bloku sa chce/ma vlozit. Presenter mam jediny, ktory na zaklade definovania, ktora komponenta sa ma v ktorom bloku aktualne vykreslit/prekreslit v sablone dynamicky vytvara dane komponenty.

A trosku z kodu:
Presenter: takto zjednodusene definujem, ktora komponenta sa ma v ktorom bloku vykreslit

array(..) {
   main => array(..) [
      0 => ...\ControlDefinition(2) {
         name private => "PagesTextualPage" (16)
         options private => array(0)
      }
      1 => ...\ControlDefinition(2) {
         name private => "PagesComments" (13)
         options private => array(0)
      }
   ]
   lefter => array(..) [
      0 => ...\ControlDefinition(2) {
         name private => "News" (4)
         options private => array(0)
      }
   ]
}

V presenteri som prepisal metodu createComponent($name) takze v sablone mozem dynamicky pridavat nove komponenty takto:

{block #dynamicContentMain}

{if isset($controls['main'])}
{foreach $controls['main'] as $c}
    {control $c->getName() $c->getOptions()}
{/foreach}
{/if}

{/block}

dufal som, ze by to slo spravit aj takto:

{foreach $controls as $blockName => $c}
	{block #dynamicContent$blockName}
		{if isset($controls['main'])}
		{foreach $controls['main'] as $c}
			{control $c->getName()}
		{/foreach}
		{/if}
	{/block}
{/forach}

s tym, ze pri vkladani daneho bloku by som si overil, ci taky blok existuje

Takto by som si mohol definovat lubovolny pocet blokov a mal by som lubovolne moznosti vkladania komponent do tychto blokov.

Editoval Gaprielko (24. 1. 2012 13:28)

Filip Procházka
Moderator | 4668
+
0
-

Nebylo by lepší, udělat si vlastní makro? Třeba takovéto.

{container leftColumn}

které by se přeložilo na něco jako

<?php $presenter->getCmsComponents('leftColumn')->render(); ?>

Metody getCmsComponents by vracela nějakou tvoji třídu, do které by jsi načetl komponenty, které patří pod takovéto jméno. Zavolání render() by pak v té třídě dělalo něco jako

foreach ($this->components as $component) {
	$component->render();
}

Díky pojmenování by jsi si pak mohl komponenty přiřadit v administraci a rovnou by se správné komponenty vykreslily na správném místě.

Pro uživatele to bude určitě příjemnější, než vymýšlet nějakou magii s bloky :)

Editoval HosipLan (24. 1. 2012 13:58)

Gaprielko
Člen | 42
+
0
-

Vdaka, naozaj vyborna rada! Ani mi to nenapadlo takto to riesit, funguje to super! :)