Dynamicky pristup k staticky definovanym blokom v sablone
- Gaprielko
- Člen | 42
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
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
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
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)