předání proměnné mezi komponentami
- ondraLE
- Člen | 23
Zdravím, dělám jednoduchý CMS editor, chci mít kompomenty dle typu
obsahu, např. CMSImage řeší obrázek, CMSHTML řeší html obsah atd..
Definici obsahu načítám z DB, kde jeden z parametrů je ->type (např.
image, html..) Udělal jsem si komponentu CMSBlock a předávám latte šabloně
obj. $def (kde je v ->type název hledané kompomenty).
{control cmsBlock $def}
V presenteru mám:
public function createComponentCmsBlock(): Control
{
$control = new CMSDefinitionControl();
$control->templateDir = dirname($this->template->getFile());
return $control;
}
CMSDefinitionControl.php
class CMSDefinitionControl extends Control
{
public ?string $templateDir = null;
public ?string $fileDir = null;
public DefinitionModel $definition;
public function render(DefinitionModel $definition) : void
{
$this->template->fileDir = $this->fileDir;
$this->definition= $definition;
}
Zde bych mohl ve fci render zjistit typ bloku a podle toho zobrazit příslušnou šablonu, ale jelikož typů je řádově desítky, raději bych pro každý udělal svoji komponentu. Zkoušel jsem tedy v této classe přidat fci
protected function createComponent($name): Control
{
dump($name);
}
s volám {control cmsBlock-HTML $def}
nicméně do createComponent (subkomponenta CMSDefinitionControl) lze předat
jen $name. Podle názvu opět mohu rozparsovat a vrátit příslušnou
komponentu, ale jak zapsat název do latte šablony, když je uložen
v proměnné?
Zkoušel jsem různě závorkovat, spojovat atd.. např:
{control cmsBlock-$def->type}
{control cmsBlock-($def->type)}
{control cmsBlock-'$def->type'}
vrací vždy Unsupported operand types: string – string.
Nějaký nápad jak si předat název subkomponenty z objektu?
Díky.
- nightfish
- Člen | 517
@ondraLE
{control cmsBlock $def}
Pozor na to, že předávání parametrů render metodám komponent nefunguje
v AJAX požadavcích. Lepší je si $def
předat přes konstruktor
(argument create()
metody v továrně).
Zkoušel jsem různě závorkovat, spojovat atd.. např:
{control cmsBlock-$def->type} {control cmsBlock-($def->type)} {control cmsBlock-'$def->type'}
{control 'cmsBlock-' . $def->type}
A možná funguje i
{control cmsBlock-{$def->type}}
- ondraLE
- Člen | 23
nightfish napsal(a):
@ondraLE
{control cmsBlock $def}
Pozor na to, že předávání parametrů render metodám komponent nefunguje v AJAX požadavcích. Lepší je si
$def
předat přes konstruktor (argumentcreate()
metody v továrně).Zkoušel jsem různě závorkovat, spojovat atd.. např:
{control cmsBlock-$def->type} {control cmsBlock-($def->type)} {control cmsBlock-'$def->type'}
{control 'cmsBlock-' . $def->type}
A možná funguje i
{control cmsBlock-{$def->type}}
Díky {control 'cmsBlock-'. $def->type}
funguje!
K předávání, myslíš tedy udělat továrnu na CMS komponenty obecně a
z ní generovat jednotlivé prvky?
Editoval ondraLE (4. 10. 13:45)